SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅。
1、概念:Eureka 服务发现框架
2、具体内容
对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 ZooKeeper 组件,这个组件里面已经明确的描述了一个服务的注册以及发现操作流程,在整个 Rest 架构里面,会存在有大量的微服务的信息。
在 SpringCloud 之中使用了大量的 Netflix 的开源项目,而其中 Eureka 就属于 Netflix 提供的发现服务组件,所有的微服务在使用之中全部向 Eureka 之中进行注册,而后客户端直接利用 Eureka 进行服务信息的获得。
Eureka 的主要作用实际上和 ZooKeeper 是非常类似的,但是在 SpringCloud 虽然支持有 ZooKeeper,不过从官方的宣传角度来说并不支持这样处理,推荐使用 Eureka,因为速度更快,同时该服务组件是以程序的形式出现的,也就是说你只需要编写一个程序的项目类,而后就可以启动 Eureka 注册服务了。
2.1、定义 Eureka 服务端
1、 为了方便进行统一的微服务的管理,建议创建一个新的项目:microcloud-eureka-7001;
2、 【microcloud-eureka-7001】的 pom.xml 配置文件,追加相应的依赖支持库
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
3、 【microcloud-eureka-7001】现在修改 application.yml 配置文件,在这个配置文件里面主要进行 eureka 服务的定义。
server:
port: 7001
eureka:
instance: # eureak实例定义
hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
4、 【microcloud-eureka-7001】修改 hosts 配置文件,追加 eureka 的映射地址。
127.0.0.1 eureka-7001.com
5、 【microcloud-eureka-7001】修改 Eureka 程序启动类,追加有 Eureka 服务声明的注解@EnableEurekaServer:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class Eureka_7001_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Eureka_7001_StartSpringCloudApplication.class, args); } }
6、 运行程序后通过浏览器执行路径:http://eureka-7001.com:7001/
2.2、向 Eureka 中注册部门微服务
现在 Eureka 已经可以正常启用了,那么随后就需要在项目之中将所有的微服务信息注册到 Eureka 服务之中,那么这样就可以被客户端执行并且调用了。
1、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,追加有 eureka 的相关依赖支持包;
<groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
2、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,在这个配置文件之中主要是定义要进行注册的 Eureka 服务的地址,而这个地址就是 Eureka 的客户端配置。
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://eureka-7001.com:7001/eureka
3、 【microcloud-provider-dept-8001】修改项目的运行主类,在这个主类上追加有 Eureka 客户端的启用注解@EnableEurekaClient
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class Dept_8001_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args); } }
此时由于存在有“@EnableEurekaClient”注解信息,所以当服务启动之后该服务会自动注册到Eureka服务器之中;
4、 【microcloud-provider-dept-8001】修改application.yml配置文件,为此微服务设置一个名字(这个名字将作为日后负载均衡)
spring:
application:
name: microcloud-provider-dept
2.3、Eureka 服务信息
现在虽然成功的实现了微服务的 Eureka 注册,但是所表现出来的微服务的信息并不完整,因为给定的地址信息是你的主机名称,而我们现在是一个自定义的路径地址。
1、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加主机名称的显示:
eureka: client: # 客户端进行Eureka注册的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka instance: instance-id: dept-8001.com # 在信息列表时显示主机名称
重新访问eureka注册中心可以看到服务名称变了
2、 【microcloud-provider-dept-8001】在服务信息查看的时候应该以 IP 地址作为连接项。
eureka: client: # 客户端进行Eureka注册的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka instance: instance-id: dept-8001.com # 在信息列表时显示主机名称 prefer-ip-address: true # 访问的路径变为IP地址
3、 【microcloud-provider-dept-8001】如果现在要想查看所有的微服务详细信息,则需要修改 pom.xml 文件,追加监控配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
4、 【microcloud】修改 pom.xml 文件,追加一个信息匹配的插件:
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimiter>$</delimiter> </delimiters> </configuration> </plugin>
5、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加 info 的相关信息:
info:
app.name: study-microcloud
company.name: www.study.cn
build.artifactId: $project.artifactId$
build.version: $project.verson$
2.4、Eureka 发现管理
在实际的项目运行过程之中需要通过 Eureka 作为所有微服务的监控处理程序,但是对于监控程序那么就必然要面临以下问题:
· 新服务追加的时候应该立刻可以进行注册;
· 当某一个服务下线之后应该可以进行清理;
1、 【microcloud-eureka-7001】设置服务的清理间隔,修改 application.yml 配置文件
eureka:
server:
eviction-interval-timer-in-ms: 60000 # 设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://eureka-7001.com:7001/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
一旦配置了清理的间隔为 1 秒的时间,则会在每秒的时候进行一次服务的清理过程
一般情况下,该配置不建议进行修改,默认就是 60 秒,也就是说你的微服务如果 60 秒没有心跳了,那么就认为可以清理掉。
2、 【microcloud-eureka-7001】在 Eureka 里面有一个问题,这个问题就是它默认支持有保护模式的概念,所谓的保护模式指的是 即便现在某一个微服务不可用了,eureka 不会清理,依然会进行该微服务信息的保存。
如果现在要想去改变这种保护模式的启用,则可以修改 application.yml 配置文件:
eureka:
server:
enable-self-preservation: true # 设置为false表示关闭保护模式
eviction-interval-timer-in-ms: 60000 # 设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://eureka-7001.com:7001/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
理论上只有关闭了保护模式之后才可以进行无效微服务的清理操作,但是很多时候 Eureka 里面也会自带有清除过程。
3、 【microcloud-provider-dept-8001】微服务客户端之所以可以与 Eureka 之间保持联系,依靠的是心跳机制,也就是说你客户端 可以自己来进行心跳的配置处理,修改 application.yml 配置文件:
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://eureka-7001.com:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: dept-8001.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
由于所有的服务都注册到了 Eureka 之中,这样如果配置了“lease-expiration-duration-in-seconds”此选项,表示距 离上一次发送心跳之后等待下一次发送心跳的间隔时间,如果超过了此间隔时间,则认为该微服务已经宕机了。
4、 【microcloud-provider-dept-8001】现在对于注册到 Eureka 上的微服务端也可以通过发现服务来进行一些服务信息的获取,修 改 DeptRest 程序类,追加一个控制调用方法:
package cn.study.microcloud.rest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import cn.study.microcloud.service.IDeptService; import cn.study.vo.Dept; @RestController public class DeptRest { @Resource private IDeptService deptService ; @Resource private DiscoveryClient client ; // 进行Eureka的发现服务 @RequestMapping("/dept/discover") public Object discover() { // 直接返回发现服务信息 return this.client ; } @RequestMapping("/dept/sessionId") public Object id(HttpServletRequest request) { return request.getSession().getId() ; } @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET) public Object get(@PathVariable("id") long id) { return this.deptService.get(id) ; } @RequestMapping(value="/dept/add",method=RequestMethod.POST) public Object add(@RequestBody Dept dept) { return this.deptService.add(dept) ; } @RequestMapping(value="/dept/list",method=RequestMethod.GET) public Object list() { return this.deptService.list() ; } }
5、 【microcloud-provider-dept-8001】在主程序之中加上注解@EnableDiscoveryClient启用 Eureka 发现服务项:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class Dept_8001_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args); } }
6、 输入访问地址:http://dept-8001.com:8001/dept/discover
{"services":[],"localServiceInstance":{"host":"192.168.31.247", "port":8001,"secure":false,"serviceId":"microcloud-provider-dept","metadata":{},"uri":"http://192.168.31.247:8001"}}
2.5、Eureka 安全配置
现在已经成功的实现了一个 Eureka 的服务启动以及微服务的注册配置操作,但是现在的程序有一个问题,你自己公司的 Eureka 服务应该可以注册的服务只能够是满足于认证要求的微服务,所以这样一来在之前所进行的 Eureka 里面配置缺少关键性的一步: 安全认证,所以应该为 Eureka 配置上安全认证处理。
1、 【microcloud-eureka-7001】修改 pom.xml 配置文件,引入 SpringSecurity 的依赖包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2、 【microcloud-eureka-7001】一旦我们的项目之中导入了 Security 开发包,则每一次启动微服务的时候都会自动生成一个密码, 而这个密码由于会改变,所以一般都不使用,所以要修改 application.yml 配置文件,追加密码的配置项:
server:
port: 7001
security:
basic:
enabled: true # 启用安全认证处理
user:
name: edmin # 用户名
password: studyjava # 密码
spring:
application:
name: microcloud-eureka-7001
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
此时访问 eureka 的服务地址为:http://edmin:studyjava@eureka-7001.com:7001/
3、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,进行授权的注册连接:
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: dept-8001.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
2.6、Eureka-HA(高可用) 机制
现在已经成功的实现了一个 Eureka 服务器,但是现在属于单节点的服务运行过程,如果说现在单节点的 Eureka 出现了错误, 导致无法使用,那么对于所有的微服务的架构就将出现整体的瘫痪,就需要进行 Eureka 集群搭建,同时利用集群可以有效的实现 HA 的处理机制,如果要进行集群的搭建一定要选择两台或以上的电脑完成,而基本的流程如下:
说明:Eureka集群是两两相互注册,当然了传递注册也是可以实现集群的
1、 修改 hosts 配置文件进行多个主机名称的定义:
127.0.0.1 eureka-7001.com
127.0.0.1 eureka-7002.com
127.0.0.1 eureka-7003.com
2、 【 microcloud-eureka-7001 】 为 了 方 便 进 行 Eureka 操 作 , 建 议 将 “ microcloud-eureka-7001 ”的进行复制,复制为 “microcloud-eureka-7002”、“ microcloud-eureka-7003”。
3、 【microcloud-eureka-7001】修改 application.yml 配置文件,这个配置文件主要注意端口号以及 Eureka 服务注册位置;
server:
port: 7001
security:
basic:
enabled: true # 启用安全认证处理
user:
name: edmin # 用户名
password: studyjava # 密码
spring:
application:
name: microcloud-eureka-7001
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
4、 【microcloud-eureka-7002】修改 application.yml 配置文件:
server:
port: 7002
security:
basic:
enabled: true # 启用安全认证处理
user:
name: edmin # 用户名
password: studyjava # 密码
spring:
application:
name: microcloud-eureka-7002
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7002.com # 定义Eureka实例所在的主机名称
5、 【microcloud-eureka-7003】修改 application.yml 配置文件:
server:
port: 7003
security:
basic:
enabled: true # 启用安全认证处理
user:
name: edmin # 用户名
password: studyjava # 密码
spring:
application:
name: microcloud-eureka-7003
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7003.com # 定义Eureka实例所在的主机名称
6、 启动所有的 eureka 服务,而后进入到每一个服务的后台去观察运行的副本效果:
· 登录 7001 控制台:http://edmin:studyjava@eureka-7001.com:7001/;
· 登录 7002 控制台:http://edmin:studyjava@eureka-7002.com:7002/;
· 登录 7003 控制台:http://edmin:studyjava@eureka-7003.com:7003/。
7、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,进行多台主机注册:
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: dept-8001.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
2.7、Eureka 服务打包部署
现在已经成功的实现了 Eureka 编写,但是在实际的运行之中,需要将 Eureka 发布到具体的服务器上进行执行,而这就需要对 项目进行打包处理,同样在进行打包处理的时候也必须考虑到项目的各种环境:开发(dev)、测试(beta)、生产(product),那么 下面也将基于这样的方式进行 eureka 项目打包操作。
本次的打包处理将直接基于 yml 配置文件完成,对于 properties 配置与 SpringBoot 讲解微服务发布的处理过程一样。
1、 【microcloud-eureka-server】修改 application.yml 配置文件
spring:
profiles:
active:
- dev-7001
---
spring:
profiles: dev-7001
application:
name: microcloud-eureka-7001
server:
port: 7001
security:
basic:
enabled: true # 启用安全认证处理
user:
name: edmin # 用户名
password: studyjava # 密码
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
---
spring:
profiles: dev-7002
application:
name: microcloud-eureka-7002
server:
port: 7002
security:
basic:
enabled: true # 启用安全认证处理
user:
name: edmin # 用户名
password: studyjava # 密码
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7002.com # 定义Eureka实例所在的主机名称
---
spring:
profiles: dev-7003
application:
name: microcloud-eureka-7003
server:
port: 7003
security:
basic:
enabled: true # 启用安全认证处理
user:
name: edmin # 用户名
password: studyjava # 密码
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-7003.com # 定义Eureka实例所在的主机名称
2、 【microcloud-eureka-server】添加一个打包的处理插件,修改 pom.xml 配置文件:
<build> <finalName>eureka-server</finalName> <plugins> <plugin> <!-- 该插件的主要功能是进行项目的打包发布处理 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 设置程序执行的主类 --> <mainClass>cn.study.microcloud.Eureka_StartSpringCloudApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3、 运行 maven:clean install package;
随后就可以在项目的目录之中发现生成的“eureka-server.jar”文件。
4、 采用默认的方式执行 eureka-server.jar,那么此时将运行在 7001 端口上:java -jar eureka-server.jar
5、 运行其它的两个 profile 配置:
· 运行“dev-7002”profile:java -jar eureka-server.jar --spring.profiles.active=dev-7002;
· 运行“dev-7003”profile:java -jar eureka-server.jar --spring.profiles.active=dev-7003。