前言
大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 静态服务。在上一个章节我们学习了 Dubbo 服务只注册或只订阅两种模式。那么在这个章节我们将介绍 Dubbo 静态服务。有的小伙伴会问我们前面学习的服务注册是静态的服务还是动态服务呢?答案是前面所有章节介绍的服务注册都是动态的,所谓的动态就是服务的上下线不需要我们手动控制,通过服务应用的启动和退出服务自动在注册中心进行上下线配置。而静态服务则需要我们手动启用和禁用服务。那下面就让我详细学习下什么是静态服务吧!
1. 只订阅和注册服务简介
学习过前面章节的小伙伴都已经知道了我们的服务上下线是和我们的应用启动和退出生命周期相关,我们不需要认为的手动控制服务上下线。那这里的静态服务是怎么回事呢?很明显静态服务和动态服务是恰恰相反的,当我们配置一个服务为静态服务时,那么当我们的应用程序启动时会向注册中心注册服务,但是此时对于调用此服务的消费者来说是不可以见的,需要我们手动启用此服务。同理,当我们的应用程序退出时注册中心的服务不会自动下线,也就是说应用程序退出后注册中心仍然保留此服务的元数据,需要我们手动删除或者下线服务。
在图中上部分服务提供者注册服务后我们需要在注册中心手动配置服务上线,在下部分中我们服务提供者下线我们同样在注册中心手动配置服务下线。
2. 配置方式
同样在 Dubbo 中提供两种配置方式:
<dubbo:registry address="zookeeper://127.0.0.1:2181" dynamic="false" />
<dubbo:registry address="zookeeper://127.0.0.1:2181?dynamic=false" />
上面两种方式最终都会被转换为 URL 形式。
3. 使用场景
有小伙伴会问,这种手动配置方式太麻烦有什么用呢?还不如动态方式不用人工去干预。确实在我们大规模应用部署中一般是不会这样干的,但一些特殊场景可能需要人工干预服务的上下线。例如:
- 假设我们的某个服务在固定时间或触发某种条件时我们才对外提供服务,此时我们就可以通过这种方式来调整服务的上下线。
-
当我们在应用部署过可能存在多版本的 Dubbo 服务,此时假设某个版本服务不再对外提供服务就可以通过手动调整服务下线。假设此时可能存在某些用户并没有切换到新版本,那么我们可以根据运维情况同样可以快速恢复服务上线。
4. 示例演示
同样我们使用获取图书列表例子进行演示,项目结构如下:
下面我们重点关注一下服务提供者配置文件dubbo-provider-xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider" metadata-type="remote" />
<!--dynamic="false"表明该服务为静态服务-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" dynamic="false"/>
<!--使用name="dubbo"协议 并且指定服务端口port="20890" -->
<dubbo:protocol name="dubbo" port="20890"></dubbo:protocol>
<bean id="bookFacade" class="com.muke.dubbocourse.serviceconfig.provider.BookFacadeImpl"/>
<!--暴露本地服务为Dubbo服务 -->
<dubbo:service interface="com.muke.dubbocourse.common.api.BookFacade" ref="bookFacade" />
</beans>
上面的 XML 配置文件中dynamic="false"
表示应用服务为静态服务。此时我们启动服务提供者,服务消费方是不能调用服务,服务状态为已禁用
。
我们在 Dubbo Admin 中查看。如下图:
紧接着我们配置服务为已启用
状态。如下图:
此时服务消费方可以调用服务。
Tips:我们在 Dubbo 提供的 Admin 工具管理服务配置。我已经将 war 包上传在代码目录中。
4. 原理分析
下面我们来看下核心代码com.alibaba.dubbo.registry.integration.
:
RegistryDirectory#toInvokers
/**
* URL转换为Invoker
*
* @param urls
* @return invokers
*/
private Map<String, Invoker<T>> toInvokers(List<URL> urls) {
// ...
if (invoker == null) {
try {
boolean enabled = true;
//判断是否存在disabled 默认:false
if (url.hasParameter(Constants.DISABLED_KEY)) {
enabled = !url.getParameter(Constants.DISABLED_KEY, false);
} else {
//否则获取enabled参数 默认:true
enabled = url.getParameter(Constants.ENABLED_KEY, true);
}
//如果服务为激活状态 才封装为InvokerDelegate
if (enabled) {
invoker = new InvokerDelegate<T>(protocol.refer(serviceType, url), url, providerUrl);
}
} catch (Throwable t) {
//...
}
if (invoker != null) { // 放入缓存
newUrlInvokerMap.put(key, invoker);
}
} else {
newUrlInvokerMap.put(key, invoker);
}
// ....
return newUrlInvokerMap;
}
上面代码是来自于消费端对注册中心的订阅代码,从中可以看出当我们在注册中心动态更新服务配置时会通知消费者,消费者根据通知消息更新本地缓存。在这里我们改变了服务启动和禁止状态来动态调整服务提供者的Invoker列表。
5. 小结
在本小节中我们主要学习了 Dubbo 中的静态服务以及2种配置方式。同时我们也了解了在哪些特定场景中使用。我们也从源码层面分析了 Dubbo 是怎样去实现静态服务。
本节课程的重点如下:
1.理解 Dubbo 中静态服务
2.了解什么场景可以使用静态服务
3.了解了怎样使用2种配置方式
4.了解静态服务实现原理
作者
个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。关注公众号:青年IT男 获取最新技术文章推送!
博客地址: http://youngitman.tech
微信公众号:
知识星球: