perf[module]: 以TcpServerTest为例子,从头梳理asyncAask的执行流程并添加注释

This commit is contained in:
jianan
2022-07-07 01:08:30 +08:00
parent c2c4ef6320
commit 9753d576a7
12 changed files with 134 additions and 5 deletions
@@ -34,25 +34,53 @@ public class RegistryTest {
@Test
public void registerVoTest() {
// 定义2个模块:可以为服务提供者用,也可以为服务消费者用,这个仅仅是模块信息
var protocolModule1 = new ProtocolModule((byte) 100, "aaa");
var protocolModule2 = new ProtocolModule((byte) 120, "bbb");
// 服务提供者模块列表和服务提供者配置
// 定义2个服务提供者模块
var providerModules = List.of(new ProviderModule(protocolModule1, "a"), new ProviderModule(protocolModule2, "b"));
// 服务器提供者配置:服务提供者的ip + 服务提供者模块
var providerConfig = ProviderConfig.valueOf(HostAndPort.valueOf("127.0.0.1", 80).toHostAndPortStr(), providerModules);
// 服务消费者模块和服务消费者配置(服务消费者模块多一个负载均衡属性)
var consumerModules = List.of(new ConsumerModule(protocolModule1, "random", "a"), new ConsumerModule(protocolModule2, "random", "b"));
// 服务消费者配置:这个是没Ip的
var consumerConfig = ConsumerConfig.valueOf(consumerModules);
var vo = RegisterVO.valueOf("test", providerConfig, consumerConfig);
var voStr = vo.toString();
// test | 127.0.0.1:80 | provider:[100-aaa-a, 120-bbb-b] | consumer:[100-aaa-random-a, 120-bbb-random-b]
System.out.println(voStr);
var newVo = RegisterVO.parseString(voStr);
Assert.assertEquals(vo, newVo);
// /127.0.0.1
System.out.println(NetUtil.LOCALHOST);
// localhost/127.0.0.1
System.out.println(NetUtil.LOCALHOST4);
//localhost/0:0:0:0:0:0:0:1
System.out.println(NetUtil.LOCALHOST6);
// 200
System.out.println(NetUtil.SOMAXCONN);
// name:lo (Software Loopback Interface 1)
System.out.println(NetUtil.LOOPBACK_IF);
}
}
/*
test | 127.0.0.1:80 | provider:[100-aaa-a, 120-bbb-b] | consumer:[100-aaa-random-a, 120-bbb-random-b]
/127.0.0.1
localhost/127.0.0.1
localhost/0:0:0:0:0:0:0:1
200
name:lo (Software Loopback Interface 1)
*/
@@ -40,12 +40,19 @@ public class TcpClientTest {
var context = new ClassPathXmlApplicationContext("config.xml");
var client = new TcpClient(HostAndPort.valueOf("127.0.0.1:9000"));
// 得到连接到服务器的session
var session = client.start();
for (int i = 0; i < 1000; i++) {
var ask = new AsyncMessAsk();
ask.setMessage("Hello, this is async client!");
// Router只是一个接口,它的赋值也是在容器初始化好之后从Spring容器获取到的Router对象
// 要发送网络数据,要通过方法asyncAsk,第一个参数就是要发送消息的session
// 注意:第3个argument参数是当收到消息后,是要要到哪个线程处理,这是CompletableFuture保证的
// 其实这个依然是通过session,然后调用send发送过去的消息
// 最终依然是通过BaseRouteHandler得到响应,只不过attachment不为空,会触发CompletableFuture的completable方法,从而得到回调结果
NetContext.getRouter().asyncAsk(session, ask, AsyncMessAnswer.class, null)
.whenComplete(answer -> {
logger.info("异步请求收到结果[{}]", JsonUtils.object2String(answer));
@@ -29,12 +29,53 @@ public class TcpServerTest {
@Test
public void startServer() {
// 启动流程笔记:
// 首先,这里是xml配置,这样子就会解析xml配置中的标签
// 当遇到自定义标签后,就会触发NamespaceHandler 和 NetDefinitionParser 的自定义标签解析流程
// 接着就会往Spring容器注册相关的各种bean
var context = new ClassPathXmlApplicationContext("config.xml");
// 打印下当前spring管理的bean信息
// 可以得出结论:通过解析自定义标签,往spring容器中自己主动注册的几个
// 和网络有关的全类名的bean(NetConfig、NetContext、ConfigManager、PacketService、Router、Consumer、SessionManager)
String[] beanNames = context.getBeanDefinitionNames();
for (String beanName : beanNames) {
System.out.println(beanName);
}
// 启动起来一个Tcp服务器
// 注意:由于之前往Spring容器中注册的SessionManager,从而可以使用这个bean变量管理所有的连接信息
// 这也是spring的好处:很多东西是解耦的,让SessionManager的初始化交给的是spring,而不是自己从main函数开始一个个组件去初始化
var server = new TcpServer(HostAndPort.valueOf("127.0.0.1:9000"));
server.start();
ThreadUtils.sleep(Long.MAX_VALUE);
}
}
/*
serverPacketController
gatewayProviderController
JProtobufTcpClientController
JProtobufTcpController
providerController
tcpClientController
tcpServerController
tcpAsyncController
tcpSyncController
udpClientPacketController
udpServerPacketController
websocketClientPacketController
websocketServerPacketController
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
com.zfoo.net.config.model.NetConfig
com.zfoo.net.NetContext
com.zfoo.net.config.manager.ConfigManager
com.zfoo.net.packet.service.PacketService
com.zfoo.net.router.Router
com.zfoo.net.consumer.Consumer
com.zfoo.net.session.manager.SessionManager
*/