killlowkey / rpc-server

A simple RPC framework based on Netty

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

rpc-server

配套文章:RPC 框架设计复盘

rpc-server 是一个基于 Netty 的 RPC 框架

特性

  • 方法调用
    • ASM:通过 ASM 生成字节码,避免了方法调用时反射开销
    • Reflect
    • Method Handle
  • 注册中心
    • Zookeeper
  • 序列化
    • JSON
    • Protobuf
  • 插件式组件
    • 接口限流
    • 健康检查
    • 方法调用统计
  • 负载均衡
    • 轮训
    • 随机
  • 客户端接口动态代理
  • 客户端同步/异步调用
  • 加密传输:SSL/TLS
  • 注解配置扫描
  • 服务别名:一个服务采用多个名称

如何使用

以下例子启动之前,需要生成 Protobuf(执行 mvn clean compile),然后把 Zookeeper 启动

  1. 定义 PersonService 接口,并使用 @RpcClient 注解标记

    @RpcClient
    public interface PersonService {
        String hello();
        String say(String name);
        int age();
    }
  2. 实现 PersonService 接口,并使用 @RpcService 注解标记

    @RpcService
    public class PersonServiceImpl implements PersonService {
        
        public String hello() {
            return "hello world";
        }
    
        public String say(String name) {
            return "hello " + name;
        }
    
        public int age() {
            return 10;
        }
    
    }
  3. 启动服务端

     RpcServer rpcServer = new RpcServerBuilder()
         // 方法调用类型
         .invokeType(InvokeType.ASM)
         // 使用 Zookeeper 注册中心
         .zookeeper("127.0.0.1:2181")
         // 使用 Protobuf 序列化
         .serialize(Serializer.PROTOBUF)
         // 注册服务,还提供扫描包方式注册服务
         .registerComponent(PersonServiceImpl.class)
         .bind(8989)
         .build();
    
     // 启动服务
     rpcServer.start();
  4. 启动客户端,并进行调用

     RpcClientProxy clientProxy = new RpcClientProxy()
             // 使用 Zookeeper 进行服务发现
             .zookeeper("127.0.0.1:2181")
             // 负载均衡策略
             .loadBalance(LoadBalanceStrategy.ROTATION)
             // 序列化
             .serialize(Serializer.PROTOBUF);
    
     // 创建客户端代理
     PersonService personService = clientProxy.createProxy(PersonService.class);
     // 方法调用
     assertEquals("hello world", personService.hello());
     assertEquals("hello tom", personService.say("tom"));
     assertEquals(10, personService.age());

About

A simple RPC framework based on Netty

License:MIT License


Languages

Language:Java 100.0%