RPC的底层原理-浅显易懂

1. 什么是RPC?

RPC(Remote Procedure Call)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术。从本质上来说Web项目+JSON的数据格式也是一种RPC。

2.通过现象看本质

不管是 Spring Cloud还是Dubbo,你使用的时候可能都会发现调用方只是使用了接口。

Spring Cloud的调用:

@FeignClient(name = "服务名称",path = "路径")
public interface CgChannelApi {
    @GetMapping(value = "/list", produces = {"application/json"})
    ResultDTO<List<ChannelResDto>> listChannel(@ApiIgnore @RequestParam Map<String, Object> params);
}

Dubbo的调用:

引用服务提供方提供的接口jar包。配置消费者:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app"  />
 
    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
 
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" />
</beans>

从上面的可以发现调用方都使用的是接口。

问题:接口如何将数据发送到服务端,接口如何获取传入的数据?

3. RPC的底层原理

RPC的底层原理:通过接口动态代理实现获取接口的传入的数据,然后通过网络根据自定义的协议发送到服务提供方。服务提供方处理后后返回结果。

3.1 接口动态代理获取数据

用cglib代理为例子:

public class EnhancerForSampleClassApplication {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(A.class);
        enhancer.setCallback(new MxsmPoxy());
        A a = (A)enhancer.create();
        a.aaa("bbb");
    }
   public interface A{

        public void aaa(String aaa);

   }
   public static  class MxsmPoxy implements MethodInterceptor{
       @Override
       public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
           System.out.println( method.getName());
           System.out.println(args[0]);
           return null;
       }
   }
}

通过上面的例子就能看出来,在 intercept 方法中就能获取到接口中传入的数据。如上面例子 a.aaa("bbb"); 调用那么 MxsmPoxy#intercept 中的 System.out.println(args[0]); 打印的是 "aaa"

3.2 发送数据到服务端

MxsmPoxy#intercept 方法中,通过自定义协议将数据按照协议发送到服务端,调用对应的服务。服务端处理完成返回结果然后从接口返回。发送到服务端消息可以通过TCP、或者HTTP协议。这个看实现。例如Dubbo 2.x版本是使用的TCP,而Spring cloud feign 使用的HTTP协议。这里还涉及到负载均衡、服务端地址获取等等。

4. 总结

RPC涉及到的技术:

  • 动态代理
  • 序列化和反序列化
  • 网络通信,TCP或者HTTP
  • 服务注册
  • 负载均衡
  • 对于通信用TCP,客户端与服务端的连接维持。

我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值