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)]