📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战
🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文目录
本文导读
一、Dubbo配置概述
1、Dubbo 中的 URL 统一模型
2、Dubbo配置实现原理
二、Dubbo配置-基于XML配置实现
三、Dubbo配置-基于注解(Annotation )实现
四、Dubbo配置-基于API实现
五、Dubbo配置项解析
总结
本文导读
本文先讲解Dubbo配置概述,了解Dubbo中的URL统一模型和Dubbo配置实现原理,在三种Dubbo配置中,主要是基于XML配置实现的,并附Dubbo配置项解析,基于Annotation实现和基于API实现简要了解即可。
一、Dubbo配置概述
1、Dubbo 中的 URL 统一模型
从实现原理层面,最终 Dubbo 所有的配置项都会被组装到 URL 中,以 URL 为载体在后续的启动、RPC 调用过程中传递,进而控制框架行为。
dubbo 中的 URL,主要用于在各个扩展点之间传递数据,组成此 URL 对象的具体参数如下:
protocol:一般是 dubbo 中的各种协议 如:dubbo thrift http zk
username/password:用户名/密码
host/port:主机/端口
path:接口名称
parameters:参数键值对
public URL(String protocol, String username, String password, String host, int port, String path, Map<String, String> parameters) {
if ((username == null || username.length() == 0)
&& password != null && password.length() > 0) {
throw new IllegalArgumentException("Invalid url, password without username!");
}
this.protocol = protocol;
this.username = username;
this.password = password;
this.host = host;
this.port = (port < 0 ? 0 : port);
this.path = path;
// trim the beginning "/"
while(path != null && path.startsWith("/")) {
path = path.substring(1);
}
if (parameters == null) {
parameters = new HashMap<String, String>();
} else {
parameters = new HashMap<String, String>(parameters);
}
this.parameters = Collections.unmodifiableMap(parameters);
}
2、Dubbo配置实现原理
service 与 reference:service 与 reference 是 Dubbo 最基础的两个配置项,它们用来将某个指定的接口或实现类注册为 Dubbo 服务,并通过配置项控制服务的行为。service 用于服务提供者端,通过 service 配置的接口和实现类将被定义为标准的 Dubbo 服务,从而实现对外提供 RPC 请求服务。reference 用于服务消费者端,通过 reference 配置的接口将被定义为标准的 Dubbo 服务,生成的 proxy 可发起对远端的 RPC 请求。一个应用中可以配置任意多个 service 与 reference。
consumer 与 provider:当应用内有多个 reference 配置时,consumer 指定了这些 reference 共享的默认值,如共享的超时时间等以简化繁琐的配置,如某个 reference 中单独设置了配置项值则该 reference 中的配置优先级更高。当应用内有多个 service 配置时,provider 指定了这些 service 共享的默认值,如某个 service 中单独设置了配置项值则该 service 中的配置优先级更高。consumer 组件还可以对 reference 进行虚拟分组,不通分组下的 reference 可有不同的 consumer 默认值设定;如在 XML 格式配置中,<dubbo:reference /> 标签可通过嵌套在 <dubbo:consumer /> 标签之中实现分组。provider 与 service 之间也可以实现相同的效果。
二、Dubbo配置-基于XML配置实现
服务提供者-定义服务接口
public interface DemoService { String sayHello(String name); }
用 Spring 配置声明暴露服务
<?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" xmlns:context="http://www.springframework.org/schema/context"
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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder/>
<dubbo:application name="demo-provider"/>
<dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>
<dubbo:provider token="true"/>
<bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
<dubbo:service interface="DemoService" ref="demoService"/>
</beans>
加载 Spring 配置
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
}
}
服务消费者-通过 Spring 配置引用远程服务
<?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" xmlns:context="http://www.springframework.org/schema/context"
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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder/>
<dubbo:application name="demo-consumer"/>
<dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>
<dubbo:reference id="demoService" check="true" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
</beans>
加载 Spring 配置,并调用远程服务
public class BasicConsumer {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-consumer.xml");
context.start();
DemoService demoService = (DemoService) context.getBean("demoService");
String hello = demoService.sayHello("world");
}
}
三、Dubbo配置-基于注解(Annotation )实现
此种方式使用的比较少,基于注解可以快速的将程序配置无效多余的配置信息,包含提供者和消费者。但是这种方式有一个弊端就是有些时候配置信息并不是特别好找,需要查找问题时无法快速定位。
在 Dubbo Spring Boot 开发中,你只需要增加几个注解,并配置 application.properties 或 application.yml 文件即可完成 Dubbo 服务定义注解有 @DubboService、@DubboReference 与 EnableDubbo,其中 @DubboService 与 @DubboReference 用于标记 Dubbo 服务,EnableDubbo 启动 Dubbo 相关配置并指定 Spring Boot 扫描包路径。配置文件 application.properties 或 application.yml
@DubboService 注解:@Service 注解从 3.0 版本开始就已经废弃,改用 @DubboService,以区别于 Spring 的 @Service 注解定义好 Dubbo 服务接口后,提供服务接口的实现逻辑,并用 @DubboService 注解标记,就可以实现 Dubbo 的服务暴露
@DubboReference 注解:@Reference 注解从 3.0 版本开始就已经废弃,改用 @DubboReference,以区别于 Spring 的 @Reference 注解。@DubboReference 注解将自动注入为 Dubbo 服务代理实例,使用 demoService 即可发起远程服务调
@EnableDubbo 注解:@EnableDubbo 注解必须配置,否则将无法加载 Dubbo 注解定义的服务,@EnableDubbo 可以定义在主类上
四、Dubbo配置-基于API实现
此种方式使用的比较少,这种方式更适用于研发自由框架与Dubbo做深度集成。
通过 API 编码方式组装配置、启动 Dubbo、发布及订阅服务。此方式可以支持动态创建 ReferenceConfig/ServiceConfig,结合泛化调用可以满足 API Gateway 或测试平台的需要。
服务提供者:通过 ServiceConfig 暴露服务接口,发布服务接口到注册中心。
服务消费者:通过 ReferenceConfig 引用远程服务,从注册中心订阅服务接口。
Bootstrap API:通过 DubboBootstrap API 可以减少重复配置,更好控制启动过程,支持批量发布/订阅服务接口,还可以更好支持 Dubbo3 的应用级服务发现。
五、Dubbo配置项解析
组件名称 | 描述 | 范围 | 是否必须配置 |
application | 指定应用名等应用级别相关信息 | 一个应用内只允许出现一个 | 必选 |
service | 声明普通接口或实现类为 Dubbo 服务 | 一个应用内可以有 0 到多个 service | service/reference 至少一种 |
reference | 声明普通接口为 Dubbo 服务 | 一个应用内可以有 0 到多个 reference | service/reference 至少一种 |
protocol | 要暴露的 RPC 协议及相关配置如端口号等 | 一个应用可配置多个,一个 protocol 可作用于一组 service&reference | 可选,默认 dubbo |
registry | 注册中心类型、地址及相关配置 | 一个应用内可配置多个,一个 registry 可作用于一组 service&reference | 必选 |
config-center | 配置中心类型、地址及相关配置 | 一个应用内可配置多个,所有服务共享 | 可选 |
metadata-report | 元数据中心类型、地址及相关配置 | 一个应用内可配置多个,所有服务共享 | 可选 |
consumer | reference 间共享的默认配置 | 一个应用内可配置多个,一个 consumer 可作用于一组 reference | 可选 |
provider | service 间共享的默认配置 | 一个应用内可配置多个,一个 provider 可作用于一组 service | 可选 |
monitor | 监控系统类型及地址 | 一个应用内只允许配置一个 | 可选 |
metrics | 数据采集模块相关配置 | 一个应用内只允许配置一个 | 可选 |
ssl | ssl/tls 安全链接相关的证书等配置 | 一个应用内只允许配置一个 | 可选 |
method | 指定方法级的配置 | service 和 reference 的子配置 | 可选 |
argument | 某个方法的参数配置 | method的子配置 | 可选 |
总结
本文先讲解Dubbo配置概述,了解Dubbo中的URL统一模型和Dubbo配置实现原理,在三种Dubbo配置中,主要是基于XML配置实现的,并附Dubbo配置项解析,基于Annotation实现和基于API实现简要了解即可。