RPC 框架基本了解

#博学谷IT学习技术支持#

目录

1. 应用场景

2.RPC框架的基本调用生命周期

2.1 获取调用方的ip、port - 注册中心

2.2 代理技术 - 动态代理

2.3 封装数据 - 序列化技术

2.4 网络模块

3. RPC 的一些扩展功能

3.1 超时重试

3.2 负载均衡

3.3 熔断限流

1. 应用场景

一般我们在实际开发中或多或少,会用到一些接口开发,当然这边的接口不是interface ,是远程调用其他系统的接口,我两个不同的系统相互之间调用,需要对方写相应的接口文档,然后我们根据他的这个文档来组装数据,然后发送。一般呢我们有四种技术可以实现网络中的调用。

分别是socket、rmi、标准共有协议、和RPC。我们如果是单体应用的话,大都是使用标准共有协议里面的http+json 的方式进行网络调用的方式,RPC和这种有什么异同呢,RPC框架简而言之就像本地接口调用一样方便,我不需要写调用的逻辑类似httpclient、restTemplate 对于程序员而言只需要一个注解就可以完成远程的调用例如openfeign。

实际开发中我客户端写个接口,服务端写一个实现,就可以完成调用,即使他们不在一台机器上。

常见的RPC框架有Dubbo、gRPC、Thrift、Spring Cloud,这边Spring Cloud不是说他是一个RPC框架,只能说他里面有用到。

2.RPC框架的基本调用生命周期

2.1 获取调用方的ip、port - 注册中心

我要调用你的方法,我是不是得知道你的ip、端口。怎么获得呢,注册中心,当然也不是非得是注册中心,我存数据库行不行呢,我存配置文件行不行呢,也行,只是说注册中心功能更全面一点,我要是修改ip啥的之后,我RPC框架可以快速的感知到,并且修改。

常见的注册中心有zookeeper、consul、nacos

2.2 代理技术 - 动态代理

这边使用到动态代理技术主要是因为在一个项目里面我只写了一个接口,但是具体实现类是没有的,如果什么都不操作的话,那是不是就会报错,如果我们动态代理了,接口直接调用我们想调用的方法上去,这边的方法可以是任何方法。

动态代理技术也有很多jdk、cglib、asm、bytebuddy、javassist

2.3 封装数据 - 序列化技术

我用调用你的什么类,你的什么方法,然后我的参数等等信息,我得打包一下告诉你,打包好了我得序列化,这样我才能通过网络给到你是不是?

那序列化技术也有很多种,例如jdk、json、Hessian、protobuf

是技术就会有好坏,那么我们从那些维度考虑呢

  1. 第一点肯定是解析效率,解析的快慢。
  2. 第二点就是解析后的数据的大小
  3. 好用(扩展性、兼容性、可读性、可调式、跨语言、通用性)

这边序列化完成之后还要按照应用层协议进行数据的组装。

2.4 网络模块

这边简而言之就是把数据全变成010010001010之类可以在网络上传输的,这边也会涉及到网络协议、通信协议。

这边的技术主要是涉及网络io。

发送完成之后,对应的客户端会进行相反的操作。解析完成之后调用相关的方法。

3. RPC 的一些扩展功能

就是让我们RPC框架更为智能的一些功能、例如超时重试、熔断限流、负载均衡等。

3.1 超时重试

超时重试主要实现的方案是时间轮算法。时间轮还可以实现心跳等类似于定时任务的功能,但是这种算法开销更小。使用效率更高。

3.2 负载均衡

这边涉及到一些负载均衡的算法。什么随机、轮询等。

3.3 熔断限流

熔断我要是探测到服务端有报错,我就暂时不调用了,过段时间验证一下,如果成功就继续调用。

限流用到的算法例如

令牌桶  这边使用的原理就是,你来一个请求要有令牌才可以去访问我的核心业务。没有我就会把这个请求丢弃掉,当然令牌桶还会有相关的问题,令牌是按照一定的速率生产令牌,那么没那么多交易来消费,桶就会满,那么某个时间段,大量的请求过来拿令牌,但是桶里的令牌足够多,会直接把后台应用打穿。

漏斗池 请求可以随便进,但是出去的话就会按照一定的速率打到后台应用

滑动窗口算法 每次执行一个窗口的请求,保证每个窗口的请求,不大于某个数量。

Sentinel

这边还是我初步的理解,后面会把它完善一下。

你可能感兴趣的:(Java,rpc)