一、RPC基本知识
Remote Procedure Call,远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。
1、远程过程调用原理
- 首先客户端需要告诉服务器调用的函数,这里函数和进程ID存在一个映射,客户端远程调用时,需要查一下函数,找到对应的id。
- 客户端把参数转化为字节流,传给服务器,服务器再把字节流转化成自身要读取的数值,
- 网络传输层需要把调用的id和序列化后的参数传给服务端,然后把计算好的结果返回给客户端,因此在TCP层即可完成,gRPC采用的是http2协议
- RPC主要依赖于客户端和服务端建立socket链接。
// Client端 // Student student = Call(ServerAddr, addAge, student) 1. 将这个调用映射为Call ID。 2. 将Call ID,student(params)序列化,以二进制形式打包 3. 把2中得到的数据包发送给ServerAddr,这需要使用网络传输层 4. 等待服务器返回结果 5. 如果服务器调用成功,那么就将结果反序列化,并赋给student,年龄更新 // Server端 1. 在本地维护一个Call ID到函数指针的映射call_id_map,可以用Map<String, Method> callIdMap 2. 等待客户端请求 3. 得到一个请求后,将其数据包反序列化,得到Call ID 4. 通过在callIdMap中查找,得到相应的函数指针 5. 将student(params)反序列化后,在本地调用addAge()函数,得到结果 6. 将student结果序列化后通过网络返回给Client
二、SpringCloud理解
借鉴:https://blog.youkuaiyun.com/qq_41701956/article/details/83829539
1、SpringCloud核心组件:Eureka
- Eureka是SpringCloud注册中心,专门负责服务的注册与发现。
- Eureka Client:负责将这个服务信息注册到Edureka Server中
- Eureka Server:注册中心,有一个注册表,保存着各个服务的服务器地址和端口号。
2、SpringCloud核心组件:Feign
- 每个服务间的调用工具Feign,@EnableFeignClients指定Feign调用位置,@FeignClient指定调用方法调用类
2、1调用过程
- 首先,如果你对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理
- 接着你要是调用那个接口,本质就是会调用 Feign创建的动态代理,这是核心中的核心
- Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址
- 最后针对这个地址,发起请求、解析响应
3、SpringCloud核心组件:Ribbon
- 负载均衡组件,Ribbon默认使用最经典的Round Robin轮询算法。
3、1 Ribbon和Eureka、Feign合作的
- 首先Ribbon会从 Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号。
- 然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器
- Feign就会针对这台机器,构造并发起请求。
4、SpringCloud核心组件:Hystrix
- Hystrix,隔离、熔断和降级的一个框架。
- 在多服务的情况下,如果一个服务挂了,而另一个服务要调用此服务,但是这个服务又不是必要的,就可以将这个服务熔断,每隔一定的时间在访问此服务。此时另一个服务可以记录调用此服务的记录,此为降级。
5、SpringCloud核心组件:ZUUL
- 微服务网关,负责网络路由的
- 前端所有的请求都会从网关走,网关会根据请求的特征,将这些请求转发给各个服务。
- 优点:可以做统一的降级、认证授权、限流等。