我是靠谱客的博主 执着香氛,最近开发中收集的这篇文章主要介绍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,客户端与服务端的连接维持。

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

最后

以上就是执着香氛为你收集整理的RPC的底层原理-浅显易懂的全部内容,希望文章能够帮你解决RPC的底层原理-浅显易懂所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部