首页 > 其他分享 >Dubbo 如何自定义协议为业务通信带来扩展

Dubbo 如何自定义协议为业务通信带来扩展

时间:2024-07-01 12:30:09浏览次数:22  
标签:Dubbo 自定义 dubbo 扩展 throws rpc Invoker apache public

Solomon_肖哥弹架构 跟大家“弹弹” Dubbo 自定义协议扩展
欢迎 点赞,收藏,关注。

关注本人的公众号Solomon肖哥弹架构获取更多精彩内容

Dubbo 自定义协议扩展

1、扩展说明

RPC 协议扩展,封装远程调用细节。

契约:

  • 当用户调用 refer() 所返回的 Invoker 对象的 invoke() 方法时,协议需相应执行同 URL 远端 export() 传入的 Invoker 对象的 invoke() 方法。
  • 其中,refer() 返回的 Invoker 由协议实现,协议通常需要在此 Invoker 中发送远程请求,export() 传入的 Invoker 由框架实现并传入,协议不需要关心。

注意:

  • 协议不关心业务接口的透明代理,以 Invoker 为中心,由外层将 Invoker 转换为业务接口。
  • 协议不一定要是 TCP 网络通讯,比如通过共享文件,IPC 进程间通讯等。

2、扩展接口

  • org.apache.dubbo.rpc.Protocol
  • org.apache.dubbo.rpc.Exporter
  • org.apache.dubbo.rpc.Invoker
public interface Protocol {
    /**
     * 暴露远程服务:<br>
     * 1. 协议在接收请求时,应记录请求来源方地址信息:RpcContext.getContext().setRemoteAddress();<br>
     * 2. export()必须是幂等的,也就是暴露同一个URL的Invoker两次,和暴露一次没有区别。<br>
     * 3. export()传入的Invoker由框架实现并传入,协议不需要关心。<br>
     * 
     * @param <T> 服务的类型
     * @param invoker 服务的执行体
     * @return exporter 暴露服务的引用,用于取消暴露
     * @throws RpcException 当暴露服务出错时抛出,比如端口已占用
     */
    <T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
 
    /**
     * 引用远程服务:<br>
     * 1. 当用户调用refer()所返回的Invoker对象的invoke()方法时,协议需相应执行同URL远端export()传入的Invoker对象的invoke()方法。<br>
     * 2. refer()返回的Invoker由协议实现,协议通常需要在此Invoker中发送远程请求。<br>
     * 3. 当url中有设置check=false时,连接失败不能抛出异常,需内部自动恢复。<br>
     * 
     * @param <T> 服务的类型
     * @param type 服务的类型
     * @param url 远程服务的URL地址
     * @return invoker 服务的本地代理
     * @throws RpcException 当连接服务提供方失败时抛出
     */
    <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
 
}

3、扩展配置

<!-- 声明协议,如果没有配置id,将以name为id -->
<dubbo:protocol id="xxx1" name="xxx" />
<!-- 引用协议,如果没有配置protocol属性,将在ApplicationContext中自动扫描protocol配置 -->
<dubbo:service protocol="xxx1" />
<!-- 引用协议缺省值,当<dubbo:service>没有配置prototol属性时,使用此配置 -->
<dubbo:provider protocol="xxx1" />

4、已知扩展

  • org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol
  • org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
  • org.apache.dubbo.rpc.protocol.rmi.RmiProtocol
  • org.apache.dubbo.rpc.protocol.http.HttpProtocol
  • org.apache.dubbo.rpc.protocol.http.hessian.HessianProtocol

5、扩展示例

5.1 Maven项目结构:

src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxProtocol.java (实现Protocol接口)
                |-XxxExporter.java (实现Exporter接口)
                |-XxxInvoker.java (实现Invoker接口)
    |-resources
        |-META-INF
            |-dubbo
                |-org.apache.dubbo.rpc.Protocol (纯文本文件,内容为:xxx=com.xxx.XxxProtocol)

5.2 SolomonProtocol.java:

package com.xxx;
 
import org.apache.dubbo.rpc.Protocol;
 
public class SolomonProtocol implements Protocol {
    public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
        return new SolomonExporter(invoker);
    }
    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
        return new SolomonInvoker(type, url);
    }
}

5.3 SolomonExporter.java:

package com.xxx;
 
import org.apache.dubbo.rpc.support.AbstractExporter;
 
public class SolomonExporter<T> extends AbstractExporter<T> {
    public SolomonExporter(Invoker<T> invoker) throws RemotingException{
        super(invoker);
        // ...
    }
    public void unexport() {
        super.unexport();
        // ...
    }
}

