1. 同步通信与异步通信
1.1 同步通信
类似于视频通话功能,在执行视频通话的时候,双方的动作、语言等均会第一时间共享;
在JAVA微服务项目,会存在同步调用的情况: 例如商品支付服务:在执行商品支付服务成功后,由支付服务发起通知-调用购物服务清空购物车、调用订单服务创建订单或更新订单状态,在调用服务正常执行完成后,返回一个通知告诉支付服务,支付服务通知短信服务通知客户。
上述这个例子,如果购物服务或者订单服务在执行过程中,支付服务是一直在等待的,这样造成了资源的浪费;其次如果两个服务其中一个执行异常的话,整个资源链就会一直停滞,耦合度太高;
1.1.1 同步通信优缺点
优点:时效性快,能第一时间获取服务反馈。
缺点:
1.耦合度过高
2.性能较差,数据吞吐量低
3.存在资源浪费的情况
4.有级联失败的情况-在服务同步调用下,如果被调服务出现异常,则服务调用者进程会一直停滞。
1.2 异步通信(Broker 事件代理--消息中间件)
类似于平时的聊天软件;例如两人聊天,A给B发消息,B因为有事无法第一时间回复,A可以去做别的事情,B看到消息回复给A,B去做别的事情,A看到消息也回复给B,A去做别的事情........如此就是异步通信,双方不需要保持一致性,只管发通知,不需要知道对方是否收到。
1.2.1 异步通信优缺点
优点:
1.耦合度低
2.性能较好,数据吞吐量高
3.消除了级联失败的影响
4.流量削峰-类似于流量整流
缺点:
1.过度依赖于Broker事件代理
2.当服务之间的调用被事件代理Broker取代后,无法跟踪业务,业务的流程不完整,整体的架构复杂;
2.1 Message Queue (Broker事件代理-java项目中应用的消息中间件)
2.1.1 常用MQ介绍
3.1 MQ 基本使用
3.1.1 基于Spring项目应用-Spring AMQP (Adavanced Message Queuing Protocol 业务协议,底层主要基于spring-rabbit实现)
** RabbitMQ 软件安装**
3.1.1.1依赖导入
3.1.1.2 application.yml文件设置
3.1.1.3 基于RabbitMQ 简单发送接收模型代码
3.1.2 WorkQueue模型(Exchange 交换机的引入)
在Java微服务的项目中,一个服务有可能需要调用多个服务,如果要SimpleQueue模型,代码太冗余,就引入了Exchange交换机-将通知转发给与交换机相互绑定的queue;ExChange 的应用需要加入一个配置类,配置类中包含了交换机、队列和绑定的声明,在spring项目启动的时候需要通过spring容器进行管理。
3.1.2.1 Exchange 交换机类型
1.Fanout Exchange 基本配置类
ExChange 的应用需要加入一个配置类,配置类中包含了交换机、队列和绑定的声明,在spring项目启动的时候需要通过spring容器进行管理,群发通知。
2.Direct Exchange
Direct Exchange 直接在@RabbitListener注解中配置交换机、队列和绑定的声明,这种类型的交换机只能给通知的key值跟绑定的Key值相同的Queue发通知。
3.Topic Exchange
可以使用通配符#(0个/多个单词)/*(表示一个单词),只会将通知发给key匹配的queue中。
4.1 RabbitMq 消息序列化
RabbitMq 消息默认是基于JDK自带SimpleMessageConverter序列化的,这个序列化对于String类型等数据的可读性和存储大小还好,但是对于对象、Collecton这种变量类型,序列化后可读性差,消耗内存过大,因此需要重新定义一个序列化器