深入学习springCloud——服务注册中心之eureka

1.Eureka基础知识
2.单机Eureka构建步骤
3.集群Eureka构建步骤
4.actuator微服务信息完善
5.Eureka自我保护
6.Eureka的停更说明
7.Eureka停更了怎么办
1.Eureka基础知识
1.1)eureka是什么
单体架构时代:
在我们刚刚开始学习JAVA开发的时候,所有的功能都会被放在一个spring项目里面,每次项目迭代,发布服务,都会让整个应用不可用,而且随着项目越来越大,启动也越来越慢,而且开发团队在开发周期中要实现的功能越来越多,当原来的单体应用运行维护几年之后,一个小而简单的应用会长成一个庞然大物。
一旦一个应用越做越大,整个团队的开发,持续部署,技术升级,可靠性等都会降低。此时,微服务架构就出现了,他就是为了来解决掉上述的问题的。
微服务架构时代:
通过将一个巨大的单体应用拆分,根据功能模块拆分成一个个小的服务,各自发布,各自升级,出问题了只需要修理自己那一部分的服务就行了,可靠性,开发效率也会提升。
深入学习springCloud——服务注册中心之eureka
文章图片

1.2)什么是服务注册中心
当一个服务被拆分成了多个服务,此时服务就会有调用者和被调用者两种角色,那么调用者如何正确地调用到自己想要的服务,此时就需要一个服务注册中心来维护这些全部的服务。
Eureka Server作为服务注册中心,其它系统中的服务,使用eureka的客户端连接到Eureka Server并保持心跳连接,这样维护人员就可以通过Eureka server来监控系统中各个服务是否正确运行。
有了注册中心,当服务启动的时候,会把当前服务器的信息,比如服务名,通讯ip地址等以别名的方式注册到注册中心上,其它服务(消费者|生产者),以注册表的形式获取到注册中心上的所有服务地址,然后再进行调用。所以注册中心就是微服务调用的核心。
深入学习springCloud——服务注册中心之eureka
文章图片

1.3)Eureka两组件
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供注册服务
各个微服务节点通过配置成功启动后,就会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面里直观地看到。
Eureka Client通过注册中心提供访问调用
Eureka Client用于简化和Eureka server的交互,客户端同时也内置轮询等负载均衡算法,来通过一定的策略访问服务提供者。在应用启动后,将会向Eureka Server发送心跳(默认30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务移除(默认90秒)。
2.单机Eureka构建步骤
我们先创建一个springWeb项目:
深入学习springCloud——服务注册中心之eureka
文章图片

修改一下pom文件

4.0.0org.springframework.boot spring-boot-starter-parent 2.6.6 com.example eureka-8001 0.0.1-SNAPSHOT eureka-8001 Demo project for Spring Boot1.8 2021.0.1 org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-maven-plugin

关于springCloud和springBoot版本的选择,我们可以登录官网https://spring.io/projects/sp...
深入学习springCloud——服务注册中心之eureka
文章图片

因为我们springBoot是2.6.x版本,那么对应的springCloud选择2021.0.x版本就行了。
也可以访问https://start.spring.io/actua...,有更详细的结果。
yml文件:
server: port: 8001eureka: instance: hostname: eureka1 #eureka服务端的实例名称 client: #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用) #false表示不向注册中心注册自己 register-with-eureka: false #true要从其它eureka中获取注册表信息 #false表示自己端就是注册中心,不需要去注册表中检索服务 fetch-registry: false

启动类注解加上@EnableEurekaServer
@SpringBootApplication @EnableEurekaServer public class DemoApplication {public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}

此时再启动服务,eureka就完成启动了!
深入学习springCloud——服务注册中心之eureka
文章图片

深入学习springCloud——服务注册中心之eureka
文章图片

当注册中心启动的时候,别的服务来注册,总体流程是这样的:
1)先启动服务注册中心
2)启动服务提供者,消费者服务
3)服务提供者,消费者服务启动后会把自身信息以别名的方式注册进eureka
4)消费者服务在需要调用接口的时候,使用服务别名去注册中心获取远程rpc调用地址
5)消费者获得地址后,底层是利用httpClint技术实现远程调用
6)消费者或者服务地址后,缓存在本地jvm中,默认隔30秒更新一次服务调用地址。
3.集群Eureka构建步骤
我们仔细思考一下,现在所有服务都依赖于我们的注册中心,都需要服务注册中心进行调度和治理,如果服务注册中心出现故障,就会导致整个微服务环境不可用,所以注册中心也得保证高可用,得是集群模式的,我们来搭建一个试试。
其实搭建eureka集群很简答,先改一下yml文件:
eureka-8001服务:
server: port: 8001eureka: instance: hostname: eureka1 #eureka服务端的实例名称 client: #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用) #false表示不向注册中心注册自己 register-with-eureka: true #true要从其它eureka中获取注册表信息 #false表示自己端就是注册中心,不需要去注册表中检索服务 fetch-registry: true service-url: #集群指向其它eureka,有几个注册中心,就写几个eureka defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/ spring: application: name: eureka-8001

