rpc客户端
2024-03-03 13:18:32 2 举报
rpc客户端流程图
作者其他创作
大纲/内容
自动配置流程
轮询获取一个netty channel连接
channel
反序列化json
ProtocolDecoder extends ByteToMessageDecoder
如下为入站InboundHandler
serialNum主要作用是用来实现,请求发出后,同步等待响应
completableFuture.get()阻塞等待响应
从nacos注册中心拉取 namespace+group+service 下的全部健康实例,此时初始化netty channel连接。一个实例对应一个连接池(即多个channel)
构造一个全局map
加上注解@EnableConfigurationProperties(RpcClientProperties.class)作用是将如上属性类注册为bean
创建rpc请求代理对象(类似于mabatis的mapper)
业务代码调用bean方法,发起rpc请求
definition.setBeanClass(RemoteServiceFactoryBean.class);
属性类RpcClientProperties
rpc服务端响应到来
加上注解@EnableRpcClient作用是引入自动配置类。此时,其他bean中就可以将RpcClientProperties作为bean注入了
给bd设置属性
rpc客户端启动
注册beanDefinition到容器中
ClientJsonDecoder extends MessageToMessageDecoder<String>
实现扩展方法registerBeanDefinitions
registerBeanDefinitions方法内部逻辑如下
rpc接口生成的jdk动态代理bean
扫描并创建beanDefinition(简写为bd)
spring-boot自动配置开发
ByteToMessageDecoder作用是字节数组转对象,去掉协议包中的int协议头,只保留剩余的json字符串
rpcServiceInstance服务实例
\\\\
@EnableRpcClient(basePackages = {\"com.adee.use.rpc.service\"})注解引入自动配置
解除业务线程阻塞
MessageToMessageDecoder作用是对象转对象,将json字符串转为JsonRpcReturnVo对象
invoke方法内部逻辑
ClientJsonDecoder.decode方法逻辑
@EnableRpcClient注解引入一个自定义ImportBeanDefinitionRegistrar
设置返回值,解除发送线程阻塞状态completableFuture.complete(returnVo);
获取目标方法参数,封装为vo,其中生成一个全局唯一的serialNum序列号,就是请求id
自动配置类RpcClientAutoConfiguration
加上注解@ConfigurationProperties(\"rpc.client\")
获取completableFuturefutureMap.get(returnVo.getSerialNum());
切割字节流,解决拆包/粘包问题
将返回值返回给业务代码
JsonRpcReturnVo对象
vo结构
bd.beanClass属性,是创建bean的实际类型,此处是RemoteServiceFactoryBean,这是一个工厂bean,创建一个jdk动态代理对象,InvocationHandler为RemoteServiceInvocationHandler
循环遍历初始化每个服务实例的连接池,连接到服务端ip+port,创建好channel,spcServiceInstance.init()
rpcService.init()
ImportBeanDefinitionRegistrar是spring的一个扩展点,用于创建bean之前向容器中手动添加beanDefinition
jdk动态代理bean的请求逻辑写在remoteServiceInvocationHandler.invoke方法中
bd.rpcService设置为map.get(namespace+group+service)
key:namespace+group+servicevalue:RpcService对象,对应nacos中的一个服务RpcService对象内部包含多个服务实例
获取basePackages并自动扫描带有@RpcConsumer注解的接口,创建beanDefinition
启动主类RpcClientApplication
启动类引入自动配置
rpc请求代理对象内部逻辑
channel.write发送vo.json()消息
rpcService
rpc客户端初始化完成
加上注解@Import({RpcClientAutoConfiguration.class})作用是引入自动配置类。basePackages表示扫描该包下的有@RpcConsumer注解的接口,并创建代理对象bean
rpcService对象结构(namespace+group+service)
0 条评论
下一页