服务间的通信协议

服务之间通信必须使用进程间通信机制来交互,常见的通信协议有RPC和REST。
REST
基于HTTP实现,比较通用和规范,调用和测试比较方便;
,相当于一种软件架构风格,满足REST原则的应用程序设计就是Restful分隔,将一切视为资源,面向资源。更注重接口的规范。
RPC
传输协议比较灵活,可基于TCP实现。是一种进程间的通信方式,允许像本地服务一样调用远程服务,通信协议大多采用二进制方式。
本地调用远程的函数,远程过程调用,跨语言,HttpClient。
对比
image.png

  • 传输协议和性能:RPC传输协议较灵活,可基于TCP实现,请求报文体积更小,减少网络开销,提高传输性能和时间,实现更大的吞吐量和并发数。REST基于HTTP协议【属于上层协议】,传输数据效率要低,耗时交长,基于JSON传输,序列化需要耗性能。
  • REST开放性和灵活性、通用性要好,调用和测试比较方便。RPC有较多的约束;
  • REST主要用于外部服务,如浏览器接口调用,Api接口调用,第三方接口调用等。RPC主要用于内部服务,性能高,传输快。

    RPC框架

    RPC屏蔽了底层的序列化、传输方式和通信细节,使用者不需要关心底层通信细节和调用过程。
    技术架构
    image.png
    一般用于服务发现、负载、容错、网络传输、序列化等,帮助服务之间网络传输和序列化。
    调用流程
    image.png
    Client : 客户端,也就是服务的调用方;
    Client Stub:客户端存根,存放服务端地址信息,将客户端的请求参数数据信息打包成网络信息,通过网络传输数据给服务端;
    Server Stub:服务端存根,接收客户端发送的请求信息,然后进行解包,最后调用本地服务进行处理;
    Server : 服务端,服务的提供者【服务本身】;
    流程:
  1. 客户端通过本地调用方式对服务提供者服务;
  2. 客户端存根接收到调用请求后,将方法、入参信息进行序列化和组装,通过网络进行传输;
  3. 客户端存根找到远程的服务地址,将消息通过网络发送给服务端;
  4. 服务端存根收到消息后进行解码、反序列化;
  5. 服务端存根根据解码的信息调用本地服务执行对应的方法;
  6. 服务端执行具体的方法,并返回结果给服务端存根;
  7. 服务端存根将返回的结果进行序列化,并通过网络发送给服务的消费者;
  8. 客户端存根接收到消息之后,进行解码和反序列化;
  9. 最终客户端得到返回的信息;

    RPC框架Dubbo

    基于RPC的分布式服务框架,提供高性能和透明化的RPC远程调用服务方案,以及SOA服务治理方案。
    总体流程
    image.png
    init:启动时完成的功能;
    async:运行过程中执行的功能,异步;
    sync:运行过程中执行的功能,同步;
    角色:

  10. register:注册中心,服务注册与发现;

  11. Provider:服务提供者,暴露服务;
  12. consumer:服务消费者,调用远程服务;
  13. monitor:监控中心,统计服务的调用次数和调用时间;
  14. container:服务允许容器;

具体流程:

  1. 容器启动、加载,运行服务提供者;
  2. 服务提供者启动,向注册中心注册自己的服务;【维持一个长连接,发送心跳机制】
  3. 服务消费者启动,向注册中心订阅自己所需的服务;
  4. 服务消费者订阅注册中心,当注册中心返回服务提供者的服务地址之后,缓存到本地。如果有哪个服务宕机了,那么注册中心重新更新注册表信息,然后基于长连接推送变更数据给消费者。
  5. 服务消费者基于软负载均衡算法,从服务提供者的地址列表,选择其中一个提供者进行调用,如果调用失败,就再选另一个提供者。
    1. 消费者利用代理模式,创建一个Provider类的一个代理对象,通过代理对象获取Provider的真实功能,起到保护Provider真实功能的作用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,【短连接】定时每分钟发送一次统计数据到监控中心;

架构:生产者-消费者+注册中心+监控中心

  • 消费者和提供者解耦,双方都可以横向增减节点数;
  • 注册中心对本身可做集群,动态增减节点,任一台服务宕机后自动切换到另一台服务;
  • 去中心化,双方不直接依赖注册中心,即使注册中心宕机,短时间呢不会影响服务的调用;
  • 服务提供者是无状态的,任意一台宕机,不影响使用。
  • 底层使用Netty作为通信框架

分层
image.png

  • Service:接口服务层,面向开发者,业务代码、接口、实现等;
  • Config:配置层,对外配置接口,以ServiceConfig和RefernceConfig为中心;
  • Proxy:服务代理层,对生产者和消费,dubbo都会产生一个代理类封装调用细节,业务层对远程调用无感;
  • Registry:服务注册层,封装服务地址的注册和发现,以服务URL为中心;
  • Cluster:路由层,封装多个提供者的路由和负载均衡,并桥接注册中心;
  • Monitor:监控层,监控RPC调用次数和调用时间;
  • Protocal:远程调用层,封装RPC调用;
  • Exchange:信息交换层,封装请求响应模式,同步转异步;
  • Transport:抽象mina和netty为统一接口,统一网络传输接口;
  • Serialize:数据序列化层,数据传输的序列化和反序列化;