瘟疫期间在家宅出的 RPC 框架

半腔热情 提交于 2020-02-27 06:31:27

TIANAI-RPC

  • https://gitee.com/tianai/tianai-rpc TIANAI-RPC 码云地址

  • https://gitee.com/tianai/tianai-rpc-springboot-starter TIANAI-RPC 的springboot快速启动包

  • 如果有兴趣想一起参与的小伙伴欢迎加QQ群:1021884609

  • 笔者为什么写这个RPC框架呢?? 这一切都要从一只蝙蝠说起... 苦思冥想一晚上不得解, 为什么要吃蝙蝠? 难道是想上天???

  • 瘟疫满天飞

  • 工作不得找

  • 花呗天天催

  • 血从心中流

笔者在兼职都找不到,工作又找不到的双重鼓励下

笔者头悬梁锥刺股耗尽心血写出这个看似很牛x的RPC框架


​ 该RPC框架目前实现有

  • 基于zookeeper的服务注册
  • 增加基于nacos的服务注册
  • 基于Netty实现的远程通讯
  • 基于hessian2实现的序列化、反序列化
  • 实现了基于轮询策略的负载均衡
  • 使用Netty自带的心跳机制实现心跳机制
  • 实现网络抖动后造成的链接断开后重连

该RPC框架的稳定性通过本人基本测试,亦可用于中小型rpc通讯,比dubbo更加轻量

TIANAI-RPC基本使用

  • server端:
public class RpcServerImplTest2 {
	 public static void main(String\[\] args) throws InterruptedException {
		 ServerBootstrap serverBootstrap = new ServerBootstrap();
		 serverBootstrap.codec("hessian2")
		 .timeout(5000)
		 // 设置服务注册为zookeeper, 支持zookeeper和nacos两个服务注册
		 .registry(new URL("zookeeper", "127.0.0.1", 2181))
		 .server("netty")
		 .port(20881)
		 .start();
		 // 注册
		 serverBootstrap.register(Demo.class, new DemoImpl());
		 System.out.println("启动成功");
	 	TimeUnit.HOURS.sleep(1);
	 }
}
  • 客户端
public class RpcClientTest {
	 public static void main(String\[\] args) {
		 RpcClientConfiguration prop = new RpcClientConfiguration();
		 // 序列化,默认是hessian2
		 prop.setCodec("hessian2");
		 // 超时,默认是5000
		 prop.setTimeout(5000);
		 // 请求超时,默认是3000
		 prop.setRequestTimeout(3000);
		 // 设置客户端为netty, 默认是netty
		 prop.setProtocol("netty");

		 // 服务注册,目前支持 zookeeper和nacos两个, 默认是zookeeper 
		 // 设置服务注册 , 为nacos
		 // URL nacosConf = new URL("nacos", "127.0.0.1", 8848);
		 // nacosConf = nacosConf.addParameter("namespace", "1ca3c65a-92a7-4a09-8de1-4bfe1c89d240");

		 // 设置服务注册 为zookeeper
		 prop.setRegistryUrl(new URL("zookeeper", "127.0.0.1", 2181));
		 // 注册器
		 // 远程 客户端
		 RpcProxy<Demo> rpcProxy = new JdkRpcProxy<>();
		 Demo proxy = rpcProxy.createProxy(Demo.class, prop, true, true);
		 for (int i = 0; i < 20; i++) {
		 // 执行RPC请求
			 String res = proxy.sayHello();
			 System.out.println("rpc调用返回数据:" + res);
		 }
	 }
}

和springboot整合版本

https://gitee.com/tianai/tianai-rpc-springboot-starter 码云地址

使用方式:

  • server端

  1. springboot项目中导入依赖:
    <dependency>  
     <groupId>cloud.tianai.rpc</groupId>  
     <artifactId>tianai-rpc-springboot-starter</artifactId>  
     <version>1.2.1</version>  
    </dependency>
  1. 相关配置
tianai-rpc:
  # 服务注册, 默认 zookeeper
  registry: 
    name: zookeeper # 支持zookeeper和nacos
    # 服务注册的地址, 默认 127.0.0.1:2181
    address: 127.0.0.1:2181 # 地址
    # otterProp: 配置nacos一些其他配置时这样配置,比如配置namespace 
     #  namespace: xxx
  # 序列化 默认hessian2
  codec: hessian2
  server:
    # server端是否启动, 如果使用rpcServer,必须设置为true, 默认是false
    enable: true
    # server端启动时的端口, 默认20881
    port: 20883
    # 超时,单位 ms
    timeout: 5000
  1. 要提供RPC服务的类上加上 @RpcProvider注解即可
@Service
@RpcProvider
public class DemoServiceImpl implements DemoService {

}
  • client端

    1. 相关配置
   tianai-rpc:
  registry: 
    # 指定服务注册 为nacos,默认zookeeper
    name: nacos
    # 指定注册地址 默认 127.0.0.1:2181
    address: 127.0.0.1:8848
    otterProp:
      # 配置nacos命名空间
      namespace: 1ca3c65a-92a7-4a09-8de1-4bfe1c89d240
  # 指定序列化,默认hessian2
  codec: hessian2
2.  要使用RPC服务的接口的field中加上 **@RpcConsumer** 注解即可
    @RestController
    public class DemoController {
        @RpcConsumer
        private DemoService demoService;

        @GetMapping("/port")
        public Integer getPort() {
            demoService.toString();
            return demoService.getPort();
        }
    }

一些其他的相关配置详见:

  • RpcConsumerProperties.java
  • RpcProperties.java
  • RpcProviderProperties.java
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!