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 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类

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

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

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

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

  • protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter

  • exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer

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

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

整个调用链如下图所示

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

14444326851)]

⑧使用网络:

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

⑨高级网络配置:

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

⑩安全:

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

⑪底层实现:

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

⑫其他项目:

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

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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