分布式RPC系统框架Dubbo-08多协议支持

        除了Dubbo服务暴露Dubbo协议外,Dubbo框架还支持另外8种服务暴露协议:RMI协议、Hessian协议、HTTP协议、WebService协议、Thrift协议、Memcached协议、Redis协议、Rest协议,但在实际生产中,使用最多的就是Dubbo服务暴露协议。

1 各个协议的特点

        小数据大并发使用Dubbo,大数据小并发使用其它。

1.1 dubbo协议

  • Dubbo默认传输协议

  • 连接个数:单连接

  • 连接方式:长连接

  • 传输协议:TCP

  • 传输方式:NIO 异步传输

  • 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。

1.2 rmi协议

  • 采用 JDK 标准的 java.rmi.* 实现

  • 连接个数:多连接

  • 连接方式:短连接

  • 传输协议:TCP

  • 传输方式:BIO同步传输

  • 适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。

1.3 hession协议

  • 连接个数:多连接

  • 连接方式:短连接

  • 传输协议:HTTP

  • 传输方式:BIO同步传输

  • 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者抗压能力较大,可传文件

1.4 http协议

  • 连接个数:多连接

  • 连接方式:短连接

  • 传输协议:HTTP

  • 传输方式:BIO同步传输

  • 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。

1.5 webService协议

  • 连接个数:多连接

  • 连接方式:短连接

  • 传输协议:HTTP

  • 传输方式:BIO同步传输

  • 适用场景:系统集成,跨语言调用

1.6 thrift协议

        Thrift 是 Facebook 捐给 Apache 的一个 RPC 框架,其消息传递采用的协议即为thrift协议,当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,Thrift协议不支持null值的传递。

1.7 memcached协议与redis协议

        高效的KV缓存服务器,会对传输的数据使用相应的技术进行缓存。

1.8 rest协议

       若需要开发具有RESTful风格的服务,则需要使用该协议。

2 同一服务支持多种协议

        对于多协议的用法有两种,一种是同一个服务支持多种协议,一种是不同的服务使用不同的协议,首先来看“同一服务支持多种协议”的用法。

step1 修改提供者配置文件

        对https://blog.csdn.net/zxylwj/article/details/108542567提供者工程进行修改,在提供者中要首先声明新添加的协议,然后在服务dubbo:service/标签中再增加该新的协议,若不指定,默认为dubbo协议。

<!-- 添加 DUBBO SCHEMA -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        
	<!-- 指定当前工程在Monitor监控中心显示的名称,一般与工程名相同 -->
	<dubbo:application name="provider-protocol" />
	
	<!-- 指定注册中心,不使用 -->
	<dubbo:registry address="zookeeper://192.168.85.129:2181" />
	
	<!-- 声明使用多种协议 -->
	<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
	<dubbo:protocol name="rmi" port="1099"></dubbo:protocol>
	
	<!-- 注册业务实现类,真正的服务提供者 -->
	<bean id="oldService" class="com.zxy.service.OldServcieImpl"/>
	<bean id="newService" class="com.zxy.service.NewServiceImpl"/>
	
	<!-- 暴露服务:接口即服务名称,指向真正的服务提供者 -->
	<dubbo:service interface="com.zxy.service.SomeService" 
	               ref="oldService" version="0.0.1"/>
	               
	<dubbo:service interface="com.zxy.service.SomeService" 
	               ref="newService" version="0.0.2" protocol="dubbo,rmi"/>
</beans>

        这里需要理解这个服务暴露协议的意义,其是指出,消费者若要连接当前的服务,就需要通过这里指定的协议及端口号进行访问,端口号可以是任意的,不一定非要使用默认的端口号(Dubbo默认为20880,rmi默认为1099);指定的协议名称及端口号,在当前服务注册到注册中心时会一并写入到服务映射表中,当消费者根据服务名称查找到相应主机时,其同时会查询出消费此服务的协议、端口号等信息;其底层就是一个Socket编程,通过主机名与端口号进行连接。

step2 修改消费者配置文件

        对https://blog.csdn.net/zxylwj/article/details/108542567消费者工程中进行修改,在消费者引用服务时要指出所要使用的协议。

