Dubbo暴露JsonRPC的步骤

简介: Dubbo暴露JsonRPC的步骤

一、背景介绍

最近一个项目需要给node端同学直接提供dubbo访问。

dubbo默认是使用hessian协议的,node是可以直接调用dubbo的默认协议的,或者调用dubbo的其他原生协议。

为什么不考虑直接使用hessian呢,因为hessian是基于http的,消耗巨大,并且会有乱码的问题

所以后端dubbo提供的服务考虑使用jsonrpc协议,但是dubbo原生是不支持jsonrpc协议的,需要在dubbo上进行一些拓展。

这个拓展类可以使用第三方包dubbo-rpc-jsonrpc。

二、JsonRPC介绍

json-rpc是基于json的跨语言远程调用协议,比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、Java-rpc等二进制协议便于调试、实现、扩展,是非常优秀的一种远程调用协议。

 

三、export和import

Dubbo服务端接口export(导出)是将接口信息注册到注册中心Registry的过程。而客户端import(导入)远程接口是通过从注册中心Registry订阅远程服务接口,收到通知后拉取到本地的过程。

注册和订阅的过程,不需要修改服务端本地的类和方法,只需保证客户端和服务端共同引用一个包含接口的jar包。服务端和客户端分别编写简单的dubbo接口配置xml文件(或注解的方式),容器启动时就自动注册和订阅了。

 

四、如何引入JsonRPC

1、引入maven依赖包

<dependency>
      <groupId>com.ofpay</groupId>
      <artifactId>dubbo-rpc-jsonrpc</artifactId>
      <version>1.0.1</version>
      <exclusions>
           <exclusion>
               <groupId>org.springframework</groupId>
               <artifactId>spring</artifactId>
            </exclusion>
      </exclusions>
</dependency>

2、apollo配置

Dubbo.JsonRPC

3、代码实现

3.1、apollo变更的监听

@Component
public class DeviceApolloConfigChangeListener {
    private final LogUtil logger = new LogUtil(this.getClass());
    @Autowired
    private RefreshScope refreshScope;
    @ApolloConfigChangeListener({"Dubbo.JsonRPC"})
    private void dubboChange(ConfigChangeEvent changeEvent) {
        //update injected value of batch if it is changed in Apollo
        Set<String> changes = changeEvent.changedKeys();
        String key = "spring.jsonrpc.beans";
        if(changes.contains(key)){
            logger.info("配置[" + key+"]发生变化:" + changeEvent.getChange(key));
            refreshScope.refresh("apolloDubboConfig");
            ApplicationSmarLifecycle applicationSmarLifecycle = SpringUtil.getBean("applicationSmarLifecycle");
            applicationSmarLifecycle.refresh();
        }
    }
}

3.2、Spring容器所有实例加载完成之后,暴露指定的dubbo服务

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import org.apache.poi.hssf.record.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Component
public class ApplicationSmarLifecycle implements SmartLifecycle {
    private List<ServiceConfig<T>> serviceConfigList  = new ArrayList<>();
    @Autowired
    ApplicationConfig applicationConfig;
    @Autowired
    private RegistryConfig registryConfig;
    @Autowired
    private DubboConfig dubboConfig;
    private boolean isRunning = false;
    private static final Logger logger = LoggerFactory.getLogger(ApplicationSmarLifecycle.class);
    @Override
    public void start() {
        this.init();
        isRunning = true;
    }
    @Override
    public int getPhase() {
        return 0;
    }
    @Override
    public boolean isAutoStartup() {
       //SmartLifecycle子类的才有的方法,当isRunning方法返回true时,该方法才会被调用。
        return true;
    }
    @Override
    public boolean isRunning() {
        return isRunning;
    }
    @Override
    public void stop(Runnable callback) {
        callback.run();
        isRunning = false;
    }
    @Override
    public void stop() {
        isRunning = false;
        serviceConfigList.forEach(serviceConfig->{
            serviceConfig.unexport();
        });
    }
    public void init(){
        ProtocolConfig jsonpcProtocol = new ProtocolConfig();
        jsonpcProtocol.setName(dubboConfig.getJsonrpcName());
        jsonpcProtocol.setPort(dubboConfig.getJsonrpcPort());
        //在这里通过apollo配置哪些dubbo服务需要以JsonRP服务的方式暴露
        List<String> beanNames = Arrays.asList(dubboConfig.getJsonrpcBeans().split(","));
        beanNames.forEach(beanName->{
            ServiceConfig<T> serviceConfig = new ServiceConfig<>();
            serviceConfig.setApplication(applicationConfig);
            serviceConfig.setRegistry(registryConfig);
            //自定义为jsonrpc协议
            serviceConfig.setProtocol(jsonpcProtocol);
            //自定义服务版本号
            serviceConfig.setVersion(dubboConfig.getJsonrpcVersion());
            serviceConfig.setGroup("myGroup");
            //需要暴露jsonrpc的dubbo服务
            serviceConfig.setRef(SpringUtil.getBean(beanName));
            //设置dubbo服务对应的接口
serviceConfig.setInterface(SpringUtil.getBean(beanName).getClass().getInterfaces()[0]);
            serviceConfig.export();
            serviceConfigList.add(serviceConfig);
        });
    }
    //apollo配置有更新时重新发布jsonrpc服务
    public void refresh(){
        this.destroy();
        this.init();
    }
}

