一、Eureka简介
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。
二、Eureka原理
下图就是Eureka官方的架构图,大致描述了Eureka集群的工作过程。
Application Service: 也就是服务提供者(相当于我之前文章中的用户微服务)
Application Client: 也就是服务消费者(相当于我之前文章中的车票微服务)
Make Remote Call: 可以简单理解为调用RESTful的接口
Eureka包含两个组件:Eureka Server 和 Eureka Client。
Eureka Server: 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client: 是一个Java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
- 在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka
Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。 - Eureka Server之间将会通过复制的方式完成数据的同步。
- Eureka还提供了客户端缓存的机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
- 综上,Eureka通过心跳检测、健康检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
三、实现Eureka Server
3.1 创建父工程(Eureka-parent)
3.1.1 新建一个Maven Project
3.1.2 pom文件中导入依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud</groupId>
<artifactId>eureka-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<!-- 导入Spring Cloud的依赖管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--springboot 整合eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2 创建子工程(Eureka-Server)
右键 eureka-parent --> new priject -->选择Maven Module
3.3 编写启动类
在eureka-server下的src/main/java 下创建一个package(com.eureka.server),新建一个EurekaServerApplication类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3.4 配置application.properties
在resources下创建application.properties配置文件,进行配置
eureka.client.register-with-eureka = false: eureka复制模式是对等复制,所以当服务启动时会根据service-url地址去进行注册,而当前是单机模式而非集群,service-url的值为自身的路径,这时就会出现自己注册自己的情况,从而就会出现(com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect)无法连接的错误,因为默认值是true所以当单机环境下,需要设置为false。
register-with-eureka: = false:是否从Eureka中获取注册信息,因为当前为单机模式自己为注册中心,不会在该应用中的检索服务信息所以这里也需要设置为false.
# 配置api端口号
server.port=8761
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称
spring.application.name=eureka-server
# 设置当前实例的主机名称
eureka.instance.hostname=localhost
# 是否启动注册
eureka.client.register-with-eureka=false
# 是否检索服务
eureka.client.fetch-registry=false
# 服务注册中心的地址
eureka.client.service-url.default-zone=http://localhost:8761/eureka
3.5 启动 Eureka-server
右键EurekaServerApplication --> run as --> Spring Boot App
启动好之后,访问http://localhost:8761/,进入如下页面Eureka就正常启动了
四、将微服务注册到Eureka
4.1 修改pom文件
找到之前编写的用户微服务和车票微服务的父工程microservice-parent的pom文件加入如下两段依赖,注意这里我们稍微有一点修改version版本改为了2.0.3,是为了和org.springframework.cloud的版本Finchley.SR4相匹配。(这两个微服务的编写请参考我的另一篇博客使用Spring cloud实现微服务最简单的入门demo)
修改pom文件后如果项目报错就右键 --> Maven -->update project之后就好了
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<groupId>com.springcloud</groupId>
<artifactId>microservice-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>microservice-provide-user</module>
<module>microservice-consumer-ticket</module>
</modules>
<dependencyManagement>
<dependencies>
<!-- 导入Spring Cloud的依赖管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- web支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springboot 整合eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- springboot插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2 修改application.properties
4.2.1 修改用户微服务的配置文件
# 配置api端口号
server.port=8081
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称,也就是在eureka
spring.application.name=microservice-provide-user
# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
eureka.client.service-url.default-zone=http://localhost:8761/eureka
4.2.2 修改车票微服务的配置文件
# 配置api端口号
server.port=8082
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称,也就是在eureka
spring.application.name=microservice-consumer-ticket
# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
eureka.client.service-url.default-zone=http://localhost:8761/eureka
4.3 修改启动类
4.3.1 修改用户微服务的启动类
4.3.2 修改车票微服务的启动类
4.4 启动服务进行测试
4.4.1 启动 EurekaServer
4.4.2 启动 UserServer
4.4.3 启动 TicketServer
4.4.4 访问http://localhost:8761
可以看到我们的两个微服务,用户微服务和车票微服务都已经出现在了Eureka服务注册中心了。
五、解决车票微服务中的硬编码问题
问题回顾:之前我们在TicketService中的 url是写死的,而我们现在有了Eureka,就可以去Eureka中查询服务地址了。
5.1 修改车票微服务启动类,添加负载均衡的注解
这样其实就是整合了Ribbon,restTemplate就具备了负载均衡的能力。这里没有单独去添加ribbon的依赖是因为 eureka的依赖中就包含了ribbon,所以可以直接使用。关于更多ribbon的讲解我会有另一篇博客,这里就直接使用了。
5.2 修改service中的方法实现
5.2.1 将地址和端口用我们之前在用户微服务的application.properties中设置的服务名称替换
5.2.2 启动服务进行测试
访问车票微服务中的接口地址 http://localhost:8082/getTicketInfo/1,可以看到成功查询出了用户信息,说明硬编码问题得到了解决
六、Eureka添加用户认证
6.1 pom文件中添加依赖
我们打开eureka-parent的pom依赖文件,添加如下图所示的安全认证依赖即可
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud</groupId>
<artifactId>eureka-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<!-- 导入Spring Cloud的依赖管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--springboot 整合eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--eureka安全认证-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<modules>
<module>eureka-server</module>
</modules>
</project>
6.2 修改application.properties配置文件
加入用户名和密码的配置,并且修改服务注册的地址
# 配置api端口号
server.port=8761
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称
spring.application.name=eureka-server
# 登录的用户名和密码
spring.security.user.name=zzz
spring.security.user.password=123456
# 设置当前实例的主机名称
eureka.instance.hostname=localhost
# 是否启动注册
eureka.client.register-with-eureka=false
# 是否检索服务
eureka.client.fetch-registry=false
# 服务注册中心的地址
#eureka.client.service-url.default-zone=http://localhost:8761/eureka
eureka.client.service-url.default-zone=http://zzz:123456@localhost:8761/eureka
6.3 编写Eureka安全认证类
编写 WebSecurityConfig类和Eureka启动类放在同级目录下
package com.eureka.server;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//2.1版本的security默认加上了 csrf拦截, 所以需要通过重写方法把csrf拦截禁用,否则服务无法注册
http.csrf().disable();
//为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
//高版本的Springcloud废弃了 spring.security.basic.enabled注解,所以需要通过如下方式开启
//不加上这个的话,就会以form表单的形式进行提交
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
6.4 启动eureka服务进行测试
访问http://localhost:8761,可以看到已经弹出了登录框
如果出现如下图所示的这种就说明不是以http basic而是form表单的形式
输入之前配置的用户名和密码进行登录即可
6.5重新启动微服务进行注册
6.5.1 修改用户微服务的配置文件,修改注册地址
按照eureka配置中的地址进行修改
# 配置api端口号
server.port=8081
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称,也就是在eureka
spring.application.name=microservice-provide-user
# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
#eureka.client.service-url.default-zone=http://localhost:8761/eureka
eureka.client.service-url.default-zone=http://zzz:123456@localhost:8761/eureka
6.5.2 修改车票微服务的配置文件,修改注册地址
按照eureka配置中的地址进行修改
# 配置api端口号
server.port=8082
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称,也就是在eureka
spring.application.name=microservice-consumer-ticket
# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
#eureka.client.service-url.default-zone=http://localhost:8761/eureka
eureka.client.service-url.default-zone=http://zzz:123456@localhost:8761/eureka
6.5.3 启动服务进行测试
这里我遇到了服务无法注册的情况,返回的状态码是401。对比很多的解决方法我的配置应该是没有问题的。我也尝试了许多网上的方法都没有成功,如果哪位大神发现问题所在,欢迎评论区留言告诉我,十分感谢。
来源:CSDN
作者:.Zheng
链接:https://blog.csdn.net/showadwalker/article/details/104104911