Nacos作为注册中心
简介
Nacos是阿里开源的一个新框架,在分布式的架构中,Nacos同时扮演着服务注册中心和配置中心的角色。今天主要讲的是Nacos作为服务注册中心。
分布式中著名的CAP理论,任何一种服务注册中心都只能实现其中的两个特性,一般是AP(注重可用性)或者CP(注重一致性)。
Eureka就是一个AP的服务注册中心,任何一个Eureka Server都是独立的,可存储所有的服务注册信息,即使任意一台Eureka Server宕机,其余的机器都可以照常工作,保证高可用性,但是不保证数据是一致的;
Zookeeper是一个CP的服务注册中心,所有的服务注册信息都存储在leader的机器上,同步给其他的follewer,可以保证强一致性,若leader宕机,则不能提供服务注册的功能了,需要重新选举,无法保证高可用性;
Nacos在 1.0.0 正式支持 AP 和 CP 两种一致性协议并存。一个是基于简化的 Raft 的 CP 一致性,一个是基于自研协议 Distro 的 AP 一致性。Raft 协议基于 Leader 进行写入,其 CP 也并不是严格的,只是能保证一半所见一致,以及数据的丢失概率较小。Distro 协议则是参考了内部 ConfigServer 和开源 Eureka,在不借助第三方存储的情况下,实现基本大同小异。
Eureka和Zookeeper都不能支持大量的服务实例,Eureka因为所有的服务实例在每一台Eureka Server中都保存了,大量的服务实例会产生大量的心跳检测等信息,导致Eureka Server无法支持高并发的操作。
Zookeeper的话,会将服务实例的上线下线通知到每一个服务实例,如果频繁的上下线的话,会去通知大量的服务实例,导致短时间网络压力增大,性能下降。
而Nacos 在开源版本中,服务实例注册的支撑量约为 100 万,服务的数量可以达到 10 万以上。在实际的部署环境中,这个数字还会因为机器、网络的配置与 JVM 参数的不同,可能会有所差别。
Nacos相比较于其他的服务中心还是有一定优势的。
Nacos服务注册发现步骤
服务提供者将注册信息写入到Nacos注册中心的服务注册表中
服务注册中心将服务提供者的实例交给Service Holder(服务持有容器)处理,服务实例将会挂载在Service Holder的空间下
务注册成功后,提供者将与服务中心维持心跳,未能及时发送心跳的服务将会被剔除
服务发现支持两种场景
- 消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况
- 服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的
整合注册中心
前置工作
将我们的order-server迁移到nacos注册中心
删除依赖
删除eureka和config的依赖文件
1 | <dependency> |
删除bootstrap配置
删除bootstrap.properties 配置文件
删除Eureka注解
删除启动类的 @EnableEurekaClient 注解
服务提供者
增加dependencyManagement
IDEA中创建聚合工程Nacos作为父工程,其pom.xml如下(重点关注
dependencyManagement
配置
1 | <dependencyManagement> |
引入POM依赖
1 | <dependency> |
配置文件配置
修改application.properties
1 | server.port=8083 |
启动类配置
在OrderApplication.java中添加注解
@EnableDiscoveryClient
开启服务注册发现功能
1 |
|
启动测试
启动服务打开 Nacos注册中心查看注册列表
我们发现我们的order服务已经注册了。
服务消费者
其他消费者和上面整合步骤是一致的,但是注意的是 整合openfegin的时候服务名需要小写,nacos服务名大小写敏感
然后将其他服务都改造成nacos注册