五、观察dubbo-admin控制台里参数

dubbo-admin

 


相关文章
|
1月前
|
Dubbo IDE Java
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
这篇文章是关于如何下载和部署Dubbo管理控制台(dubbo-admin)的教程,并分析了2.6.1版本及以后版本的变化。
42 0
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
|
3月前
|
Dubbo 网络协议 Java
深入掌握Dubbo服务提供者发布与注册原理
该文章主要介绍了Dubbo服务提供者发布与注册的原理,包括服务发布的流程、多协议发布、构建Invoker、注册到注册中心等过程。
深入掌握Dubbo服务提供者发布与注册原理
|
3月前
|
负载均衡 Dubbo 应用服务中间件
Dubbo服务调用过程原理
该文章主要介绍了Dubbo服务调用过程的原理,包括服务调用的主要阶段和服务调用的具体步骤。
Dubbo服务调用过程原理
|
6月前
|
Dubbo 数据可视化 Java
从源码全面解析 dubbo 服务暴露的来龙去脉
从源码全面解析 dubbo 服务暴露的来龙去脉
|
6月前
|
存储 XML Dubbo
dubbo(2.7.3) 9.动态中心配置
dubbo(2.7.3) 9.动态中心配置
|
存储 缓存 Dubbo
Dubbo最核心功能——服务暴露的配置、使用及原理(1)
Dubbo最核心功能——服务暴露的配置、使用及原理
207 0
|
XML SQL Dubbo
Dubbo最核心功能——服务暴露的配置、使用及原理(2)
Dubbo最核心功能——服务暴露的配置、使用及原理
205 0
|
XML 存储 缓存
并不简单的代理,Dubbo是如何做服务引用的
并不简单的代理,Dubbo是如何做服务引用的
138 0
|
编解码 负载均衡 监控
Dubbo调用流程学习总结
首先我们知道Dubbo是一个RPC框架,因此解决的问题是服务治理,这个治理是解决服务注册和调用列表的维护治理,产生注册中心维护服务列表和更新,同时方便远程调用和本地调用是一样的,同时方便解耦,我猜这个是dubbo框架产生的初衷吧。而服务的调用和服务的引用是采用网络编程框架Netty,由于其基于NIO,因此其具有很高的性能。同时因为服务的调用和服务的引用,与IM通信或者我们看到的Http请求三次握手是类似的,采用的是应答模式。
147 0
Dubbo调用流程学习总结
|
设计模式 Dubbo Java
dubbo生产者暴露服务流程
在这个过程中,url是我们需要进行关注的,此时我们可以看到基本上都是以url为主题进行组装操作。将所有需要放入的输入进行放入,同时最终会以观察者模式,实现配置的实时更新。低版本的dubbo则是以实现InitializingBean,重写AfterPropertiesSet方法。之所以改成基于ApplicationEvent,是因为可以进行更新,这是ApplicationEvent的优势。 同时通过对bubbo的学习,可以看到Netty的使用。
74 0
dubbo生产者暴露服务流程