proxy调用链和核心类
2017-02-27 10:11:11 0 举报
代理调用链是一种设计模式,它允许在不修改原始类代码的情况下,通过代理类对原始类进行增强。核心类是代理调用链中的关键组件,它负责处理请求并将请求转发给相应的处理器。在代理调用链中,核心类通常包含一个处理器列表,用于存储所有可用的处理器。当客户端发送请求时,核心类会根据请求的类型选择合适的处理器来处理请求。如果当前没有合适的处理器,核心类会将请求转发给下一个核心类,直到找到合适的处理器为止。这种设计模式可以有效地解耦客户端和处理器之间的依赖关系,提高系统的可扩展性和可维护性。
作者其他创作
大纲/内容
按照优先级获取filters
Invoker
invoke(Invocation invocation)
lastInvoker.invoke执行filter调用链见过滤器
认证签名simpleProtocolProvider init(json); authenticate(json);
Header
accessKeysignformatversioncodecMethodsignMethod
远程调用monitor统计数据
setRef()接口实现引用构造OpenApiProxy
JacksonJsonProvider
自定义的Provider负责解析http请求数据
AdapterInvoker
ProtocolProcessor protocolProcessorClusterInfo clusterInfoProtocol protocolServiceInfo serviceInfo
谁构造它?谁调用它?
jrs构造结果responseBuilder.entity(ret);responseBuilder.build()
setProtocols创建协议;dubbo和json
ProtocolProvider
buildInvocationForJSON构建invocation
ApiCallInvocationHandler
Object implmethodMap 保存了真正的invoke方法
getInvokers根据serviceInfo创建所有服务提供者(大多数都是一个)AdpaterInvokers
获取了一个adapterInvoker
InvocationHandler
首先调用apiHandlerinvoke(proxy method args)args[0] jsonargs[1] methodmethod为null,不需要该值
JsonHandler
handle
proxyBean 和proxyClass 放入cxfServer
dubbo.rpc.service.GenericServicedubbo范化类
构造severFactoryBean注入以下参数pathproxyClass 根据类信息进行反射调用proxyBean 对象JSON拦截器
若http没有启动启动httpserver
ApiRequest
getAccessorKey()getBody()getSignMethod()getCodecMethod()getSign()
根据method到methodMap找到actualMethod$invoke 对应的dubbo实例方法
ha选择 默认是failoverInvoker负载均衡默认是随机
SimpleProtocolResolver
json解析类
resolve() 匿名和非匿名请求sign() 对数据进行签名
invokerFactory获取invoker可能的逻辑为
最后调用invoke方法dubbo 或者http调用
SimpleProtocolProvider
name=sppprotocolResolverdataCache
openApi数据协议解析类
DubboProxyServiceManager构造dubbo的serviceConfig
调用服务——JSON
proxyBean 构建一个代理对象
获取结果 Object retret = protocolProvider.buildSuccessResult(ret);构造返回结果体
OpenApiProxy $invoke逻辑 详见过滤器和invoker
AdapterInvokerinvoke
发布服务
若service降级MockInvoker
dubbo.rpc.service.GenericService$Proxy0通过字节码生成一个proxy类
CXF相关类
1.两个对象范化对象(serviceConfig生成的)代理对象根据新的proxy类和范化对象生成
SimpleApiRequest
json对应的数据实体headerbody
ProxyClass通过字节码生成一个java类,用于cxf
通过RpcContext 找到path根据path从db获取serviceInfo和对象内的serviceInfo比对
GenericService$Proxy0
字节码proxy类
调用proxyBean$invoke方法
服务基本信息类名 版本号 path(url)等
根据cPath,mPath构建api的url
OpenApiProxy
ServiceInfo serviceInfo
serviceConfigdoExpert根据protocols分别调用DubboProtocolJsonProtocol
调用invoke方法
Filter
JSONProtocol
protocolProvider
doExportdoReferproxyClassproxyBean
初始化protocolProvider在proxy-register.xml配置了
OpenApiProxy$invoke
curl url参数是一个json数据ex:{\"body\":\"xxx\
最终还是为了调用范化类的$invoke
httpserver通过path找到
服务发布——JSON
服务发布
GenericService
$invoke
服务发布——JSON协议两大对象
com.fasterxml.jackson.jaxrs.json
JsonHandler请求的前置工作在rpcContext放入 客户端ip,portpath(后面需要根据path找的serviceInfo)message信息,进行cxf_continuation
rpc调用
创建lastInvoker和filter的调用链一个filter一个invoker对象
JSONHolder
存放client传来的json数据
getJSON
OpenApiProxy为dubbo的一个范化服务对象持有serviceInfo对象
dubbo范化类
0 条评论
下一页