再复制一个项目,起名为eureka-8002,改一下pom文件中的名字,yml文件:
server: port: 8002eureka: instance: hostname: eureka2 #eureka服务端的实例名称 client: #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用) #false表示不向注册中心注册自己 register-with-eureka: true #true要从其它eureka中获取注册表信息 #false表示自己端就是注册中心,不需要去注册表中检索服务 fetch-registry: true service-url: #集群指向其它eureka defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/ spring: application: name: eureka-8002

然后把两个服务启动一下,就可以看出服务注册中心已经启动且互相注册了
【深入学习springCloud——服务注册中心之eureka】深入学习springCloud——服务注册中心之eureka
文章图片

4.actuator微服务信息完善
虽然我们的集群已经启动成功,但是服务的status显示的却是localHost,是服务器的名称,我们在生产上部署,通过服务器的名字,很难看出这个服务部署在哪一台服务器上,我们一般是用ip+端口的形式进行展示,同时也更加容易维护。
eureka1的yml:
server: port: 8001eureka: instance: hostname: eureka1 #eureka服务端的实例名称 prefer-ip-address: true #访问路径可以显示IP地址 instance-id: ${spring.cloud.client.ip-address}:${server.port}-eureka1 #访问路径的名称格式 client: #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用) #false表示不向注册中心注册自己 register-with-eureka: true #true要从其它eureka中获取注册表信息 #false表示自己端就是注册中心,不需要去注册表中检索服务 fetch-registry: true service-url: #集群指向其它eureka defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/ spring: application: name: eureka-8001

eureka2的yml:
server: port: 8002eureka: instance: hostname: eureka2 #eureka服务端的实例名称 prefer-ip-address: true #访问路径可以显示IP地址 instance-id: ${spring.cloud.client.ip-address}:${server.port}-eureka2 #访问路径的名称格式 client: register-with-eureka: true#false表示不向注册中心注册自己。 fetch-registry: true#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: #集群指向其它eureka defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/ spring: application: name: eureka-8002

深入学习springCloud——服务注册中心之eureka
文章图片

这样显示就友好地多了。
5.Eureka自我保护
首先我们看一下,什么是eureka的自我保护:
在默认的情况下,如果Eureka 在一定的时间内没有接受到某个微服务实例的心跳,Eureka就会注销该实例(默认90秒),当网络震荡发生的时候(延时,卡顿,拥挤等等),服务与eureka无法正常通信,虽然微服务本身是健康的,但是服务却会被eureka从注册表中移除,虽然此时这个服务不应该被注册。Eureka通过"自我保护机制",来解决这个问题,当eureka节点在短时间内丢失节点(可能是网络震荡),那么这个节点就会进入自我保护模式。
在自我保护模式中,Eureka会保护服务注册表中的所有信息,不再注销任何服务实例。
它的设计哲学就是宁可保留错误的服务注册信息,也不会盲目注销任何可能的健康的服务实例。
综上,自我保护模式是一种应对网络异常的安全保护措施,它的架构哲学是宁可保留所有的微服务,也不会盲目地注销任何健康的微服务(健康的和不健康的都会被保留),可以让eureka维护的服务更加地稳定,本质上是一种AP的思想。
如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式,也就是说,eureka自我保护默认是开启的:
深入学习springCloud——服务注册中心之eureka
文章图片

server: port: 8001eureka: instance: hostname: eureka1 #eureka服务端的实例名称 prefer-ip-address: true #访问路径可以显示IP地址 instance-id: ${spring.cloud.client.ip-address}:${server.port}-eureka1 #访问路径的名称格式 client: #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用) #false表示不向注册中心注册自己 register-with-eureka: true #true要从其它eureka中获取注册表信息 #false表示自己端就是注册中心,不需要去注册表中检索服务 fetch-registry: true service-url: #集群指向其它eureka defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/ server: enable-self-preservation: false #关闭自我保护 eviction-interval-timer-in-ms: 5000 #超时时间为5秒 spring: application: name: eureka-8001

深入学习springCloud——服务注册中心之eureka
文章图片

此时就关闭了自我保护。
6.Eureka的停更说明
上面我们说了这么多eureka的事情,但是eureka的2.x版本这个组件已经停止更新了。
深入学习springCloud——服务注册中心之eureka
文章图片

7.Eureka停更了怎么办
eureka停止更新了,其实不用慌张,还会有替代的产品,比如zk,consul,nacos等等,我们会在后续的博客进行讲解。

    推荐阅读