区别于普通的 RPC 框架,Dubbo 作为一款微服务框架提供了非常灵活的协议支持,它不绑定一个单一通信协议。因此你可以发布在一个进程中同时发布多个 RPC 协议、调用不同的 RPC 协议。接下来我们就详细介绍多协议的具体使用场景与使用方式。
有很多场景可能会用到不同的协议,包括安全性、性能、与第三方系统互调等业务诉求。本文我们不分析具体的业务需求,而是从 Dubbo 框架提供的多协议能力出发分析框架能提供的多协议能力:
如果使用 Spring Boot,可以修改 application.yml 或 application.properties 如下:
dubbo:
protocols:
- id: dubbo-id
name: dubbo
port: 20880
- id: tri-id
name: tri
port: 50051
对于 Spring XML:
<dubbo:protocol id="dubbo-id" name="dubbo" port="20880"/>
<dubbo:protocol id="triple-id" name="tri" port="50051"/>
接下来为服务配置(默认不配置的情况下,服务会发布到以上所有协议配置):
@DubboService(protocol="dubbo-id,triple-id")
private DemoServiceImpl implements DemoService {}
如果使用 Spring Boot,可以修改 application.yml 或 application.properties 如下:
dubbo:
protocols:
- id: dubbo-id
name: dubbo
port: 20880
- id: tri-id
name: tri
port: 50051
接下来为不同的服务分别配置不同的协议引用:
@DubboService(protocol="dubbo-id")
private DemoServiceImpl implements DemoService {}
@DubboService(protocol="triple-id")
private GreetingServiceImpl implements GreetingService {}
对于消费端而言,直接在声明引用的时候指定要调用的协议关键字就可以了:
@DubboReference(protocol="dubbo")
private DemoService demoService;
@DubboReference(protocol="tri")
private GreetingService greetingService;
多协议发布是指为同一个服务同时提供多种协议访问方式,多协议可以是任意两个或多个协议的组合,比如下面的配置将同时发布了 dubbo、triple 协议:
dubbo:
protocols:
- name: tri
port: 50051
- name: dubbo
port: 20880
基于以上配置,如果应用中有服务 DemoService,则既可以通过 dubbo 协议访问 DemoService,也可以通过 triple 协议访问 DemoService,其工作原理图如下:
对于消费端而言,如果用户没有明确配置,默认情况下框架会自动选择 dubbo
协议调用。Dubbo 框架支持配置通过哪个协议访问服务,如 @DubboReference(protocol="tri")
,或者在 application.yml 配置文件中指定全局默认值:
dubbo:
consumer:
protocol: tri
除了以上发布多个端口、注册多条 url 到注册中心的方式。对于 dubbo、triple 这两个内置协议,框架提供了在单个端口上同时发布 dubbo 和 triple 协议的能力。这对于老用户来说是一个非常重要的能力,因为它可以做到不增加任何负担的情况下,让使用 dubbo 协议的用户可以额外发布 triple 协议,这样当所有的应用都实现多协议发布之后,我们就可以设置消费端去通过 triple 协议发起调用了。
单端口多协议的基本配置如下:
dubbo:
protocol:
name: dubbo
ext-protocol: tri