为什么使用微服务?微服务解决了什么问题?
分布式系统组成要素及其运行机制
微服务场景模拟
1. Spring Cloud Alibaba基本介绍
2. Spring Cloud Alibaba Nacos(服务注册与发现)
3. Spring Cloud Alibaba Nacos Config(分布式配置)
4.Spring Cloud Ailibaba Sentinel(限流)
5. Spring Cloud Ailibaba Sentinel支持OpenFeign、RestTemplate(远程调用)及动态数据源
6. Spring Cloud Ailibaba Geteway与Zuul(服务网关)
7. Spring Cloud Ailibaba Seata(分布式事务)
8. Spring Cloud微服务项目集成Seata
9. Spring Cloud Ailibaba RocketMQ(分布式消息系统)
Spring Cloud Stream是一个用于构建基于消息的微服务应用框架。它基于Spring Boot来创建具有生产级别的单机Spring应用,并且使用Spring Integration与Broker进行连接。
Spring Cloud Stream提供了消息中间件配置的统一抽象,推出了publish-subscribe、consumer groups、partition这些统一的概念。
Spring Cloud Stream内部有两个概念:Binder和Binding
跟外部消息中间件集成的组件,用来创建Binding,各消息中间件都有自己的Binder实现
比如:
Kafka的实现KafkaMessageChannelBinder,RabbitMQ的实现RabbitMessageChannelBinder,RocketMQ的实现RocketMQMessageChannelBinder。
包括Input Binding和Output Binding
Binding在消息中间件与应用程序提供的Provider和Consumer之间提供了一个桥梁,实现了开发者只需使用应用程序的Provider或Consumer生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。
RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
官网:http://rocketmq.apache.org/
特点:
(1)能够保证严格的消息顺序
(2)提供丰富的消息拉取模式
(3)高效的订阅者水平扩展能力
(4)实时的消息订阅机制
(5)亿级消息堆积能力
使用Spring Cloud Stream完成一段简单的消息发送和消息接收代码:
Spring Cloud Stream底层基于这段代码去做了各种抽象。下面代码所有的消息类都是spring-messaging模块里提供的。屏蔽具体消息中间件的底层实现,如果想用更换消息中间件,在配置文件里配置相关消息中间件信息以及修改binder依赖即可。
MessageChannel messageChannel = new DirectChannel();
// 消息订阅
((SubscribableChannel) messageChannel).subscribe(new MessageHandler() {
@Override
public void handleMessage(Message> message) throws MessagingException {
System.out.println("receive msg: " + message.getPayload());
}
});
// 消息发送
messageChannel.send(MessageBuilder.withPayload("simple msg").build());
如果要在项目中引入RocketMQ Binder,需要引入如下maven依赖:
com.alibaba.cloud
spring-cloud-stream-binder-rocketmq
或者可以使用 Spring Cloud Stream RocketMQ Starter:
com.alibaba.cloud
spring-cloud-starter-stream-rocketmq
Spring Cloud Stream RocketMQ Binder实现架构:
RocketMQ Binder实现依赖于RocketMQ-Spring框架
RocketMQ-Spring框架是RocketMQ与Spring Boot的整合,RocketMQ Spring主要提供了3个特性:
(1)使用RocketMQTemplate用来统一发送消息,包括同步、异步发送消息和事务消息
(2)@RocketMQTransactionListener注解用来处理事务消息的监听和回查
(3)@RocketMQMessageListener注解用来消费消息
RocketMQ Binder的核心类RocketMQMessageChannelBinder实现了Spring Cloud Stream规范,内部构建会RocketMQInboundChannelAdapter和RocketMQMessageHandler。
RocketMQMessageHandler会基于Binding配置构造RocketMQTemplate,RocketMQTemplate内部会把spring-messaging模块内org.springframework.messaging.Message消息类转换成 RocketMQ的消息类org.apache.rocketmq.common.message.Message,然后发送出去。
RocketMQInboundChannelAdapter基于Binding配置构造 RocketMQListenerBindingContainer
,RocketMQListenerBindingContainer内部会启动RocketMQ Consumer接收消息
注意:在使用RocketMQ Binder的同时也可以配置“rocketmq.**”用于触发RocketMQ Spring相关的AutoConfiguration
目前Binder支持在Header中设置相关的key来进行RocketMQ Message消息的特性设置。
比如:TAGS、DELAY、TRANSACTIONAL_ARG、KEYS、WAIT_STORE_MSG_OK、FLAG。表示RocketMQ消息对应的标签。
MessageBuilder builder = MessageBuilder.withPayload(msg)
.setHeader(RocketMQHeaders.TAGS, "binder")
.setHeader(RocketMQHeaders.KEYS, "my-key")
.setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1");
Message message = builder.build();
output().send(message);
SCS RocketMQ Binder支持MessageSource,可以进行消息的拉取。
按照规定的顺序依次完成各种操作的控制系统。顺序控制是一种按时间顺序或逻辑顺序进行控制的开环控制方式,其特点是按照预先规定的顺序进行检查、判断、控制的过程。
@SpringBootApplication
@EnableBinding(MQApplication.PolledProcessor.class)
public class MQApplication {
private final Logger logger =
LoggerFactory.getLogger(MQApplication.class);
public static void main(String[] args) {
SpringApplication.run(MQApplication.class, args);
}
@Bean
public ApplicationRunner runner(PollableMessageSource source,
MessageChannel dest) {
return args -> {
while (true) {
boolean result = source.poll(m -> {
String payload = (String) m.getPayload();
logger.info("Received: " + payload);
dest.send(MessageBuilder.withPayload(payload.toUpperCase())
.copyHeaders(m.getHeaders())
.build());
}, new ParameterizedTypeReference() { });
if (result) {
logger.info("Processed a message");
}
else {
logger.info("Nothing to do");
}
Thread.sleep(5_000);
}
};
}
public static interface PolledProcessor {
@Input
PollableMessageSource source();
@Output
MessageChannel dest();
}
}
前缀:spring.cloud.stream.rocketmq.binder
配置项 | 默认值 | 描述 |
---|---|---|
name-server | 127.0.0.1:9876 | RocketMQ NameServer地址(老版本使用namesrv-addr配置项) |
access-key | null | 阿里云账号AccessKey |
secret-key | null | 阿里云账号SecretKey |
enable-msg-trace | true | 是否为Producer和Consumer开启消息轨迹功能 |
customized-trace-topic | RMQ_SYS_TRACE_TOPIC | 消息轨迹开启后存储的topic名称 |
下面配置以“spring.cloud.stream.rocketmq.bindings.
配置项 | 默认值 | 描述 |
---|---|---|
enable | true | 是否启用Consumer |
tags | empty | Consumer基于TAGS订阅,多个tag以||分割 |
sql | empty | Consumer基于SQL订阅 |
broadcasting | false | Consumer是否是广播消费模式。如果想让所有的订阅者都能接收到消息,可以使用广播模式 |
orderly | false | Consumer是否同步消费消息模式 |
delayLevelWhenNextConsume | 0 | 异步消费消息模式下消费失败重试策略: ①-1:不重复,直接放入死信队列 ②0:broker控制重试策略 ③>0:client控制重试策略 |
suspendCurrentQueueTimeMillis | 1000 | 同步消费消息模式下消费失败后再次消费的时间间隔 |
下面配置以“spring.cloud.stream.rocketmq.bindings.
配置项 | 默认值 | 描述 |
---|---|---|
enable | true | 是否启用Producer |
group | empty | Producer分组名称 |
maxMessageSize | 8249344 | 消息发送的最大字节数 |
transactional | false | 是否发送事务消息 |
sync | false | 是否使用同步得方式发送消息 |
vipChannelEnabled | true | 是否在Vip Channel上发送消息 |
sendMessageTimeout | 3000 | 发送消息的超时时间(毫秒) |
compressMessageBodyThreshold | 4096 | 消息体压缩阀值(当消息体超过4k的时候会被压缩) |
retryTimesWhenSendFailed | 2 | 在同步发送消息的模式下,消息发送失败的重试次数 |
retryTimesWhenSendAsyncFailed | 2 | 在异步发送消息的模式下,消息发送失败的重试次数 |
retryNextServer | false | 消息发送失败的情况下是否重试其它的broker |