zoukankan      html  css  js  c++  java
  • XXL-RPC原理分析

    背景

    RPC(Remote Procedure Call Protocol,远程过程调用),调用远程服务就像调用本地服务,在提供远程调用能力时不损失本地调用的语义简洁性;

    一般公司,尤其是大型互联网公司内部系统由上千上万个服务组成,不同的服务部署在不同机器,跑在不同的JVM上,此时需要解决两个问题:

    • 1、如果我需要依赖别人的服务,但是别人的服务在远程机器上,我该如何调用?
    • 2、如果其他团队需要使用我的服务,我该怎样发布自己的服务供他人调用?

    “XXL-RPC”可以高效的解决这个问题:

    • 1、如何调用:只需要知晓远程服务的stub和地址,即可方便的调用远程服务,同时调用透明化,就像调用本地服务一样简单;
    • 2、如何发布:只需要提供自己服务的stub和地址,别人即可方便的调用我的服务,在开启注册中心的情况下服务动态发现,只需要提供服务的stub即可;

    客户端(Client): 服务的调用方。

    服务端(Server):真正的服务提供者。

    客户端Stub:存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。

    服务端Stub:接收客户端发送过来的消息,将消息解包,并调用本地的方法。

    Stub封装了远程调用的一些细节,使开发者进行远程调用的时候,就像调用本地接口一样。

    客户端stub

    代码位置参考(可在idea中全局搜索)

    服务注册与发现 :

      每隔10s钟服务就会像注册中心注册一下,用来更新updateTime

        参考代码: boolean ret = registryBaseClient.registry(new ArrayList<XxlRpcAdminRegistryDataParamVO>(registryData));

        心跳检测:不断更新updateTime,与当前时间差距30S就会删除:

        参考代码:xxlRpcRegistryDataDao.cleanData(registryBeatTime * 3);

      服务发现是在客户端本地发现的,

        参考代码:invokerFactory.getRegister().discovery(serviceKey);

          会有轮询去请求注册中心,更新本地缓存 如服务被禁用(discoveryData) 且注册中心从文件xxl.rpc.registry.data.filepath中拿,会有线程维护文件和db的一致性

        参考代码:com.xxl.rpc.core.registry.impl.xxlrpcadmin.XxlRpcAdminRegistryClient#refreshDiscoveryData

      检查注册中心数据 不断的从本地队列拿数据registryQueue.take();去check注册中心的数据

        参考代码:checkRegistryDataAndSendMessage(xxlRpcRegistryData);

    负载均衡 finalAddress = loadBalance.xxlRpcInvokerRouter.route(serviceKey, addressSet);

    发送请求 clientInstance.asyncSend(finalAddress, xxlRpcRequest);

    序列化 byte[] requestBytes = serializer.serialize(xxlRpcRequest);

    服务端stub

    反射调用代码位置参考(可在idea中全局搜索)

    // invoke + response                
    XxlRpcResponse xxlRpcResponse = xxlRpcProviderFactory.invokeService(xxlRpcRequest);                
    // response serialize               
    byte[] responseBytes = xxlRpcProviderFactory.getSerializerInstance().serialize(xxlRpcResponse);

    引用

    源码地址:https://gitee.com/xuxueli0323/xxl-rpc?_from=gitee_search

    stub理解:https://www.jianshu.com/p/9ccdea882688

  • 相关阅读:
    Java 开发环境配置
    JDBC数据批处理
    knockout.js简单实用教程1
    angular 入门教程1
    knockout简单实用教程3
    knockout简单实用教程2
    autofac使用笔记
    MVC WEB api 自动生成文档
    Unity IOC注入详细配置(MVC,WebApi)
    为什么php往mongo里插入整型数字8,变成了numberint(8)
  • 原文地址:https://www.cnblogs.com/ssskkk/p/14891061.html
Copyright © 2011-2022 走看看