【微服务】注册中心的设计和实现
当项目由单体结构拆分成一个个的服务,服务之间由本地调用转变成远程调用的时候,我们可以看成是通过一个个的url去获取数据。调用方和被调用方需要知道彼此的状态才可互相通信,而注册中心正是屏蔽了他们之间的状态信息,使得服务之间不需要维护彼此的数据信息,可专注于业务实现。
服务的注册和发现是注册中心最基本的功能,注册中心实现服务治理,管理所有的服务信息和状态,定时检查注册的服务,使得调用方不用去关心有多少提供方。常见的注册中心有Eureka,Zookeeper,Consul,Naco,文章内容基于Eureka实现。
1. Eureka单节点实现
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.yml
eureka:
client:
#是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息
register-with-eureka: false
#是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false
fetch-registry: false
#设置服务注册中心的URL,用于client和server端交流
service-url:
defaultZone: http://localhost:7900/eureka/
最后在启动类增加注解,至此便完成了Eureka注册中心的搭建。
@EnableEurekaServer
2. 服务注册
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml
#注册中心
eureka:
client:
#设置服务注册中心的URL
service-url:
defaultZone: http://localhost:7900/eureka/
#不想被注册,可以禁止暴露
spring:
cloud:
service-registry:
auto-registration:
enabled: false
注册成功可以在Eureka的控制台看到服务的信息。服务将自身的信息和状态注册到注册中心上,以方便其他服务的调用,同时会定时从注册中心拉取注册列表。每个服务既可能是生产者,也可能是消费者。
3. 服务调用
此时可以通过服务名拼接一个url去发起请求。但基于Feign和Ribbon组件,远程调用在编码方式上更像是本地调用,方便维护和管理,这里其实也表现了注册中心的另一个用处:可以通过注册中心获取的服务注册列表,从而通过一些负载均衡的策略去实现划分流量服,避免单台服务压力过大。关于服务调用,后续另外说明,这里就不继续展开。
4. Eureka高可用
Eureka高可用的实现主要是采用运行多个Eureka server实例并相互注册的方式实现,节点彼此之间会通过增量的方式同步数据,从而确保注册服务数据的一致性。跟单节点的差别主要在于配置上。
节点1:
#是否将自己注册到其他Eureka Server,默认为true 需要
eureka.client.register-with-eureka=true
#是否从eureka server获取注册信息, 需要
eureka.client.fetch-registry=true
#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://localhost:7902/eureka/
#主机名,必填
eureka.instance.hostname=localhost
management.endpoint.shutdown.enabled=true
#web端口,服务是由这个端口处理rest请求的
server.port=7901
节点2:
#是否将自己注册到其他Eureka Server,默认为true
eureka.client.register-with-eureka=true
#是否从eureka server获取注册信息
eureka.client.fetch-registry=true
#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://localhost:7902/eureka/
#主机名,必填
eureka.instance.hostname=localhost
management.endpoint.shutdown.enabled=true
#web端口,服务是由这个端口处理rest请求的
server.port=7902
高可用下,对于服务的注册来说也是比较简单,只需要在配置中指明所有的Eureka地址即可。
eureka:
client:
service-url:
defaultZone: http://localhost:7901/eureka/,http://localhost:7902/eureka/
小结
文章以Eureka为例说明了微服务下注册中心相关的一些内容,实际上其他注册中心组件的原理也都很类似。如果觉得文章可以,不妨点个赞,你的支持是我最大的动力。后续我也会逐渐更新微服务相关的一些知识,感兴趣的可以关注我,一起学习~