|
| 1 | +# 分布式服务框架Dubbo集成Nacos框架实现注册中心 |
| 2 | + |
| 3 | +### 什么是Nacos? |
| 4 | +Nacos是阿里开源的一个产品,主要针对微服务架构中的服务发现、配置管理、服务治理的综合性解决方案; |
| 5 | +Nacos的四大功能: |
| 6 | +> - 服务发现与服务健康检查; |
| 7 | +> - 动态配置管理; |
| 8 | +> - 动态DNS服务; |
| 9 | +> - 服务和源数据管理; |
| 10 | +
|
| 11 | +### Zookeeper和Nacos的对比 |
| 12 | +Nacos在微服务场景中,主要用于配置中心和服务注册中心。这两块功能也是Zookeeper擅长的事情,以下我们分析下两者的不同处。 |
| 13 | + |
| 14 | +#### 1.Zookeeper |
| 15 | +Zookeeper的功能主要是它的树型节点来实现的。当数据变化的时候或者节点过期的时候,会通过事件触发通知对应的客户端数据变化了,然后客户端再请求ZK获取最新的数据,采用push-pull来做数据更新; |
| 16 | + |
| 17 | +其中ZK最重要的就是它的ZAB协议了(消息广播和消息恢复) |
| 18 | +**消息广播**:集群中ZK在数据更新的时候,通过Leader节点将消息广播给其他Follower节点,采用简单的两阶段提交模式,先Request->ACK->Commit,当超过一半的Follower节点响应时,就可以提交更新了; |
| 19 | +**奔溃恢复**:当Leader挂了,或者超过半数Follower投票得出Leader不可用,那么会重新选举,这段时间内ZK服务是不可用的。通过最新的XID来选举出新的Leader,选举出来的后将新的Leader中的数据更新给超过半数的Follower节点后,此时才能对外提供服务; |
| 20 | + |
| 21 | +#### 2.Nacos |
| 22 | +Nacos中配置中心和注册中心分别是两套实现,和ZK不同。 |
| 23 | +##### 2.1 对比配置中心 |
| 24 | +Nacos和Zookeeper都可以作为配置中心,做一些可以实时变化的配置数据存储,然后实时更新线上数据。 |
| 25 | +**Nacos**:依赖Mysql数据库做数据存储,当数据更新的时候,直接更新数据库的数据,然后将数据更新的信息异步广播给Nacos集群中所有服务节点数据变更,再由Nacos服务节点更新本地缓存,然后将通知客户端节点数据变化。 |
| 26 | +** Zookeeper**:利用ZK的树型结构做数据存储,当有数据更新的时候,使用过半机制保证各个节点的数据一致性,然后通过ZK的事件机制通知客户端。 |
| 27 | + |
| 28 | +这里的差异: |
| 29 | +> - 服务器存储的位置不同,分别采用Mysql和ZK本身存储; |
| 30 | +> - 消息发送,一个采用过半机制保证一致性,另一个异步广播,通过后台线程重试保证; |
| 31 | +
|
| 32 | +##### 2.2 对比注册中心 |
| 33 | +**Nacos**:支持两种方式的注册中心,持久化和非持久化存储服务信息。 |
| 34 | +> - **非持久化** 直接存储在Nacos服务节点的内存中,并且服务节点采用去中心话的思想,服务节点采用Hash分片存储注册信息; |
| 35 | +> - **持久化** 使用Raft协议选举Master节点,同样采用过半机制将数据存储在Leader节点上; |
| 36 | +**Zookeeper**:利用zk的树型结构做数据存储,服务注册和消费信息直接存储在zk树形节点上,集群下同样采用过半机制保证服务节点间一致性; |
| 37 | + |
| 38 | +这里的差异: |
| 39 | +> - Nacos同时支持 持久化和非持久化存储,也就是支持CAP原则中的AP和CP特性,Nacos的CP持久化和ZK模式类似。Nacos默认采用AP非持久化,非持久化使用内存存储速度更快,而且Hash分片存储,不利点就是某个服务挂掉,可能出现部分时间调用失败。因为服务调用本身就是实时的,持久化存储起来意义不大,反而及时变化更适合。 |
| 40 | +
|
| 41 | + |
| 42 | +### Nacos的基础概念 |
| 43 | +<img src="https://ipman-blog-1304583208.cos.ap-nanjing.myqcloud.com/dubbo/34201608729038_.pic_hd.jpg" width = "430" height = "300" alt="图片名称" align=center /> |
| 44 | + |
| 45 | +#### 命名空间 |
| 46 | +命名空间(NameSpace)用于不同环境(开发环境、测试环境和生产环境)的配置隔离。不同的命名空间下,可以存在相同名称的配置分组(Group)或配置集。 |
| 47 | + |
| 48 | +#### 配置分组 |
| 49 | +配置分组是对配置集进行分组,不同的配置分组下可以有相同的配置集(DateId)。默认的配置分组名称为 DEFAULT_GROUP。用于区分不同的项目或应用。 |
| 50 | + |
| 51 | +#### 配置集 |
| 52 | +在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。 |
| 53 | + |
| 54 | + |
| 55 | +### Nacos-Server部署 |
| 56 | +#### 1.下载安装 |
| 57 | +```json |
| 58 | +//下载编译后的最新zip包 |
| 59 | +https://github.com/alibaba/nacos/releases |
| 60 | + |
| 61 | +//解压 |
| 62 | +unzip nacos-server-$version.zip |
| 63 | +cd nacos/bin |
| 64 | + |
| 65 | +//启动 |
| 66 | +sh startup.sh -m standalone |
| 67 | +``` |
| 68 | + |
| 69 | +#### 2.测试注册中心和配置中心 |
| 70 | +```json |
| 71 | +//服务注册 |
| 72 | +curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080' |
| 73 | + |
| 74 | +//服务发现 |
| 75 | +curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName' |
| 76 | + |
| 77 | +//发布配置 |
| 78 | +curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" |
| 79 | + |
| 80 | +//获取配置 |
| 81 | +curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test" |
| 82 | +``` |
| 83 | + |
| 84 | +#### 3.登录Nacos-Server控制台 |
| 85 | +<img src="https://ipman-blog-1304583208.cos.ap-nanjing.myqcloud.com/dubbo/1651608729573_.pic.jpg" width = "620" height = "340" alt="图片名称" align=center /> |
| 86 | + |
| 87 | +```json |
| 88 | +//访问 |
| 89 | +http://127.0.0.1:8848/nacos |
| 90 | + |
| 91 | +//用户名&密码 |
| 92 | +nacos |
| 93 | +nacos |
| 94 | +``` |
| 95 | + |
| 96 | +### Dubbo集成Nacos为注册中心 |
| 97 | +#### 1.Nacos默认注册中心是AP实现,如果需要CP实现的业务可以进行如下设置; |
| 98 | +```json |
| 99 | +curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP' |
| 100 | +``` |
| 101 | + |
| 102 | +#### 2.修改Provider配置,将registry默认Zookeeper的地址改为Nacos地址 |
| 103 | +```json |
| 104 | +<?xml version="1.0" encoding="UTF-8"?> |
| 105 | + |
| 106 | +<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 107 | + xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" |
| 108 | + xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" |
| 109 | + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd |
| 110 | + http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> |
| 111 | + <context:property-placeholder/> |
| 112 | + |
| 113 | + <dubbo:application name="nacos-provider"/> |
| 114 | + |
| 115 | + <dubbo:registry address="nacos://10.211.55.6:8848"/> |
| 116 | + |
| 117 | + <dubbo:protocol name="dubbo" port="20880"/> |
| 118 | + |
| 119 | + <bean id="demoService" class="com.ipman.dubbo.nacos.sample.impl.DemoServiceImpl"/> |
| 120 | + |
| 121 | + <dubbo:service interface="com.ipman.dubbo.nacos.sample.api.DemoService" ref="demoService"/> |
| 122 | +</beans> |
| 123 | +``` |
| 124 | + |
| 125 | +#### 3.修改Consumer配置,将registry默认Zookeeper的地址改为Nacos地址 |
| 126 | +```json |
| 127 | +<?xml version="1.0" encoding="UTF-8"?> |
| 128 | + |
| 129 | +<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 130 | + xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" |
| 131 | + xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" |
| 132 | + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd |
| 133 | + http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> |
| 134 | + <context:property-placeholder/> |
| 135 | + |
| 136 | + <dubbo:application name="nacos-consumer"/> |
| 137 | + |
| 138 | + <dubbo:registry address="nacos://10.211.55.6:8848"/> |
| 139 | + |
| 140 | + <dubbo:reference id="demoService" check="false" interface="com.ipman.dubbo.nacos.sample.api.DemoService"/> |
| 141 | +</beans> |
| 142 | +``` |
| 143 | + |
| 144 | +#### 4.启动服务进行测试 |
| 145 | +##### 4.1 查看Nacos控制台中的Dubbo注册的服务列表 |
| 146 | +<img src="https://ipman-blog-1304583208.cos.ap-nanjing.myqcloud.com/dubbo/1051608730158_.pic.jpg" width = "820" height = "340" alt="图片名称" align=center /> |
| 147 | + |
| 148 | +##### 4.2 查看Nacos控制台中的Dubbo注册的消费者列表 |
| 149 | +<img src="https://ipman-blog-1304583208.cos.ap-nanjing.myqcloud.com/dubbo/1061608730173_.pic.jpg" width = "820" height = "340" alt="图片名称" align=center /> |
0 commit comments