概述
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的底层原理-浅显易懂所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复