<!-- 添加 DUBBO SCHEMA -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

	<dubbo:application name="consumer-protocol">
		<dubbo:parameter key="qos.port" value="33333"/>
	</dubbo:application>
	
	<!-- 声明zookeeper注册中,单机zk -->
	<dubbo:registry address="zookeeper://192.168.85.129:2181" />	
	

    <!-- 声明使用多种协议 -->
	<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
	<dubbo:protocol name="rmi" port="1099"></dubbo:protocol>


	<!-- 调用Oldprovider 
	<dubbo:reference id="someService" check="false" version="0.0.1"
					 interface="com.zxy.service.SomeService"/>
	-->
	<!-- 调用newprovider -->
	<dubbo:reference id="someService" check="false" version="0.0.2" protocol="rmi"
					 interface="com.zxy.service.SomeService"/>
</beans>

应用场景

        “同一服务支持多种协议”的应用场景是:系统在使用过程中其使用场景逐渐发生了变化,例如,由原来的消费者数量多于提供者数量,变为了消费者数量与提供者数量差不多了,并且原来系统不用传输文件,现在的系统需要传输文件了,此时就将将原来默认的dubbo协议更换为rmi协议,目的是为了兼容老工程,扩展新功能。

3 不同服务使用不同协议

step1 应用场景

        同一个系统中不同的业务具有不同的特点,所以它们的传输协议就应该根据它们的特点选择不同的协议;例如对于前面使用服务分组实现的“微信支付”与“支付宝支付”,就可以针对不同的支付方式,使用不同的协议。

step2 修改提供者配置文件

        在https://blog.csdn.net/zxylwj/article/details/108561883工程provider中进行修改;首先要修改服务提供者配置文件:声明所要使用的协议;在使用dubbo:service/暴露服务时通过protocal属性指定所要使用的服务协议。

<!-- 添加 DUBBO SCHEMA -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        
	<dubbo:application name="consumer-protocol-def">
		<dubbo:parameter key="qos.port" value="33333"/>
	</dubbo:application>
	
	<!-- 声明zookeeper注册中,单机zk -->
	<dubbo:registry address="zookeeper://192.168.85.129:2181" />

    <!-- 声明使用多种协议 -->
	<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
	<dubbo:protocol name="rmi" port="1099"></dubbo:protocol>
	
	<!-- 指定调用微信服务 -->
	<dubbo:reference id="weixin" check="false" group="pay.weixin" protocol="dubbo"
					 interface="com.zxy.service.SomeService"/>
	
	<!-- 指定调用支付宝服务 -->
	<dubbo:reference id="alipay" check="false" group="pay.alipay" protocol="rmi"
					 interface="com.zxy.service.SomeService"/>
</beans>

step3 修改消费者配置文件

       在https://blog.csdn.net/zxylwj/article/details/108561883工程consumer中进行修改;在消费者端通过dubbo:reference/引用服务时通过添加protocal属性指定要使用的服务协议。

<!-- 添加 DUBBO SCHEMA -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        
	<!-- 指定当前工程在Monitor监控中心显示的名称,一般与工程名相同 -->
	<dubbo:application name="6-provider-protocol-def" />
	
	<!-- 指定注册中心 -->
	<dubbo:registry address="zookeeper://192.168.85.129:2181" />
	
	<!-- 声明使用多种协议 -->
	<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
	<dubbo:protocol name="rmi" port="1099"></dubbo:protocol>
	
	<!-- 注册业务实现类,真正的服务提供者 -->
	<bean id="weixinService" class="com.zxy.service.WeixinServiceImpl"/>
	<bean id="alipayService" class="com.zxy.service.AlipayServiceImpl"/>
	
	<!-- 暴露服务:接口即服务名称,指向真正的服务提供者 -->
	<dubbo:service interface="com.zxy.service.SomeService" protocol="dubbo"
	               ref="weixinService" group="pay.weixin"/>
	               
	<dubbo:service interface="com.zxy.service.SomeService" protocol="rmi"
	               ref="alipayService" group="pay.alipay"/>
</beans>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值