当前位置:   article > 正文

框架扩展:注解 RPC Consumer属性动态注入_@rpcconsumer

@rpcconsumer

分布式系统架构时代,RPC框架你一定不会陌生。目前主流的RPC框架有 dubbo、thrift、motan、grpc等。

消费端(RPC Consumer)通常只有服务接口定义,接口的业务逻辑实现部署在生产端(RPC Provider),服务调用一般是采用动态代理方式,通过Proxy创建一个代理类,借助增强方式完成网络的远程调用,获取执行结果。

这里有两个关键点:

1、如何实现一个通用的代理类?

2、如何在消费端动态注入接口的代理对象?

如何实现一个通用的代理类?

目前动态代理的实现方案有很多种,如JDK 动态代理、Cglib、Javassist、ASM、Byte Buddy等

JDK 动态代理的代理类是运行时通过字节码生成的,我们通过Proxy.newProxyInstance方法获取的接口实现类就是这个字节码生成的代理类

定义代理类RpcInvocationHandler,继承InvocationHandler接口,并重写invoke()方法。

  1. public class RpcInvocationHandler implements InvocationHandler {
  2.     private final String serviceVersion;
  3.     private final long timeout;
  4.     public RpcInvocationHandler(String serviceVersion, long timeout) {
  5.         this.serviceVersion = serviceVersion;
  6.         this.timeout = timeout;
  7.     }
  8.     @Override
  9.     public Object invoke(Object proxy, Method methodObject[] args) {
  10.         // todo
  11.         // 1、封装RpcProtocol对象
  12.         // 2、对象编码
  13.         // 3、发送请求到服务端
  14.         // 4、获取返回结果
  15.         // 模拟生成一个订单号
  16.         Long orderId = Long.valueOf(new Random().nextInt(100));
  17.         String s = String.format("【RpcInvocationHandler】 调用方法:%s , 参数:%s ,订单id:%d"method.getName(), JSON.toJSONString(args), orderId);
  18.         System.out.println(s);
  19.         return orderId;
  20.     }

如何在消费端动态注入接口的代理对象?

构造一个自定义Bean,并对该Bean下执行的所有方法拦截,增加额外处理逻辑。

图片

OrderService是一个订单接口类,client端没有该接口的实现类。

定义注解@RpcReference,用于描述代理类的参数信息。

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.FIELD)
  3. @Autowired
  4. public @interface RpcReference {
  5.     String serviceVersion() default "1.0";
  6.     long timeout() default 5000;
  7. }

Spring 的 FactoryBean 接口可以帮助我们实现自定义的 Bean,FactoryBean 是一种特殊的工厂 Bean,通过 getObject() 方法返回对象,而并不是 FactoryBean 本身。

  1. public class RpcReferenceBean implements FactoryBean<Object> {
  2.     private Class<?> interfaceClass;
  3.     private String serviceVersion;
  4.     private long timeout;
  5.     private Object object;
  6.     @Override
  7.     public Object getObject() throws Exception {
  8.         return object;
  9.     }
  10.    
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/424547
推荐阅读
相关标签
  

闽ICP备14008679号