手写RPC框架第三章《RPC中间件》

您所在的位置:网站首页 rpc案例 手写RPC框架第三章《RPC中间件》

手写RPC框架第三章《RPC中间件》

#手写RPC框架第三章《RPC中间件》 | 来源: 网络整理| 查看: 265

# 手写RPC框架第三章《RPC中间件》

作者:小傅哥 博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!😄

# 案例介绍

结合上面两章节,本章将实现rpc的基础功能;提供一给rpc中间件jar给生产端和服务端。 技术点;

注册中心,生产者在启动的时候需要将本地接口发布到注册中心,我们这里采用redis作为注册中心,随机取数模拟权重。 客户端在启动的时候,连接到注册中心,也就是我们的redis。连接成功后将配置的生产者方法发布到注册中心{接口+别名}。 服务端配置生产者的信息后,在加载xml时候由中间件生成动态代理类,当发生发放调用时实际则调用了我们代理类的方法,代理里会通过netty的futuer通信方式进行数据交互。 # 环境准备 jdk 1.8.0 IntelliJ IDEA Community Edition 2018.3.1 x64 windows redis # 代码示例 itstack-demo-rpc-03 └── src └── main │ ├── java │ │ └── org.itstack.demo.rpc │ │ ├── config │ │ ├── domain │ │ ├── network │ │ │ ├── client │ │ │ │ ├── ClientSocket.java │ │ │ │ └── MyClientHandler.java │ │ │ ├── codec │ │ │ │ ├── RpcDecoder.java │ │ │ │ └── RpcEncoder.java │ │ │ ├── future │ │ │ │ ├── SyncWrite.java │ │ │ │ ├── SyncWriteFuture.java │ │ │ │ ├── SyncWriteMap.java │ │ │ │ └── WriteFuture.java │ │ │ ├── msg │ │ │ │ ├── Request.java │ │ │ │ └── Response.java │ │ │ ├── server │ │ │ │ ├── MyServerHandler.java │ │ │ │ └── ServerSocket.java │ │ │ └── util │ │ │ └── SerializationUtil.java │ │ ├── reflect │ │ │ ├── JDKInvocationHandler.java │ │ │ └── JDKProxy.java │ │ ├── registry │ │ │ └── RedisRegistryCenter.java │ │ └── util │ └── resource │ └── META-INF │ ├── rpc.xsd │ ├── spring.handlers │ └── spring.schemas └── test ├── java │ └── org.itstack.demo.test │ ├── service │ │ ├── impl │ │ │ └── HelloServiceImpl.java │ │ └── HelloService.java │ └── ApiTest.java └── resource ├── itstack-rpc-center.xml ├── itstack-rpc-consumer.xml ├── itstack-rpc-provider.xml └── log4j.xml 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

ConsumerBean.java

package org.itstack.demo.rpc.config.spring.bean; import com.alibaba.fastjson.JSON; import io.netty.channel.ChannelFuture; import org.itstack.demo.rpc.config.ConsumerConfig; import org.itstack.demo.rpc.domain.RpcProviderConfig; import org.itstack.demo.rpc.network.client.ClientSocket; import org.itstack.demo.rpc.network.msg.Request; import org.itstack.demo.rpc.reflect.JDKProxy; import org.itstack.demo.rpc.registry.RedisRegistryCenter; import org.itstack.demo.rpc.util.ClassLoaderUtils; import org.springframework.beans.factory.FactoryBean; import org.springframework.util.Assert; /** * http://www.itstack.org * create by fuzhengwei on 2019/5/6 */ public class ConsumerBean extends ConsumerConfig implements FactoryBean { private ChannelFuture channelFuture; private RpcProviderConfig rpcProviderConfig; @Override public Object getObject() throws Exception { //从redis获取链接 if (null == rpcProviderConfig) { String infoStr = RedisRegistryCenter.obtainProvider(nozzle, alias); rpcProviderConfig = JSON.parseObject(infoStr, RpcProviderConfig.class); } Assert.isTrue(null != rpcProviderConfig); //获取通信channel if (null == channelFuture) { ClientSocket clientSocket = new ClientSocket(rpcProviderConfig.getHost(), rpcProviderConfig.getPort()); new Thread(clientSocket).start(); for (int i = 0; i 12345678910111213

itstack-demo-rpc-consumer 提供消费者调用

itstack-demo-rpc-consumer └── src ├── main │ ├── java │ └── resources │ └── spring │ └── spring-itstack-rpc-consumer.xml │ └── test └── java └── org.itstack.demo.test └── ConsumerTest.java 123456789101112

spring-itstack-rpc-consumer.xml

123456789101112

ConsumerTest.java

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/spring-config.xml") public class ConsumerTest { @Resource(name = "helloService") private HelloService helloService; @Test public void test() { String hi = helloService.hi(); System.out.println("测试结果:" + hi); String say = helloService.say("hello world"); System.out.println("测试结果:" + say); Hi hiReq = new Hi(); hiReq.setUserName("付栈"); hiReq.setSayMsg("付可敌国,栈无不胜"); String hiRes = helloService.sayHi(hiReq); System.out.println("测试结果:" + hiRes); } } 12345678910111213141516171819202122232425# 应用,测试结果 测试时启动redis # 启动ProviderTest Redis中的注册数据 redis 127.0.0.1:6379> srandmember org.itstack.demo.rpc.provider.export.HelloService_itstackRpc "{\"alias\":\"itstackRpc\",\"host\":\"10.13.81.104\",\"nozzle\":\"org.itstack.demo.rpc.provider.export.HelloService\",\"port\":22201,\"ref\":\"helloService\"}" redis 127.0.0.1:6379> 123# 执行ConsumerTest中的单元测试方法 log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 测试结果:hi itstack rpc 测试结果:hello world 测试结果:付栈 say:付可敌国,栈无不胜 Process finished with exit code 0 12345678

微信搜索「bugstack虫洞栈」公众号,关注后回复「rpc案例源码」获取本文源码&更多原创专题案例!

在 GitHub 上编辑此页 (opens new window) 上次更新: 2021/10/19

← 手写RPC框架第二章《netty通信》 websocket与下位机通过netty方式通信传输行为信息 →



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3