Eureka - 微服务注册中心
注册中心
为什么需要注册中心?
传统单体应用中,所有的业务都集中在同一个项目里。浏览器发来请求时,直接发送至后端,后端再调用业务逻辑给前端作出响应,完成一次调用。由于整体就是一个项目,所以没有必要引入服务中心来完成服务之间的周转。
在微服务架构中,将系统进行了拆分,例如:一个电商项目,可拆分为订单模块、物流模块、支付模块等。用户发送的请求需要各个模块之间的协作,各模块之间相互调用,各个模块之间的关系越来越复杂,各模块代码之间强耦合较强。为了解决这一问题,引入了注册中心这一概念。
Eureka
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud中封装了Eureka,在Eureka的基础上,优化了一些配置,并提供了可视化界面,可以方便查看服务注册情况及服务注册中心集群的运行情况。
Eureka由两大核心组件
- Eureka Server:服务端,也就是注册中心,用于接受服务的注册
- Eureka Client:客户端是一个Java客户端,用于注册,简化了与Eureka Server的交互,并自动实现负载均衡等功能
Eureka Server主要对外提供了三个功能:
1.服务注册,所有的服务都注册到Eureka Server.上面来
2.提供注册表,注册表就是所有注册上来服务的一一个列表, Eureka Client在调用服务时,需要获取这个注册表,一般来说, 这个注册表会缓存下来,如果缓存失效,则直接获取最新的注册表
3.同步状态,Eureka Client通过注册、心跳等机制,和Eureka Server同步当前客户端的状态
Eureka Client主要是用来简化每一个服务和Eureka Server之间的交互。Eureka Client会自动拉取、更新以及缓存Eureka Server中的信息,这样,即使Eureka Server所有节点都宕机,Eureka Client依然能够获取到想要调用服务的地址(但是地址可能不准确)。
Eureka Client的主要功能有:
1.服务注册:服务提供者将自己注册到服务注册中心(Eureka Server),需要注意,所谓的服务提供者,只是一个业务上.上的划分,本质上他就是一个Eureka Client。当Eureka Client 向Eureka Server注册时,他需要提供自身的一-些元数据信息,例如IP地址、端口、名称、运行状态等等。
2.服务续约:Eureka Client 注册到Eureka Server.上之后,事情没有结束,刚刚开始而已。注册成功后,默认情况下,Eureka CLient每隔30秒就要向Eureka Server发送一条心跳消息, 来告诉Eureka Server我还在运行。如果Eureka Server连续90秒都有没有收到Eureka Client 的续约消息(连续三次没发送),它会认为Eureka Client已经掉线了,会将掉线的Eureka Client从当前的服务注册列表中剔除。
服务续约有两个相关属性(一般不建议修改)
#服务续约时间,默认30秒
eureka.instance.lease-renewal-interval-in-seconds=30
#服务下线时间,默认90秒
eureka.instance.lease-expiration-duration-in-seconds=90
3.服务下线:当Eureka Client下线时,它会主动发送一条消息, 通知Eureka Server服务已下线。
4.获取注册表信息:Eureka Client从Eureka Server.上获取服务的注册信息,并将其缓存在本地。本地客户端,在需要调用远程服务时,会从该信息中查找远程服务所对应的IP地址、端口等信息。Eureka Client .上缓存的服务注册信息会定期更新(30秒),如果Eureka Server返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client会自动处理。
这里,也涉及到两个属性
#是否允许获取注册表信息
eureka.client.fetch-registry=false
#服务注册信息定期更新的时间间隔,默认30秒
eureka.client.registry-fetch-interval-seconds=30
从图中可以看出,Eureka中有三个角色:
1.服务注册中心
2.服务提供者
3.服务消费者
Eureka基本搭建
Eureka本身是使用java开发的,Spring Cloud使用Spring Boot技术对Eureka进行了封装,在Spring Cloud中使用Eureka只需要引入
spring-cloud-starter-netflix-eureka-server依赖,就可以像启动一个普通Spring Boot项目一样启动Eureka。
1.创建项目
创建Maven项目cloud-demo,删除src文件,新建一个Model选择Spring Boot项目,创建时勾选依赖Eureka Server
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
创建成功后,在项目启动类EurekaApplication上添加@EnableEurekaServer注解,开启Eureka功能。
在application。properties中添加Eureka基本配置信息
#给当前服务命名
spring.application.name=eureka
#设置端口号
server.port=1111
#设置Eureka Server不被注册
eureka.client.register-with-eureka=false
#是否从Eureka Server上获取注册信息
eureka.client.fetch-registry=false
#配置注册中心地址
eureka.instance.hostname=localhost
默认情况下Eureka Server也是一个普通的微服务,所以当他是一个注册中心时会拥有两个身份:1.注册中心 2.普通服务。这就说明该服务中心会将自身注册到服务中心上。因此要使用
“eureka.client.register-with-eureka=false”这一配置,声明当前模块不被注册到注册中心上。
项目搭建完成,运行项目。访问设置的端口1111,即可访问Eureka的控制台
Eureka集群搭建
使用了注册中心之后,所以服务都要通过服务注册中心进行信息交换。所以要保证服务注册中心的稳定性。否则,一旦注册中心掉线就会影响整个系统运行。所以在实际开发中,Eureka一般以集群形式出现。
在这个集群架构中,Eureka Server之间通过Replicate进行数据同步,不同的Eureka Server之间不区分主从节点,所有节点都是平等的。节点之间,通过置顶serviceUrl来互相注册,形成一个集群,进而提高节点的可用性。
在Eureka Server集群中,如果有某个节点宕机,Eureka Client会自动切换到新的Eureka Server上。每一个Eureka Server节点,都会互相同步数据。Eureka Server的连接方式,可以是单线的,就是A-->b-->C,此时,A的数据也会和C之间互相同步。但是一般不建议这种写法,在配置serviceUrl时,可以指定多个注册地址,即A可以即注册到B.上,也可以同时注册到C上。
Eureka分区:
region:地理.上的不同区域
zone:具体的机房
Eureka集群,实际上就是启动多个Eureka实例,各个Eureka实例相互注册,相互同步数据,共同组成一个集群
搭建Eureka集群
1.修改hosts文件
添加映射“127.0.0.1 eurekaA eurekaB”
2.添加配置文件
在resource目录下再添加两个配置文件,分别为application-a.properties和
application-b.properties用来配置Eureka集群
application-a.properties
#给当前服务命名
spring.application.name=eureka
#设置端口号
server.port=1111
#命名新的服务,注册到服务中心
eureka.instance.hostname=eurekaA
#设置Eureka Server可以被注册
eureka.client.register-with-eureka=true
#是否从Eureka Server上获取注册信息
eureka.client.fetch-registry=true
#将A服务注册到B服务上
eureka.client.service-url.defaultZone=http://eurekaB:1112/eureka
application-b.properties
#给当前服务命名
spring.application.name=eureka
#设置端口号
server.port=1112
#命名新的服务,注册到服务中心
eureka.instance.hostname=eurekaB
#设置Eureka Server可以被注册
eureka.client.register-with-eureka=true
#是否从Eureka Server上获取注册信息
eureka.client.fetch-registry=true
#将B服务注册到A服务上
eureka.client.service-url.defaultZone=http://eurekaA:1111/eureka
配置完成后将项目打包,完成后启动两个Eureka实例
启动命令:
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=a
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=b
进入Eureka的控制台可以看到,eurekaA和eurekaB相互注册,共同构成一个集群。