在上一篇文章,我们介绍如何使用 Dubbo 进行服务间的远程通信,我们采用的模式是,调用方(Consumer)直接通过 URL 调用 Provider 发布的服务。虽然这样也实现了远程通信的目标,但是作为主流的服务治理组件,最根本的就是要解决大规模集群之后的服务注册和发现的问题,那么,难道我调用一个服务时,需要把集群所有结点 URL 都记下来?要调用很多个服务呢?所以这样使用 Dubbo 在实际开发中势必是不可取的。
那怎么办呢?引入注册中心,Provider 把服务发布到注册中心,Consumer 去中心中心通过服务接口找相应的服务实现。如果服务是大规模集群,Consumer 也根本不用关心,它需要知道就只有注册中心的地址,负载均衡,服务监控这些情注册中心都给做了。
Dubbo 能够支持的注册中心有:consul、etcd、nacos、sofa、zookeeper、 redis、multicast 等。而一般 Dubbo 的注册中心选用 zookeeper,因为除了数据存储外,zookeeper 还提供了 watcher 机制,即只要服务发生变化,调用方就能感知到。
下面我们就通过注册中心来对上一篇的代码进行改造…
注:因为注册中心主要解决的是服务注册发现问题,所以上一篇我们服务实现(Provider)和服务调用(Consumer)的具体 Java 代码不用修改,要改的地方只有配置文件。
引入zookeeper作为服务注册中心
给 pay-provider 与 order-service 都需要引入zk的客户端,即 curator 的相关依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
1.pay-provider 改造
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="pay-service"/>
<!-- 若用注册中心则要引入其相应客户端jar包(如curator),并且url前要加上zookeeper://-->
<dubbo:registry address="zookeeper://43.107.136.120:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.xupt.yzh.IPayService" ref="payServic"/>
<bean id="payServic" class="com.xupt.yzh.PayServiceImpl"/>
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2.order-service 改造
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="order-service"/>
<dubbo:registry address="zookeeper://43.107.136.120:2181"/>
<!-- 当有注册中心时,就不需要url了-->
<dubbo:reference interface="com.xupt.yzh.IPayService" id="PayService"/>
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3.注册中心原理
引入注册中心有什么用呢?为什么 Consumer 直接配置个注册中心的地址就可以了?我们登到 zk 上去一看究竟…
可以看到,zookeeper 会为当前服务的 url 创建一个临时节点。Dubbo 相关内容是的根节点是 dubbo,第二级节点是服务的接口,叶节点是一个临时节点,是相应服务 URL(注:还&包含了服务名等信息 )。所以,当 Consumer 需要调用哪个服务时,就可以通过相应接口找到具体的服务实现,不用再自己记 URL 了。
问题一:Consumer 每次调用服务都要去查一次注册中心?
可以在消费端会进行缓存;通过配置缓存文件的路径开启
<dubbo:registry id="zookeeper" address="zookeeper://43.107.136.120:2181" file="d:/dubbo-server" />
1
问题二:Dubbo 支持同时配置多个注册中心吗?
Dubbo 中可以支持多注册中心,有的时候,客户端需要用调用的远程服务不在同一个注册中心上,那么客户端就需要配置多个注册中心来访问。演示一个简单的案例
<!-- 配置多个注册中心,这里需要指定id -->
<dubbo:registry address="zookeeper://192.168.13.102:2181" id="registryCenter1"/>
<dubbo:registry address="zookeeper://192.168.13.103:2181" id="registryCenter2"/>
1
2
3
<!-- 将服务注册到不同配置中心,这里需要指定registry-->
<dubbo:service interface="com.xupt.LoginService" ref="loginService" registry="registryCenter1"/>
1
2
消费端同理,在dubbo:registry中指定id,然后dubbo:reference中指定registry属性即可
问题三:注册中心 dubbo:registry 还有其他特性吗?
当设置 <dubbo:registry check=“false” /> 时,记录失败注册和订阅请求, 后台定时重试
可通过 <dubbo:registry username=“admin” password=“1234” /> 设置 zookeeper 登录信息
可通过 <dubbo:registry group=“dubbo” /> 设置 zookeeper 的根节点,默认使用 dubbo 作为 dubbo 服务注册的 namespace
4.几个流程
服务注册:服务提供者(Provider)启动时,会向 Zookeeper 服务端注册服务信息,即会在 Zookeeper 服务器上创建一个服务节点,并在节点上存储服务的相关数据(如服务提供者的ip地址、端口等),比如注册一个用户注册服务(user/register)。
服务发现:服务消费者(Consumer)启动时,会根据本身依赖的服务信息,向 Zookeeper 服务端获取注册的服务信息并设置 Watcher,获取到注册的服务信息之后将服务提供者信息缓存在本地,调用服务时直接根据从 Zookeeper 注册中心获取到的服务注册信息调用服务,比如发现用户注册服务(user/register)并调用。
服务通知:当服务提供者因为某种原因宕机或不提供服务之后,Zookeeper 服务注册中心的对应服务节点会被删除,因为服务消费者在获取服务信息的时候在对应节点上设置了Watch,因此节点删除之后会触发对应的 Watcher,Zookeeper注册中心会异步向服务所关联的所有服务消费者发出节点删除的通知,服务消费者根据收到的通知更新缓存的服务列表。
————————————————
原文链接:https://blog.csdn.net/weixin_43935927/article/details/112727691