进程间通信(进程间的通信方式三种)
概述
服务内部通信主要分为两类:
基于同步请求/响应的通信,例如:REST,gRPC等
基于异步消息的通信,例如:AMQP,STOMP等
通信方式有两类:
第一类:
1对1通信
1对多通信
第二类:
同步通信
异步通信
1对1通信实现:
请求/响应通信
异步请求响应
单向通知
1对多通信实现:
发布订阅
发布/异步响应
消息格式
进程间通信对本质是消息对交互。
消息格式有两类:文本消息和二进制消息。
文本格式:JSON,XML
二进制格式:Avro,Protobuf,Thrift
跨编程语言消息格式传递对使用是非常重要对,所以Java序列化方式不是一种好的选择。
RPC
Remote Procedure Call 像调用本地方法一样调用远程服务
在客户端的业务逻辑中,调用远程提供者的代理接口。
提供者代理会通过网络传输将数据发送到接口服务端,服务端收到消息进行业务逻辑处理。
服务端执行完毕后将结果通过代理发送给客户端,客户端收到调用结果。
REST
REST是一种规范,而不是协议。REST通常是使用HTTP协议。
REST中的一个关键概念是资源,通常表示一个业务实体,比如:用户,订单,或者是对象的集合。
REST调用HTTP接口有一定的规范, 比如:
POST /user : 创建用户
PUT /user : 修改用户信息
GET /users: 获取用户列表
GET /user/{userId} : 获取指定的用户信息
服务发现
服务发现有两种:静态发现和动态发现。
静态发现是指知道对方的地址,运行时地址是固定的,直接通过地址就可以发现服务。
动态发现是指服务提供者是动态扩展的(增缩),运行指根据具体策略才能获取到对应的服务提供者。
动态服务发现:
动态服务发现一般有两种实现:
服务注册:需要一个注册中心,服务提供者启动时注册到注册中心,服务消费者从注册中心获取服务列表
通过部署平台,比如:Kubernetes
异步消息
基于消息通信的应用程序通常使用消息代理(Message Broker),这种代理在各个服务间作为一种中介存在。
这种模式一般是发送者发送消息到指定的通道(Channel),消费者(要收到消息的对象)从通道中读取。
一个消息是由头部(header)和内容(body)组成。头部是key-value集合组成,一般也包括消息的唯一ID。
消息的类型:
Document
Command
Event
通道(Channel)
消息是通过通道进行交换的。
通道一般有两种:
点对点通道
发布订阅通道
异步消息的实现
1.异步请求响应