# nettyWork **Repository Path**: zhayan/netty-work ## Basic Information - **Project Name**: nettyWork - **Description**: netty模拟rpc服务,并模拟多服务端负载均衡 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-12-01 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # nettyWork #### 介绍 netty模拟rpc情况下的服务负载均衡 #### 模块化 1. module-api:通用pojo、接口定义 2. module-rpc:rpc的核心包 3. module-provider*:多个生成者 4. module-consumer:消费者 #### 接入方法 ##### 服务端provider 1. @ComponentScans(value = {@ComponentScan("wsz.rpc.provider")}):扫描核心组件 2. @Autowired RpcServer rpcServer 3. CommandLineRunner.run(host,ip):直接启动即可 4. service实现类需提供注解@RpcService/@ChannelHandler.Sharable ![服务端启动](doc/provider.png) ##### 客户端consumer 1. @ComponentScans(value = {@ComponentScan("wsz.rpc.consumer")}):扫描核心组件 2. controller层生成代理Service 3. 使用proxyObject进行业务调用 ![服务端启动](doc/consumer1.png) ![服务端调用](doc/consumer2.png) #### 模拟结果 [模拟视频](doc/nettyWork运行结果.mkv) ##### provider1 1. springboot:启动端口8081 2. netty绑定端口:127.0.0.1:8082 3. UserServiceImpl:![数据](doc/provider1Data.png) ##### provider2 1. springboot:启动端口8083 2. netty绑定端口:127.0.0.1:8084 3. UserServiceImpl:![数据](doc/provider2Data.png) ##### consumer 1. springboot:启动端口8080 2. RpcClient端口:netty.server=127.0.0.1:8082,127.0.0.1:8084 3. GET localhost:8080/user/*,请求结果随机访问2个服务端 ##### RPC ##### 自定义协议:wsz.rpc.common 1. 自定义协议RpcRequest、RpcResponse ##### provider:wsz.rpc.provider 项目启动后,获取所有@RpcService注解的bean并缓存 1. 提供RPC服务端的业务 2. RpcServerHandler接收netty的读事件,消息内容为RpcRequest序列化后的字符串 3. RpcRequest对象反序列化,获取传输的参数 4. 根据参数获取对应的bean,然后反射调用对应method,执行业务 5. 业务结果数据封装成RpcResponse对象的字符串并netty传输 ##### consumer:wsz.rpc.consumer 客户端调用支持负载均衡:netty.server: host:port,host.port 1. RpcClientProxy:通过代理生成RpcRequest对象 2. RpcClient.send传递参数 3. RpcClientHandler进行netty通信,传输信息为RpcRequest序列化后的字符串 4. RpcClient.send,线程阻塞等待结果,返回代理调用后的结果 #### 项目总结 1. 进行了模块化处理 2. 客户端暂时只支持随机的负载均衡调用netty 3. 客户端controller层调用可以继续优化,需要2步获取代理对象