服务间的通信协议
服务之间通信必须使用进程间通信机制来交互,常见的通信协议有RPC和REST。
REST
基于HTTP实现,比较通用和规范,调用和测试比较方便;
,相当于一种软件架构风格,满足REST原则的应用程序设计就是Restful分隔,将一切视为资源,面向资源。更注重接口的规范。
RPC
传输协议比较灵活,可基于TCP实现。是一种进程间的通信方式,允许像本地服务一样调用远程服务,通信协议大多采用二进制方式。
本地调用远程的函数,远程过程调用,跨语言,HttpClient。
对比
- 传输协议和性能:RPC传输协议较灵活,可基于TCP实现,请求报文体积更小,减少网络开销,提高传输性能和时间,实现更大的吞吐量和并发数。REST基于HTTP协议【属于上层协议】,传输数据效率要低,耗时交长,基于JSON传输,序列化需要耗性能。
- REST开放性和灵活性、通用性要好,调用和测试比较方便。RPC有较多的约束;
- REST主要用于外部服务,如浏览器接口调用,Api接口调用,第三方接口调用等。RPC主要用于内部服务,性能高,传输快。
RPC框架
RPC屏蔽了底层的序列化、传输方式和通信细节,使用者不需要关心底层通信细节和调用过程。
技术架构
一般用于服务发现、负载、容错、网络传输、序列化等,帮助服务之间网络传输和序列化。
调用流程
Client : 客户端,也就是服务的调用方;
Client Stub:客户端存根,存放服务端地址信息,将客户端的请求参数数据信息打包成网络信息,通过网络传输数据给服务端;
Server Stub:服务端存根,接收客户端发送的请求信息,然后进行解包,最后调用本地服务进行处理;
Server : 服务端,服务的提供者【服务本身】;
流程:
- 客户端通过本地调用方式对服务提供者服务;
- 客户端存根接收到调用请求后,将方法、入参信息进行序列化和组装,通过网络进行传输;
- 客户端存根找到远程的服务地址,将消息通过网络发送给服务端;
- 服务端存根收到消息后进行解码、反序列化;
- 服务端存根根据解码的信息调用本地服务执行对应的方法;
- 服务端执行具体的方法,并返回结果给服务端存根;
- 服务端存根将返回的结果进行序列化,并通过网络发送给服务的消费者;
- 客户端存根接收到消息之后,进行解码和反序列化;
-
RPC框架Dubbo
基于RPC的分布式服务框架,提供高性能和透明化的RPC远程调用服务方案,以及SOA服务治理方案。
总体流程
init:启动时完成的功能;
async:运行过程中执行的功能,异步;
sync:运行过程中执行的功能,同步;
角色: register:注册中心,服务注册与发现;
- Provider:服务提供者,暴露服务;
- consumer:服务消费者,调用远程服务;
- monitor:监控中心,统计服务的调用次数和调用时间;
- container:服务允许容器;
具体流程:
- 容器启动、加载,运行服务提供者;
- 服务提供者启动,向注册中心注册自己的服务;【维持一个长连接,发送心跳机制】
- 服务消费者启动,向注册中心订阅自己所需的服务;
- 服务消费者订阅注册中心,当注册中心返回服务提供者的服务地址之后,缓存到本地。如果有哪个服务宕机了,那么注册中心重新更新注册表信息,然后基于长连接推送变更数据给消费者。
- 服务消费者基于软负载均衡算法,从服务提供者的地址列表,选择其中一个提供者进行调用,如果调用失败,就再选另一个提供者。
- 消费者利用代理模式,创建一个Provider类的一个代理对象,通过代理对象获取Provider的真实功能,起到保护Provider真实功能的作用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,【短连接】定时每分钟发送一次统计数据到监控中心;
架构:生产者-消费者+注册中心+监控中心
- 消费者和提供者解耦,双方都可以横向增减节点数;
- 注册中心对本身可做集群,动态增减节点,任一台服务宕机后自动切换到另一台服务;
- 去中心化,双方不直接依赖注册中心,即使注册中心宕机,短时间呢不会影响服务的调用;
- 服务提供者是无状态的,任意一台宕机,不影响使用。
- 底层使用Netty作为通信框架
分层
- Service:接口服务层,面向开发者,业务代码、接口、实现等;
- Config:配置层,对外配置接口,以ServiceConfig和RefernceConfig为中心;
- Proxy:服务代理层,对生产者和消费,dubbo都会产生一个代理类封装调用细节,业务层对远程调用无感;
- Registry:服务注册层,封装服务地址的注册和发现,以服务URL为中心;
- Cluster:路由层,封装多个提供者的路由和负载均衡,并桥接注册中心;
- Monitor:监控层,监控RPC调用次数和调用时间;
- Protocal:远程调用层,封装RPC调用;
- Exchange:信息交换层,封装请求响应模式,同步转异步;
- Transport:抽象mina和netty为统一接口,统一网络传输接口;
- Serialize:数据序列化层,数据传输的序列化和反序列化;