前言
前段时间业务工作太忙,很久没有学习技术了~ 碰巧前几天工作中遇到一个问题需要研究注册中心和 OpenFeign
源码才能解决,由于 OpenFeign
源码我已经比较熟悉了,所以今天来分享一下 Eureka Client
向 Server
注册实例的原理。只有懂原理才能进行扩展,对项目进行不断优化。
也许很多人会说 Eureka
已经过时了,我又何尝不知道相对来说 Nacos
更好用,而且 Eureka
已经不更新了,但是没有办法呀,公司用的就是 Eureka
。不过大体思想都是相同的,只是 Nacos
在 Eureka
的基础上做了一些优化让服务注册中心更加完善。读完 Eureka
源码还会怕 Nacos
么?
注册中心简介
回想微服务架构流行之前,在没有注册中心的时候两个系统的交互通常是通过 http 请求远程调用。这样会存在一些问题,需要写死服务提供方的 ip端口或者域名。随着业务规模发展,系统应用越来越多,复杂的业务交互让我们每个应用都不得不维护其他应用的ip端口信息。
假设有上图的九个应用,由于他们之间都可能存在交互,那么每个应用都要在自己本地写一份其他八个应用的地址端口信息,这无疑给维护带来巨大的工作量。如果每个系统都有域名的话还好,互相写死域名地址就行,新增实例的时候只需要在 Nginx 配置文件添加负载均衡节点就行。
如果系统没有域名那就苦逼了,每个服务都得存其他应用的 IP端口信息
private Map<String,List<InstanceInfo>> map; //key 是应用名,value 是实例集群
新增、减少实例的时候也得去改动这个 map
,那么最简单的方式就是把这个 map 从配置文件 application.yml
读取,方便动态修改。但是每个应用都得这样操作无疑也是很大的工作量,于是我们想是否可以将所有应用的实例信息放在一个公共的地方来维护,于是服务注册中心诞生了。
服务注册中心就是解决这个问题的,独立出一个单独的微服务来存储所有微服务应用的实例信息,并且它是存储在内存中,当微服务上线、下线的时候实时修改这份共享的数据,确保客户端来这里查询其他服务实例信息的时候能够获取到最准确的信息。
搭建 Eureka Server
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
复制代码
配置文件
eureka:
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 5000
instance:
hostname: localhost
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动类添加 @EnableEurekaServer
搭建 Eureka Client
引入 Eureka Client
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
eureka:
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
lease-expiration-duration-in-seconds: 15 #eureka服务收到最后一次心跳后等待时间上限,默认值 90
lease-renewal-interval-in-seconds: 10 #向eureka服务发送心跳的时间间隔,默认值 30
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/ # eureka server 地址
registry-fetch-interval-seconds: 3 #3秒钟去eureka拿一次微服务注册实例,默认值 30
老版本还需要在启动类使用 @EnableEurekaClient
注解,新版本中可以省略。这样一个 Eureka Client
就完成了。
可以发现 Eureka
的