rpc调用过程原理分析以及Dubbo、Feign调用过程

public class UserServiceImpl implements UserService {

public String getUserNameById(Long userId) {

return userId > 0 ? “向振华” : “无名”;

}

}

服务提供者RPC通信类,采用socket通信

public class RpcHandler {

public void run() throws Exception {

ServerSocket serverSocket = new ServerSocket(8081);

while (true) {

Socket socket = serverSocket.accept();

// 将请求体反序列化

ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());

Object object = objectInputStream.readObject();

// 服务调用

Object result = null;

if (object instanceof RpcRequest) {

RpcRequest rpcRequest = (RpcRequest) object;

if (“getUserNameById”.equals(rpcRequest.getMethodName())) {

UserService userService = new UserServiceImpl();

result = userService.getUserNameById(rpcRequest.getParameter());

} else {

throw new RuntimeException(“method not found”);

}

}

// 结果返回

ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());

objectOutputStream.writeObject(result);

}

// TODO socket.close(); serverSocket.close();

}

}

然后启动服务提供者

public class ProviderTest {

public static void main(String[] args) throws Exception {

new RpcHandler().run();

}

}

服务调用者,用户接口的实现,这里是通过RPC方式调用

public class RpcUserServiceImpl implements UserService {

public String getUserNameById(Long userId) {

try {

Socket socket = new Socket(“127.0.0.1”, 8081);

// 将请求体序列化并发给服务提供方

RpcRequest rpcRequest = new RpcRequest(“getUserNameById”, userId);

ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());

objectOutputStream.writeObject(rpcRequest);

// 将响应体反序列化

ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());

Object response = objectInputStream.readObject();

// 返回结果

return (String) response;

} catch (Exception e) {

return null;

}

// TODO socket.close();

}

}

服务调用者测试类

public class ConsumerTest {

public static void main(String[] args) {

UserService userService = new RpcUserServiceImpl();

System.out.println(userService.getUserNameById(1L));

System.out.println(userService.getUserNameById(-1L));

}

}

启动服务端,然后再运行客户端测试类,即可得到结果。通过这个demo可以了解到RPC远程调用的大致流程,但是真正的RPC框架远不止这么简单。

真正的RPC会对接口代理、对请求信息统一封装通过反射实例化,通过注册中心维护服务器实例,通过负载均衡提供服务的灵活性和可用性,另外还有监控、拦截器、日志等等。

Dubbo

=====

版本:2.7

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

接下来看看Dubbo服务调用过程

Dubbo整体设计

图片来源于:https://dubbo.apache.org/zh/docs/v2.7/dev/design/

各层说明

  • config 配置层:对外配置接口,以 ServiceConfigReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类

  • proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy 为中心,扩展接口为 ProxyFactory

  • registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 RegistryFactoryRegistryRegistryService

  • cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 ClusterDirectoryRouterLoadBalance

  • monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactoryMonitorMonitorService

  • protocol 远程调用层:封装 RPC 调用,以 InvocationResult 为中心,扩展接口为 ProtocolInvokerExporter

  • exchange 信息交换层:封装请求响应模式,同步转异步,以 RequestResponse 为中心,扩展接口为 ExchangerExchangeChannelExchangeClientExchangeServer

  • transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 ChannelTransporterClientServerCodec

  • serialize 数据序列化层:可复用的一些工具,扩展接口为 SerializationObjectInputObjectOutputThreadPool

整个调用链如下图所示

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

14444326851)]

⑧使用网络:

[外链图片转存中…(img-FXt6Nc2b-1714444326852)]

⑨高级网络配置:

[外链图片转存中…(img-Mq5tn78t-1714444326852)]

⑩安全:

[外链图片转存中…(img-oqHdJ1gS-1714444326852)]

⑪底层实现:

[外链图片转存中…(img-yUjcbuxF-1714444326853)]

⑫其他项目:

[外链图片转存中…(img-zYfskz3V-1714444326853)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值