源码
概述
当我们期望开发一个高性能的基于tcp的通讯框架时(例如:自研一个rpc调用框架或者封装一个并发量为百万级的游戏通讯框架),虽然netty已经极大程度上帮我们封装了nio,但面对netty仍需要我们学习、踩坑。因此,我们将netty进一步封装简化,使用极少的代码(比例,10行左右)就可快速开发一个服务端和客户端。基于该框架,我们开发了内网穿透工具
快速上手
//创建一个服务端 Server server = Server.create(8888); //定义一个控制器,和springmvc类似 server.addController(new Object() { //定义一个接口,参数必须是Request类型,返回值必须是Serializable或Promise类型,并使用@Mapping进行注解 @Mapping("/test") public String test(Request request) { return "你好:" + request.getBody(); } }); //启动服务 server.start().syncR();
//创建一个客户端并启动 Client client = Client.create("localhost",8888).start().syncR(); //发起请求并获取返回值 String r = (String)client.request("/test","张三").syncR();
更丰富的操作
1. 客户端也支持添加controller,由服务端调用客户端
client.addController(new Object(){....});
2. 客户端支持向服务端注册,并且支持元数据
//"?"后面的为元数据
Client.create("localhost",8888,"客户端名称?power=100").start().syncR();
3. 服务端支持调用客户端的接口
server.request("客户端名称","/test","张三").syncR();
4.服务端支持自定义客户端选择器,应用于多客户端注册的情形。选择器可依据客户端注册时的元数据进行筛选。
server.setChannelSelector(new ChannelSelector(){...})
5.客户端和服务端都支持广播模式,即消息投递出去无响应
client.broadcast("/test","数据");
特殊类说明
1.Promise
这是一种特殊的数据类型,参考前端中的Promise,可异步加收响应结果。也可阻塞等待结果返回。
2.Request
这是服务端和客户端交互的请求封装,可获取请求中的消息。
3.RequestContext
请求上下文,可获取当前请求