121、RPC项目总结

你的RPC框架是如何实现的?

首先我自定义了三个重要的注解,第一个注解是@RpcService,用来实现服务注册,作用于服务实现类上,相当于Spring中的@Service注解。它有两个属性group和version,当一个接口有多个实现类时,可以根据分组名和版本号找到具体的实现类。然后在postProcessBeforeInitialization方法中会扫描被RpcService注解标注的类,并将其注册到zookeeper中,同时也将它的bean添加到一个HashMap集合中,key是接口名+分组名+版本号。

第二个注解是@RpcScan,作用于启动类上,它只有一个属性,是个字符串数组,用来指定包路径的,我们在@RpcScan注解中使用@Import注解导入了一个扫描类,它会扫描指定包路径下的带有@RpcService注解的类,并将其注册为bean,交给Spring管理。

第三个注解是@RpcReference,作用与Service接口对象上,相当于Spring中的@Autowired注解,它也有两个属性group和version,在postProcessAfterInitialization方法中会扫描被RpcReference注解标注的对象,并根据指定的分组名和版本号创建对应的代理对象。每次调用目标对象的方法时,会调用代理对象的invoke方法,先将接口名、方法名、参数、分组名、版本号等信息封装成RpcRequest对象,并给RpcRequest设置一个唯一的请求id,以便在处理响应结果时,能分辨出是哪个请求的响应结果。发送请求前先根据接口名、分组名和版本号去zookeeper中找到对应的Netty服务器的ip地址和端口号,然后就能根据ip地址和端口号找到对应的channel,接着我们会把RpcRequest封装成RpcMessage对象并设置压缩方式、序列化方式和消息类型,最后把RpcMessage写入到channel中。

别人如何使用你的框架?

我把RPC框架的核心实现类都放在了一个模块下,如果别人想要在项目中使用这个框架,需要先依赖我们的模块,然后根据三个注解的使用规则来使用RPC框架。使用@RpcService注解标注需要被注册到注册中心的服务实现类,并指定实现类的分组名和版本号,当一个接口有多个实现类时,可以根据分组名和版本号找到具体的实现类。使用@RpcScan注解标注启动类并指定一个包路径,它会将包路径下带有@RpcService注解的类注册为bean,交给Spring管理。使用@RpcReference标注服务接口对象,并指定分组名和版本号,这个注解就相当于Spring中的@Autowired注解,然后我们就能使用接口对象调用相应的方法了

请求的发送和响应流程?

被@RpcReference标注的接口对象,我们都会在postProcessAfterInitialization方法中创建出它的代理对象,当调用目标对象的方法时,会调用代理对象的invoke方法,先将接口名、方法名、参数、分组名、版本号等信息封装成RpcRequest对象,并给RpcRequest设置一个唯一的请求id,以便在处理响应结果时,能分辨出是哪个请求的响应结果。发送请求前先创建一个CompletableFuture对象并存入到ConcurrentHashMap中,key是请求id。然后根据接口名、分组名和版本号去zookeeper中找到对应的Netty服务器的ip地址和端口号,然后就能根据ip地址和端口号找到对应的channel,接着我们会把RpcRequest封装成RpcMessage对象并设置压缩方式、序列化方式和消息类型,然后把RpcMessage写入到channel中,接着调用CompletableFuture的get方法阻塞等待异步任务完成,在channel中把RpcMessage编码成字节数据。

服务端收到消息后先把消息解码为RpcMessage对象,如果是心跳请求,就直接返回心跳响应,如果是其他请求,就使用反射的方式执行目标方法,然后将结果和请求id封装成RpcResponse对象返回给客户端,客户端收到响应结果后会获取请求id对应的CompletableFuture对象,并调用它的complete方法将RpcResponse传递到代理对象的invoke方法中,最后将结果返回给用户,至此完成了一次RPC请求

服务在zookeeper中的路径?

服务在zookeeper中的路径格式为:/my-rpc/接口的包路径+分组名+版本号/ip地址 : 端口号

负载均衡算法控制打到服务节点的流量?

使用Random类根据服务子节点列表的长度,随机选择一个服务子节点。

 

首先在服务端使用ServerBootstrap配置并启动服务器,给它配置bossGroup和workerGroup,在ChannelPipeline中添加IdleStateHandler、自定义编解码器和自定义服务端消息处理器,然后在客户端使用Bootstrap配置并启动客户器,给它配置NioEventLoopGroup,在ChannelPipeline中添加IdleStateHandler、自定义编解码器和自定义客户端消息处理器。

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Spring Cloud是一个开源的分布式系统框架,用于构建和管理基于微服务架构的应用程序。RPC(远程过程调用)是一种在分布式系统中用于不同进程之间通信的技术。 在Spring Cloud中,RPC调用方式有几种可选择的方式,包括基于RestTemplate的同步调用和基于Feign的声明式调用。 1. 基于RestTemplate的同步调用:RestTemplate是Spring框架提供的用于发送 HTTP 请求的类,用于实现同步的RPC调用。通过创建RestTemplate对象,我们可以使用其提供的各种方法向特定URL发送请求,并获取响应结果。 使用RestTemplate进行RPC调用的步骤如下: - 创建一个RestTemplate对象。 - 根据需要设置RestTemplate的属性,如超时时间、拦截器等。 - 使用RestTemplate的方法发送HTTP请求并获取响应结果。 2. 基于Feign的声明式调用:Feign是Spring Cloud提供的基于RESTful风格的HTTP客户端,用于简化RPC调用过程。通过在接口上使用注解来定义HTTP请求的方式,Feign会自动帮我们生成实现类,并将接口方法转换为HTTP请求。 使用Feign进行RPC调用的步骤如下: - 在项目中添加Feign的依赖。 - 创建一个接口,使用@FeignClient注解标识服务的名称。 - 在接口中定义需要调用的方法,使用注解来配置HTTP请求的细节。 - 注入该接口的实例,即可调用服务提供者的方法。 总结来说,Spring Cloud提供了多种方式实现RPC调用,包括基于RestTemplate的同步调用和基于Feign的声明式调用。开发人员可以根据具体需求选择适合的方式来进行RPC调用,以实现分布式应用程序的各个微服务之间的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值