5.4 SolomonInvoker.java:

package com.xxx;
 
import org.apache.dubbo.rpc.support.AbstractInvoker;
 
public class SolomonInvoker<T> extends AbstractInvoker<T> {
    public SolomonInvoker(Class<T> type, URL url) throws RemotingException{
        super(type, url);
    }
    
    @Override
    protected Result doInvoke(Invocation invocation) throws Throwable {
        // ...
    }
}

5.5 元数据

META-INF/dubbo/org.apache.dubbo.rpc.Protocol:

solomon=com.xxx.SolomonProtocol

标签:Dubbo,自定义,dubbo,扩展,throws,rpc,Invoker,apache,public
From: https://blog.csdn.net/alises1314/article/details/140097529

相关文章

  • SpringBoot自定义注解实现接口幂等
    一、前言接口幂等就是对一个接口执行重复的多次请求,与一次请求所产生的结果是相同的。对数据库的查询和删除是天然幂等的,更新操作在大多数场景下也是天然幂等。插入大多数情况下都是非幂等的,除非利用数据库的唯一索引来保证数据不会重复保存。二、为什么需要幂等1.超时重试......
  • 构建高可用性、高性能和可扩展的Zabbix Server架构
    简介本教程讲解了一下如何设计构建一个高性能、高可靠、高扩展的Zabbix监控集群。架构图架构图PDF下载:https://songxwn.com/file/Zabbix_HA.pdfPigsty时序数据库集群ZabbixServer和Grafana的数据都是存放在数据库的,而Zabbix性能很大程度取决于数据库。所以要搭建数据......
  • Laravel Activity Log操作日志扩展包
    LaravelActivityLog操作日志扩展包简介LaravelActionLogs操作日志记录LaravelActivityLog很多数据管理员都想记录他们用户的所有活跃记录。这个包可以很方便的记录你的用户何时何地的创建、更新实体的记录。外加,现在这个包还可以记录多个版本的实体间数据的变更。......
  • 全网最适合入门的面向对象编程教程:06 类和对象的Python实现-自定义类的数据封装
    全网最适合入门的面向对象编程教程:06类和对象的Python实现-自定义类的数据封装摘要:本文我们主要介绍了数据封装的基本概念和特性,如何设置自定义类的私有属性和私有方法,protect属性的概念和特点。往期推荐:学嵌入式的你,还不会面向对象??!全网最适合入门的面向对象编程教程:00......
  • PostGreSQL在线扩展PostGIS
    1简介    当需要进行地理信息系统(GIS)查询时,安装和使用PostGIS扩展非常有用。它允许你在PostgreSQL中存储、查询和分析地理和空间数据,例如范围查询、距离计算、地理坐标转换等。使用合适的地理索引来加速查询;考虑将地理数据规范化以降低存储开销;2安装扩展所......
  • 53、Flink 测试工具测试用户自定义函数详解
    1.测试用户自定义函数a)单元测试无状态、无时间限制的UDF示例:无状态的MapFunction。publicclassIncrementMapFunctionimplementsMapFunction<Long,Long>{@OverridepublicLongmap(Longrecord)throwsException{returnrecord+1;}......
  • Cesium 实战 - 自定义纹理材质系列之 - 涟漪效果
    Cesium实战-自定义纹理材质系列之-涟漪效果核心代码完整代码在线示例Cesium给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求;但是作为WebGL引擎,肯定不够丰富,尤其是动态效果样式。对于实体对象(Entity),可以通过自定义材质,实现各种动态效果,虽......
  • Dubbo源码解析-熔灾机制
    上篇我们介绍了消费端负载均衡的原理Dubbo源码解析-负载均衡-CSDN博客    因为篇幅问题,本文主单独Dubbo消费端负载均原理,从dubbo源码角度进行解析。    大家可以好好仔细读一下本文。有疑问欢迎留言。    接着说明,读Dubbo源码最好是先对Spring源......
  • C# WinForm给ToolStrip工具栏扩展一个CheckBox单选框类型按钮的方法
    [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)]publicpartialclassToolStripCheckBox:ToolStripItem{privateboolIsChecked=false;publicboolHasChecked{get......
  • C29 在GEE中扩展运算规模
    当EarthEngine用户从教程转向开发自己的处理脚本时,他们会遇到可怕的错误消息,“计算超时”或“用户内存限制超出”。本节主要内容:了解GEE资源使用的限制条件。熟悉扩展地球引擎操作的多种策略。管理大型项目和多阶段工作流程。识别何时使用PythonAPI可能有利于执行大量任......