迷你RPC
加入netty支持同步和异步加入zookepper,支持自动发现服务- 支持HA
支持注解配置- 加入Spring测试
- 处理客户端还没有找到服务的情况
public interface HelloService {
public String sayHello(String name);
public List<ServiceData> getData();
}
通过使用RpcServiceImpl
来标记一个服务,提供RPC。
@RpcServiceImpl(HelloService.class)
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
System.out.println("need hello to " + name);
return "need hello to " + name;
}
@Override
public List<ServiceData> getData() {
return Arrays.asList(new ServiceData("test1"),new ServiceData("test2"));
}
}
使用PackageScan
来标记需要扫描并注册服务的Package
。
@PackageScan("com.sgl.impl")
public class PackageConfig {
}
启动服务器
NettyServer server = new NettyServer();
server.bind(9112);
NettyClient client = new NettyClient();
client.connect("localhost", 9112);
HelloService service = client.createProxy(HelloService.class);
System.out.println(service.sayHello("baby coffe"));
通过RpcAsyncListener
来监听结果。
NettyClient client = new NettyClient();
client.connect("localhost", 9112);
RpcFutrue futrue = client.createAsyncCall(HelloService.class,
"sayHello", new Object[] {"this is async call"});
futrue.addResultListener(new RpcAsyncListener() {
@Override
public void onResultArrived(RpcFutrue futrue) {
try {
Object res = futrue.get();
System.out.println("async get res: " + res);
} catch (Exception e) {
e.printStackTrace();
}
}
});
传入Zookeeper的地址,即完成了服务的注册。
NettyServer server = new NettyServer("127.0.0.1:4981");
server.bindAndRegister(9112);
客户端的话,传入Zookeeper地址,会通过Watcher
监听可用的服务地址;注意,如果客户端还没有找到合适的服务,此时调用RPC
会出错。
NettyClient client = new NettyClient("127.0.0.1:4981");