From 092939135b535605759a8c12d67ab8490b12f74d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=B4=81?= <13799369482@139.com> Date: Fri, 2 Feb 2018 11:06:43 +0800 Subject: [PATCH] update README.md by tangjie update README.md by tangjie --- README.md | 25 +------------------------ docs/chain.jpg | Bin 0 -> 34657 bytes 2 files changed, 1 insertion(+), 24 deletions(-) create mode 100644 docs/chain.jpg diff --git a/README.md b/README.md index 24b09c6..da94092 100644 --- a/README.md +++ b/README.md @@ -107,30 +107,7 @@ high performance java rpc server base on netty framework,using kryo,hessian,prot ## NettyRPC 2.8 Build 2018/2/2 **在NettyRPC 2.7的基础上,加入RPC请求过滤器链和监听器链功能** -* 通过监听器链和过滤器链,可以对RPC客户端请求进行过滤和监听。具体调用流程图如下所示: - -|------------------------------------------------------------------------------------------------------| - -| RPC客户端发起请求--> |(NettyRPC客户端) - -|------------------------------------------------------------------------------------------------------| - - | - - \|/ - -|------------------------------------------------------------------------------------------------------| - -| 链式过滤器1(ChainFilter) -->链式过滤器2(ChainFilter) ....-->链式过滤器N(ChainFilter)--> | - -| 链式监听器1(ModuleListener)-->链式监听器2(ModuleListener)....-->链式监听器N(ModuleListener)--> |(NettyRPC服务端) - -| 过滤器(Filter)--> | - -| RPC服务器响应请求 | - -|------------------------------------------------------------------------------------------------------| - +* 通过监听器链和过滤器链,可以对RPC客户端请求进行过滤和监听。具体参考[NettyRPC入门手册](https://github.com/tang-jie/NettyRPC/wiki/NettyRPC%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97)中的“链式处理”章节。 * 过滤器链封装类(com.newlandframework.rpc.filter.ModuleFilterChainWrapper)、监听器链封装类(com.newlandframework.rpc.listener.ModuleListenerChainWrapper)通过spring依赖注入。 * NettyRPC内置了一些链式过滤器:com.newlandframework.rpc.filter.support.ClassLoaderChainFilter、com.newlandframework.rpc.filter.support.EchoChainFilter,以及链式监听器:com.newlandframework.rpc.listener.support.ModuleListenerAdapter。具体可以根据需求进行扩展添加。 diff --git a/docs/chain.jpg b/docs/chain.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b93a3efb226398051eb00a4f61f06114df8b041 GIT binary patch literal 34657 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 LEMva|zK{PObv)A< literal 0 HcmV?d00001