我是靠谱客的博主 执着香氛,这篇文章主要介绍RPC的底层原理-浅显易懂,现在分享给大家,希望可以做个参考。

1. 什么是RPC?

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

2.通过现象看本质

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

Spring Cloud的调用:

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

Dubbo的调用:

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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代理为例子:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部