zoukankan      html  css  js  c++  java
  • SOFA 数据透析

    数据透传:

    在 RPC调用中,数据的传递,是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以,在一些场景下,我们希望,能够更通用的传递一些参数,比如一些标识性的信息。业务方可能希望,在每一次调用请求中都能够传递一些自定义的信息到下游。甚至也希望下游能够将一些数据传递回来。

    数据透传功能,就是指数据不需要以作为方法参数的形式在调用链路中进行传递,而是直接存储到调用上下文中,之后通过 RPC 的内置对象,进行传递,调用双端可从上下文中获取数据而不需要去关注数据的传输过程。

    ==》SOFARPC 提供的数据透传支持请求数据透传(客户端向服务端)和响应数据透传(服务端向客户端)。

    SOFARPC 设计原理

    1. 用户通过 SOFARPC 提供的 API 进行数据传递设置
    2. SOFARPC 在调用传输前,将透传的数据进行打包获取
    3. 进行正常的序列化和反序列化
    4. SOFARPC 在反序列化时将用户设置的透传数据写回 Context
    5. 服务端用户即可进行获取使用

    数据透传使用例子=====》

    接口服务----》

    public interface HelloService {
        String sayHello(String string);
    }

    服务实现----》

    public class HelloServiceImpl implements HelloService {
        @Override
        public String sayHello(String string) {
            // 获取请求透传数据并打印
            System.out.println("service receive reqBag -> " + RpcInvokeContext.getContext().getRequestBaggage("req_bag"));
            // 设置响应透传数据到当前线程的上下文中
            RpcInvokeContext.getContext().putResponseBaggage("resp_bag", "s2c");
            return "hello " + string + " !";
        }
    }

    sync 调用下的透传:

    请求透传数据

    1. 客户端首先在 main 线程中设置请求透传数据到其调用上下文RpcInvokeContext.requestBaggage属性中,之后在调用过程中从requestBaggage中取出请求透传数据并设置到SofaRequest.requestProps属性中;
    2. 服务端接收到请求SofaRequest对象后,在其调用链中的 ProviderBaggageFilter#invoke 方法中会先从SofaRequest.requestProps中取出请求透传数据并设置到当前服务端线程的调用上下文RpcInvokeContext.requestBaggage属性中,最后业务代码就可以从调用上下文中获取请求透传数据了。

    响应透传数据

    1. 服务端设置响应透传数据到其调用上下文RpcInvokeContext.responseBaggage属性中,之后在ProviderBaggageFilter#invoke 方法中先从responseBaggage中取出响应透传数据并设置到SofaResponse.responseProps属性中;
    2. 客户端main线程被唤醒后,先从SofaResponse.responseProps中获取响应透传数据,之后将响应透传数据设置到其调用上下文RpcInvokeContext.responseBaggage中,最后业务代码就可以从调用上下文中获取响应透传数据了。

    oneway 调用下的透传

    在 oneway 模式下,客户端不接受服务端响应,也不会获取响应透传数据。

    future 调用下的透传

    客户端获取响应透传数据

    future 模式在 SOFARPC 内部会被转化为 callback 的方式进行调用,在 callback 对象中会存储main线程的调用上下文;当客户端接收到响应时,会执行该 callback 对象的回调函数,在其回调函数中,对于响应透传数据,会做如下操作:

    1. SofaResponse.responseProps中获取响应透传数据
    2. 从 callback 对象中获取 main 线程的调用上下文
    3. 设置响应透传数据到 main 线程的调用上下文
    4. 将 main 线程上下文拷贝到当前的回调线程中

    callback 调用下的透传

    最终业务代码中是从回调线程而不是main线程的调用上下文中获取响应透传数据。

     
  • 相关阅读:
    springboot自定义jar打包不能导入到项目中
    ajax上传文件+传json数据
    cooladmin vitevue3 打包部署 nginx代理设置
    istio 安装
    logging
    orm 多对多
    shell 多线程
    舒服的jenkins子节点
    phpfpm coredump
    drf 自定义异常
  • 原文地址:https://www.cnblogs.com/KL2016/p/14595700.html
Copyright © 2011-2022 走看看