加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长资讯 > 评论 > 正文

手写一个RPC框架

发布时间:2021-04-09 12:41:26 所属栏目:评论 来源:互联网
导读:说,就如下几个步骤: 客户端(ServerA)执行远程方法时就调用client stub传递类名、方法名和参数等信息。 client stub会将参数等信息序列化为二进制流的形式,然后通过Sockect发送给服务端(ServerB) 服务端收到数据包后,server stub 需要进行解析反序列

说,就如下几个步骤:

  •  客户端(ServerA)执行远程方法时就调用client stub传递类名、方法名和参数等信息。
  •  client stub会将参数等信息序列化为二进制流的形式,然后通过Sockect发送给服务端(ServerB)
  •  服务端收到数据包后,server stub 需要进行解析反序列化为类名、方法名和参数等信息。
  •  server stub调用对应的本地方法,并把执行结果返回给客户端

所以一个RPC框架有如下角色:

  •  服务消费者远程方法的调用方,即客户端。一个服务既可以是消费者也可以是提供者。
  •  服务提供者远程服务的提供方,即服务端。一个服务既可以是消费者也可以是提供者。
  •  注册中心保存服务提供者的服务地址等信息,一般由zookeeper、redis等实现。
  •  监控运维(可选)监控接口的响应时间、统计请求数量等,及时发现系统问题并发出告警通知。

三、实现

本RPC框架rpc-spring-boot-starter涉及技术栈如下:

  •  使用zookeeper作为注册中心
  •  使用netty作为通信框架
  •  消息编解码:protostuff、kryo、java
  •  spring
  •  使用SPI来根据配置动态选择负载均衡算法等

由于代码过多,这里只讲几处改动点。

3.1动态负载均衡算法问题:如果服务端因为宕机或网络问题下线了,缓存却还在就会导致客户端请求已经不可用的服务端,增加请求失败率。解决方案:由于服务端注册的是临时节点,所以如果服务端下线节点会被移除。只要监听zookeeper的子节点,如果新增或删除子节点就直接清空本地缓存即可。

推荐:100道Java中高级面试题汇总+详细拆解每次请求都会调用sendRequest()方法,用线程池异步和服务端创建TCP长连接,连接成功后将SendHandlerV2缓存到ConcurrentHashMap中方便复用,后续请求的请求地址(ip+port)如果在connectedServerNodes中存在则使用connectedServerNodes中的handler处理不再重新建立连接。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读