RPC框架知识总结


设计rpc框架几种核心技术点:

1:服务提供者以一定的方式提供服务者相关的信息,可以是数据结构、服务接口定义、或者是中间态的服务文件。服务调用者可以通过一定的方式调用相关信息。

2:远程服务代理,可以通过动态代理的方式帮助远程调用者实现远程服务的本地代理。

3:底层通信协议:rpc实现不关心底层的具体传输协议,但是具体的实现需要考虑具体的实现协议,具体的协议一般可以是netty、mina框架。dubbo的底层默认通信框架是netty。

4:序列化方式:常见的几种序列化方式:将数据结构或者对象转化为二进制的过程,方便对象远程传输。json、java序列化、kryo、protostuff、xml、protobuf等等。


动态代理:分为java动态代理、CGLIB动态代理

java动态代理原理:基于java反射机制实现,通过对象名字,获取要代理的对象。

CGLIB动态代理:为代理类和被代理类各生成一个Class,这个Class会为代理类或被代理类的方法分配一个index(int类型)。这个index当做一个入参,FastClass就可以直接定位要调用的方法直接进行调用,这样省去了反射调用,所以调用效率比JDK动态代理通过反射调用高。


序列化方式:json、java序列化、kryo、protostuff、xml、protobuf等等:

影响序列化的几个因素包括:

1:序列化后码流大小

2:cpu占用资源

3:是否支持跨语言


底层通讯框架:netty,nima等。


上面的都是一些最基本的rpc框架需求,还包括一些其他的额外可以优化运维成本,增加系统可靠性的方案实现。

服务治理包括但是不限于:负载均衡、服务隔离降级、调用跟踪、服务容错、服务限流、服务监控。

负载均衡:用于调用服务的策略

  1.随机:采用随机算法进行路由,消费者基于地址列表随机生成服务提供者地址进行远程调用。缺点是在一个截面上碰撞概率较高,同时如果服务提供者硬件配置差异较大,会导致各节点负载不均匀

  2.权重:为每个服务提供者分配一个流量占比权重。缺点是存在慢的服务提供者累积请求问题。

  3.一致性hash:相同参数的请求总是发送到同一服务提供者,当某一台提供者宕机时,原本发往改提供者的请求,基于虚拟结点,平摊到其他提供者,不会引起剧烈变动。

服务隔离:

  1.vm隔离,将服务部署在不同的vm机器中。

  2.物理机隔离,将服务部署在不同的物理机中。

  3.机房隔离,部署在不同的机房中。

服务容错:服务调用的容错策略

  1.failover:失败自动切换,当出现失败时,重试其他服务器。通常用于读操作等幂等性服务

  2.failback:失败自动恢复,后台记录失败请求,定时重发。通常用于通知操作,不可靠,重启丢失。

  3.failfast:快速失败,只发起一次,失败立即报错,通常用于非幂等性的写操作。(如果有机器正在重启,可能会出现调用失败)

服务限流:当资源成为瓶颈时,需要对消费者进行限流,进行流量控制保护,常见的限流策略有:

  1.静态限流配置,预估qps,将值加载到内存中。

  2.动态流量分配置,根据qps重新计算流量控制。

服务降级:在业务高峰期,为了保护核心业务的正常运行,可以停掉一些不太重要的任务,比如评论、用户经验信用的服   务。服务降级主要包括容错降级和屏蔽降级两种模式。

  1.容错降级:容错降级主要在业务调用方,当服务不可用时,catch住异常,让业务通行。

  2.屏蔽降级:屏蔽降级的核心在于将原属于降级业务的资源调配出来供核心业务使用。在业务高峰时期,对非核心的服 务做强制降级,不发起远程服务调用,直接返回空、异常或者执行特定的本地逻辑,减少自身对公有资源的消费,把 资源释放出来供核心服务使用。

服务监控:

    原文作者:WgRoy
    原文地址: https://www.jianshu.com/p/5a563cdd39fd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