一个dapeng请求的历程
目前可以通过多种方式来发起一个dapeng请求:
- 通过javaClient或者scalaClient发起请求
- 通过网关dapeng-mesh发起请求
- 通过dapeng-cli发起请求
发起请求的方式也许不同,但是dapeng内部对其处理是殊途同归的,下文将会对一个dapeng请求在dapeng内部的历程进行一个简要的说明。
客户端
一个dapeng请求在客户端的历程可以通过下面的流程图来加以简单的说明:
在创建客户端时,首先会在本地查找相同服务名的客户端信息,如果本地不存在,则会新建客户端信息,并同时将zk上的信息同步到本地(包括运行实例信息、路由信息、配置信息和cookie规则信息),最后将客户端信息注册到本地。
通过同步zk信息到本地,为下一步中getConnection提供了版本、路由、负载均衡等等信息。
1.getConnection :
当一个dapeng请求到来时,首先需要做的是对当前请求的服务版本号进行检查。并通过服务路由和负载均衡来选择服务实例,并建立连接。
2.filters:
通过dapeng的filter机制进行处理:
- headerFilter:空的filter
- shareFilters: 目前在客户端中该filters只包含logFilter,对与日志相关的信息进行处理,例如设置日志的级别
- dispatchFilter: 在该filter中会将收到的请求封装成ByteBuf对象,并将通过构建的NettyClinet将其发送到服务端去处理。
客户端将请求发送到服务端,dapeng采取了同步和异步两种方式来实现。
在同步方式下,待服务端处理完成之后,该filter对返回的ByteBuf对象进行解析得到result。
在异步方式下,该filter直接对服务端返回的CompletableFuture对象进行处理。
3.frameDecode:
粘包和断包处理
服务端
经过客户端处理后的请求,在服务端的历程可以使用一下流程图进行简单的说明:
1.decode:
服务端收到来自客户端的请求,首先需要做的是对该请求进行解码
2.freqControl:
当开启了限流设置时,判断该请求是否被限流
3.filters:
服务端也是通过dapeng的filter机制对请求进行处理:
- headerFilter:空的filter
- shareFilters: 目前在服务端中该filters包含logFilter和slowServiceCheckFiler,logFilter对与日志相关的信息进行处理,例如设置日志的级别,同时将容器的classLoad转换成业务的classLoad;slowServiceCheckFilter则对服务进行慢服务检测
- dispatchFilter: 调用业务处理逻辑对请求进行处理
服务端调用也业务端处理逻辑,dapeng也采取了同步和异步两种方式来实现。
在同步方式下,待业务端处理完成之后,该filter对返回的结果进行处理。
在异步方式下,该filter直接对业务端返回的CompletableFuture对象进行处理。
4.msgEncode:
经过一系列filter处理后,msgEncode对于返回的result进行编码,然后发送到客户端。