grpc客户端调用流程
2021-06-23 16:27:27 12 举报
grpc客户端调用流程
作者其他创作
大纲/内容
通过注入AutoJsonRpcServiceImplExporter该类来实现服务端的启动
注册
实例化Bean的时候(AbstractAutowireCapableBeanFactory#doCreateBean)的时候会调用
afterPropertiesSet
JsonRpcAutoConfiguration
refresh
JsonServiceExporter
findFieldAnnotationMetadata,查找属性上面被@Reference标注的,并且把该属性封装成AnnotatedFieldElement对象
handleRequest
handleJsonNodeRequest
AnnotationInjectedBeanPostProcessor
setServiceInterface
setApplicationContext
服务端调用流程
postProcessBeanFactory
getJsonRpcServer
AutoJsonRpcServiceImplExporter
服务端启动流程
findServiceBeanDefinitions
AbstractApplicationContext
com.rong360.rpc.config.ReferenceAnnotationBeanPostProcessor#doGetInjectedBean这个方法是获取需要注入的bean
ApiUtils
JsonRpcHttpClient
com.rong360.rpc.config.AnnotationInjectedBeanPostProcessor#findInjectionMetadata这个方法是根据bean寻找需要注入的属性
invoke
postProcessMergedBeanDefinition
com.rong360.rpc.config.AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement#inject这个方式是将@Reference注解修饰的属性的值设置为一个代理对象
setService
handle
AbstractJsonServiceExporter
因为AnnotationInjectedBeanPostProcessor该类继承了BeanFactoryAware、BeanClassLoaderAware、EnvironmentAware这些类,并且重写了相关的方法,因此spring容器在启动的时候会依次调用setBeanFactory、setBeanClassLoader、setEnvironment
getBean
call方法,内部服务间调用方法
handleObject
referenceAnnotationBeanPostProcessor
com.rong360.rpc.config.ReferenceAnnotationBeanPostProcessor#buildProxy获取代理对象:该代理对象的invoke是com.rong360.rpc.config.ReferenceAnnotationBeanPostProcessor.ReferenceBeanInvocationHandler#invoke,再获取到该代理对象的时候又执行了一个handler.init()方法,在该方法中,对handler对象的bean属性进行赋值,这个其实就是代理的嵌套 com.rong360.rpc.config.ReferenceBean.get-》 com.rong360.rpc.config.ReferenceBean.createProxy-》 com.rong360.rpc.proxy.JdkProxyFactory.getProxy-》 InvocationHandler的实现类是com.rong360.rpc.proxy.InvokerInvocationHandler.InvokerInvocationHandler
AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors该方法,然后会回调该方法为什么beanPostProcessors集合中会包含ReferenceAnnotationBeanPostProcess这个类?在启动ApplicationContext的时候就会对beanfactory.设置postprocessororg.springframework.context.support.AbstractApplicationContext#refresh-》org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors-》org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors-》org.springframework.beans.factory.support.AbstractBeanFactory#addBeanPostProcessor
ReferenceAnnotationBeanPostProcessor
客户端启动流程
构造方法
InjectionMetadata
AbstractAutowireCapableBeanFactory
com.rong360.rpc.config.AnnotationInjectedBeanPostProcessor#postProcessPropertyValues这个方法是对bean中的被@Reference注解标注的属性设置value值
finishBeanFactoryInitialization完成bean的初始化
registerServiceProxy
findInjectionMetadata
客户端调用流程
在启动的时候,已经对被@Reference注解标记的属性赋值了,所以再执行相应的方法的时候会执行com.rong360.rpc.config.ReferenceAnnotationBeanPostProcessor.ReferenceBeanInvocationHandler#invoke方法,又因为该方法中的object同样也是一个代理对象,所以也会调用com.rong360.rpc.proxy.InvokerInvocationHandler#invoke
exportService
handleRequest0
DefaultListableBeanFactory
RemoteExporter
InvokerInvocationHandler
1.BeanFactoryAware#setBeanFactory2.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
preInstantiateSingletons在这个方法中会遍历beanDefinitionMap这个集合,以次完成bean的初始化操作
BeanDefinition中的beanClass都是JsonServiceExporter,所以该Bean在实例化的时候都是实例化的JsonServiceExporter这个类
getJsonRpcClient方法,获取JsonRpcHttpClient对象
JsonRpcServer
返回一个Proxy.newProxyInstance生成的代理对象
buildAnnotatedMetadata
把class和findFieldAnnotationMetadata返回的List<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement>封装成AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata
收藏
0 条评论
下一页