📫作者简介:小明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实现简要了解即可。