常见问题:
Whitelabel Error Page 原因 : 白页
A component required a bean of type ‘XXX‘ that could not be found 原因: bean扫描失败,从而导致加载失败 (1) 检查问题类上是否标注了SpringBoot可以自动扫描的注解,比如缺失了@Service、@Component、@Mapper等 (2) 在启动类上添加注解@SpringBootApplication(scanBasePackages = {"XXX"}) / @ComponentScan(basePackages = {"XXX"})
No instances available for 127.0.0.1 restTemplate开启负载均衡后,127.0.0.1修改为服务提供者名称
Spring Cloud Alibaba(下文简称为 SCA ) 致力于提供微服务开发的一站式解决方案。
用户购买商品的业务逻辑。整个业务逻辑由 3 个微服务提供支持: 仓储服务:对给定的商品扣除仓储数量。 订单服务:根据采购需求创建订单。 帐户服务:从用户帐户中扣除余额。 按顺序启动 Account, Storage, Order, Business 服务
开放端口: 8848 9848 启动 Nacos Server 在接入 spring-cloud-starter-alibaba-sidecar 之前,首先需要启动 Nacos Server。
下载 下载 Nacos 二进制文件 并解压; https://github.com/alibaba/nacos/releases
配置 配置数据源 开启鉴权 设置服务端验证 key 设置默认 token
启动 下载解压后 我们需要进入到 bin 目录启动 Nacos 服务,一定不要双击启动,双击默认会以集群方式启动,示例只需以单机方式启动即可。 Windows 操作系统,执行命令:
$ startup.cmd -m standalone
Linux
sh startup.sh -m standalone 或者 ./startup.sh -m standalone
查看启动情况。输入命令: cat /www/server/nacos/logs/start.out
查看8848 端口情况: ss -antulp | grep 8848
登录 Nacos。 在浏览器地址栏中输入 localhost:8848/nacos 可以看到 Nacos 提供的控制台界面 (用户名和密码都是 nacos/nacos)。
依赖
配置
注解 启动类或配置文件
动态刷新配置、监听配置变化等
开放端口: 8091 9091(自定义) 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题
Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。 Transaction ID XID 全局唯一的事务ID 3组件概念 Transaction Coordinator (TC)事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚; Transaction Manager (TM) 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议; Resource Manager (RM) 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚
https://github.com/apache/incubator-seata/releases
config 注意: 需要在Nacos先添加配置
registry
registry:
type: nacos
nacos:
application: seata-server
serverAddr: 127.0.0.1:8848
group: SEATA_GROUP
namespace: xxxxxx
username: xxxx
password: xxx
注意: 日志目录/root/logs/seata, 如果没有可以手动创建
seata:
application-id: springboot-seata
enabled: true
enable-auto-data-source-proxy: false # 数据源自动代理
tx-service-group: saint_trade_tx_group
service:
disable-global-transaction: false
vgroup-mapping:
saint_trade_tx_group: default # 定义一个事务组
default:
grouplist: 127.0.0.1:8091 # 集群对于的实例列表,以;分割
注解在业务方法 本地@Transactional 全局@GlobalTransactional @GlobalTransactional(timeoutMills = 300000, name = "spring-cloud-demo-tx")
管理平台: http://127.0.0.1:9091/ 账号: seata 密码: seata
流量控制和服务保护
服务雪崩:在整条链路的服务中,一个服务失败,导致整条链路的服务都失败的情形。 服务熔断:当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。 服务降级: 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度! 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!
限流虽然可以避免因高并发引起的服务故障,但是服务还是可能会因为其他原因故障. 如果要将这些故障控制住,避免雪崩,就需要靠线程隔离和熔断降级的了
Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流: route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>版本号</version>
</dependency>
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8719 # Sentinel控制台地址
port: 8719 # Sentinel控制台与客户端通信的端口
feign:
sentinel:
enabled: true # 启用 Feign 对 Sentinel 的支持
当远程调用失败时,可以实现降级逻辑。有两种方式可供选择: 方式一:FallbackClass,FallbackClass 是 Feign 的一种直接降级处理机制。它涉及创建一个实现原始Feign接口的类,并在该类的方法中定义降级逻辑。但是这种方式对远程调用的异常无法进行处理。 方式二:FallbackFactory(降级工厂),FallbackFactory 提供了更灵活的处理远程服务调用失败的方式。它允许我们动态创建 Feign 接口的降级实例,并获取特定的异常信息。
dashboard 控制面板
运行 java -jar -Dserver.port=8720 sentinel-dashboard-1.8.7.jar
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
spring:
application:
name: service-consumer #服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos服务地址
sentinel:
transport:
dashboard: 127.0.0.1:8720
@SentinelResource(value="login", blockHandler = "loginBlockHandler", fallback = "loginFallback")
public String login(String str) {
if (str.isBlank()) {
throw new RuntimeException();
}
return "登录成功" + str;
}
public String loginBlockHandler(String str , BlockException e) {
return str + ": 限流";
}
public String loginFallback(String str) {
return str + ": 熔断降级";
}
流控规则 阈值类型: QPS:一般指每秒查询率 单机阈值: 是否集群:
熔断规则 熔断策略: 慢调用比例,异常比例,异常数 RT:平均响应时间 比例阈值: 熔断时长: 最小请求数: 异常比例:每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态 异常数:当资源近 1 分钟的异常数目超过阈值之后会进行熔断
限流和降级的区别? 限流是通过设置QPS(每秒查询率)/线程数,将超过阈值部分拒绝处理; 服务降级是监控请求响应时间、响应异常比例、异常数量;超过限定阈值,将进行服务降级熔断,一定时间内不可用;
查询统计信息 http://localhost:8719/cnode?id=gateway
其中: thread: 代表当前处理该资源的线程数; pass: 代表一秒内到来到的请求; blocked: 代表一秒内被流量控制的请求数量; success: 代表一秒内成功处理完的请求; total: 代表到一秒内到来的请求以及被阻止的请求总和; RT: 代表一秒内该资源的平均响应时间; 1m-pass: 则是一分钟内到来的请求; 1m-block: 则是一分钟内被阻止的请求; 1m-all: 则是一分钟内到来的请求和被阻止的请求的总和; exception: 则是一秒内业务本身异常的总和。
除此之外,无论触发了限流、熔断降级还是系统保护,它们的秒级拦截详情日志都在 ${user_home}/logs/csp/sentinel-block.log里。如果没有发生拦截,则该日志不会出现。
3.x 版本的使用, 都是基本上都是通过注解 @EnableBinding @Input @Output @StreamListener 等注解来实现对不同信道的绑定.
4.x 版本 消息发送, 有两种方式. 方式一: 使用 StreamBridge streamBridge; 往指定信道发送消息. 方式二: 通过隐式绑定信道, 注册 Bean 发送消息
@Resource
private StreamBridge streamBridge;
// im-out 为信道名称 与 yml 中的配置绑定 spring.cloud.stream.bindings.im-out
boolean b = streamBridge.send("im-out", "要发送的消息");
@Bean
public Supplier<String> im() {
return () -> "要发送的信息";
}
绑定关系: //注意: 此处的 im 对象是与 spring.cloud.stream.function.bindings.im-out-0 绑定的. //其中 -out-0 是 4.x 的一种约定. 多个方法之间可以使用 “|” 间隔, 但是绑定时 多个需要按顺序写. 其中 -in-0 是一种约定
spring-cloud-starter-bus-rocketmq spring-cloud-starter-bus-rocketmq 是 Spring Cloud Bus 的一个实现,它用于微服务架构中的事件传播和分布式消息通信。Spring Cloud Bus 允许微服务之间通过轻量级的消息代理(如 RocketMQ)来传递消息,从而实现事件广播和分布式系统之间的通信。
使用场景: 发布和订阅应用间的事件 实现微服务之间的配置更新广播 支持分布式系统的状态变更通知
spring-cloud-starter-stream-rocketmq spring-cloud-starter-stream-rocketmq 是 Spring Cloud Stream 的一个绑定器,用于构建基于消息的微服务应用。Spring Cloud Stream 提供了一个抽象层,允许开发者以声明式的方式定义消息生产者和消费者,从而简化了与消息中间件的集成。
使用场景: 定义输入和输出通道(channels)以发送和接收消息 通过注解或配置来定义消息的生产者和消费者 实现消息的序列化和反序列化 支持分布式系统中的消息传递和事件驱动架构
区别和选择 功能差异:spring-cloud-starter-bus-rocketmq 主要用于事件广播和配置更新,而 spring-cloud-starter-stream-rocketmq 更适用于构建基于消息的微服务应用。
使用场景:如果你需要在微服务之间进行事件传播和配置更新广播,可以选择 spring-cloud-starter-bus-rocketmq。 如果你需要构建基于消息的微服务应用,处理数据流和事件驱动的场景,可以选择 spring-cloud-starter-stream-rocketmq。 如果你需要事件广播和配置更新功能,可以选择 spring-cloud-starter-bus-rocketmq; 如果你需要构建基于消息的微服务应用,可以选择 spring-cloud-starter-stream-rocketmq。
集成方式:spring-cloud-starter-bus-rocketmq 集成方式相对简单,通过配置和注解即可实现。 而 spring-cloud-starter-stream-rocketmq 可能需要更多的配置和代码来实现消息的生产和消费。
RocketMQ 基本使用 安装并启动 下载 RocketMQ 最新的二进制文件,并解压。
解压后的目录结构如下:
apache-rocketmq ├── LICENSE ├── NOTICE ├── README.md ├── benchmark ├── bin ├── conf └── lib
启动 NameServer
Linux / Unix / Mac 操作系统,执行命令 :
$ nohup sh bin/mqnamesrv & tail -f ~/logs/rocketmqlogs/namesrv.log
Windows 操作系统,执行命令:
$ .\bin\mqnamesrv.cmd
启动 Broker Linux / Unix / Mac 操作系统,执行命令 :
$ nohup sh bin/mqbroker -n localhost:9876 & tail -f ~/logs/rocketmqlogs/broker.log
Windows 操作系统,执行命令:
$ .\bin\mqbroker.cmd -n localhost:9876
同步Mysql数据库到redis/ElasticSearch
canal.serverMode = rabbitMQ
canal.mq.topic=canal-routing-key
然后找到关于RabbitMQ的配置:
#################################################
######## RabbitMQ ############
#################################################
rabbitmq.host = myrabbit
rabbitmq.virtual.host = /
rabbitmq.exchange = canal-exchange
rabbitmq.username = admin
rabbitmq.password = 123456
instance.properties 监听数据库配置
canal.admin-1.1.5.tar.gz spring boot框架开发的web项目啦,canal_manager.sql 导入数据库 sh bin/startup.sh 这时候通过主机ip:8089就能在浏览器访问,默认登录用户名密码:admin/123456
集成
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.7</version>
</dependency>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。