往期
- Netty入门(一) — Reactor线程模型,Netty的线程模型,快速入门Demo
- Netty入门(二)— 任务队列,异步模型剖析,Http服务Demo
- Netty入门(三) — Netty核心组件,Netty群聊系统
- Netty入门(四) — 编码和解码,Netty的handler调用机制,TCP粘包和拆包原理和解决
十、Netty实现dubbo RPC
10.1 RPC基本介绍
RPC(Remote Procedure Call) — 远程过程调用,是一个计算机通信协议。
一台计算机可以通过RPC调用另一台计算机的子程序
常见的RPC框架有:阿里的Dubbo,谷歌的gRPC,Go语言的rpcx…
10.2 原理图和流程图
原理图:
![image-20220126171118694](https://i-blog.csdnimg.cn/blog_migrate/7d072fff37cac50d55278b0a94ba90a0.png)
流程图:
在RPC中,Client叫做服务消费者,Server叫做服务提供者
RPC调用流程说明:
- 服务消费方(client)以本地调用方式调用服务
- client stub 接收到调用后负责将方法、参数等封装成能够进行网络传输的消息体
- client stub 将消息进行编码并发送到服务端
- server stub 收到消息后进行解码
- server stub 根据解码结果调用本地的服务
- 本地服务执行并将结果返回给 server stub
- server stub 将返回导入结果进行编码并发送至消费方
- client stub 接收到消息并进行解码
- 服务消费方(client)得到结果
10.3 基于Netty实现dubbo RPC
架构图:
1、先把包和类建好,customer是消费者,provider是提供者,netty是基于Netty实现的连接
2、HelloService和HelloServiceImpl
public interface HelloService {
public String hello(String msg);
}
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String msg) {
System.out.println("接收到客户端消息="+msg);
if (msg!=null){
return "你好客户端,我已经收到你的消息 ["+msg+"]";
} else {
return "你好客户端,你发来的消息是空的";
}
}
}
3、NettyServer和NettyServerHandler,服务器端比较简单
public class NettyServer {
public static void startServer(String host,int port) {
startServer0(host, port);
}
private static void startServer0(String host,int port){
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel