Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


An RPC framework based on Netty, ZooKeeper and Spring
中文详情:Chinese Details


  • Simple code and framework
  • Service registry/discovery support by ZooKeeper
  • High availability, load balance and failover
  • Support different load balance strategy
  • Support asynchronous/synchronous call
  • Support different versions of service
  • Support different serializer/deserializer
  • Dead TCP connection detecting with heartbeat



How to use (netty-rpc-test)

  1. Define an interface:

    public interface HelloService { 
        String hello(String name); 
        String hello(Person person);
  2. Implement the interface with annotation @NettyRpcService:

    @NettyRpcService(HelloService.class, version = "1.0")
    public class HelloServiceImpl implements HelloService {
        public HelloServiceImpl(){}
        public String hello(String name) {
            return "Hello " + name;
        public String hello(Person person) {
            return "Hello " + person.getFirstName() + " " + person.getLastName();
  3. Run zookeeper

    For example: zookeeper is running on

  4. Start server:

    1. Start server with spring config: RpcServerBootstrap
    2. Start server without spring config: RpcServerBootstrap2
  5. Call the service:

    1. Use the client:
    final RpcClient rpcClient = new RpcClient("");
    // Sync call
    HelloService helloService = rpcClient.createService(HelloService.class, "1.0");
    String result = helloService.hello("World");
    // Async call
    RpcService client = rpcClient.createAsyncService(HelloService.class, "2.0");
    RPCFuture helloFuture ="hello", "World");
    String result = (String) helloFuture.get(3000, TimeUnit.MILLISECONDS);
    1. Use annotation @RpcAutowired:
    public class Baz implements Foo {
        @RpcAutowired(version = "1.0")
        private HelloService helloService1;
        @RpcAutowired(version = "2.0")
        private HelloService helloService2;
        public String say(String s) {
            return helloService1.hello(s);