快速入门Spring Cloud Alibaba,轻松玩转微服务

1 快速入门Spring Cloud Alibaba,轻松玩转微服务

1.1 架构

架构图:架构图

1.2 项目结构

在这里插入图片描述

1.2.1 系统框架版本

版本适配查看:https://sca.aliyun.com/docs/2023/overview/version-explain/
Spring Boot Version :3.2.4
Spring Cloud Version :2023.0.1
Spring Cloud Alibaba Version : 2023.0.1.0

在这里插入图片描述

2 项目搭建

2.1 搭建

2.1.1 服务发现组件Nacos

功能: 注册与发现
版本: 2.3.2
下载:

docekr 下载获取,先翻墙之后执行:
docker pull nacos/nacos-server:v2.3.2
导出:
docker save -o nacos-v2.3.2.tar d3063c1db2bb
会出现在当前你执行命令的目录,之后传到服务器上
到服务器上执行:
docker load -i /data/install/docker-images/nacos-v2.3.2.tar
更改标签名:
docker tag d3063c1db2bb nacos/nacos-server:v2.3.2

启动nacos:
docker run --name nacos -d -p 8848:8848 -p 9848:9848 -e MODE=standalone nacos/nacos-server:v2.3.2
访问:
http://192.168.1.11:8848/nacos

介绍:

命名空间:不同的服务放在不同的命名空间下,隔离作用分组 例如:product

代码修改

(1)pom文件修改

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

(2)配置文件修改
spring:
application:
name: tlmall-storage
cloud:
nacos:
discovery:
server-addr: tlmall-nacos-server:8848
(3) 在启动类上使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

参考 123 步骤到各个微服务中去修改,都启动后可以看到效果

在这里插入图片描述

实际调用:RestTemplate+LoadBalancer 实现服务调用

订单 想调用 库存的时候,通过负载均衡器来选择一个服务来调用
1) 订单服务的pom.xml 中添加LoadBalancer的依赖
在订单服务中

org.springframework.cloud spring-cloud-loadbalancer 2) 订单服务的application.yml中添加配置spring.cloud.loadbalancer.nacos.enabled=true

3)RestTemplate通过添加 @LoadBlanced 注解接入LoadBalancer
@Configuration
public class RestConfig {

@Bean
@LoadBalanced
RestTemplate restTemplate(){return new RestTemplate();
}

}
4)createOrder方法改造

        String storage_url = "http://cxqlmall-storage/storage/reduce-stock";Integer storageCode = restTemplate.postForObject(storage_url,storageDTO, Result.class).getCode();//openFeign远程调用
//Integer storageCode = storageService.reduceStock(storageDTO).getCode();if (storageCode.equals(COMMON_FAILED.getCode())) {throw new BusinessException("stock not enough");}// deduct balanceint price = count * 2;AccountDTO accountDTO = new AccountDTO();accountDTO.setUserId(userId);accountDTO.setPrice(price);//RestTemplate远程调用//String account_url = "http://localhost:8020/account/reduce-balance";//整合了Nacos+LoadBalaner,可以使用微服务名tlmall-account代替localhost:8020String account_url = "http://cxqlmall-account/account/reduce-balance";Integer accountCode = restTemplate.postForObject(account_url,accountDTO,Result.class).getCode();//openFeign远程调用
//Integer accountCode = accountService.reduceBalance(accountDTO).getCode();if (accountCode.equals(COMMON_FAILED.getCode())) {throw new BusinessException("balance not enough");}

整个调用的流程图基于负载均衡器:LoadBalancer

在这里插入图片描述

2.1.2 服务间调用组件-OpenFeign

功能: 服务间的远程调用
作用:在微服务架构中,LoadBalancer和OpenFeign虽然都提供了服务间调用的能力,但它们的设计目的和使用场景有所不同。

LoadBalancer主要关注于服务间的负载均衡,它可以帮助客户端在多个服务实例之间分配请求,以实现高可用性和性能优化。
而OpenFeign则提供了一种声明式的Web服务客户端编程模型,它使得编写服务间调用的代码更加简洁和直观。

官方文档:

https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/
OpenFeign是Spring Cloud框架中集成的声明式HTTP客户端工具

OpenFeign可以让远程调用服务达到像本地调用方法一样的体验。
Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。

//本地调用
R result = orderService.findOrderByUserId(id);
//openFeign远程调用 orderService为代理对象
R result = orderService.findOrderByUserId(id);
Spring Cloud OpenFeign对Feign进行了增强,使其支持Spring MVC注解,从而使得Feign的使用更加方便。

版本:
可以从父POM中查找到<!-- Spring Cloud依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency>
对应点进去能找到openfen对应的版本
<spring-cloud-openfeign.version>4.1.1</spring-cloud-openfeign.version>
怎么用:

1)引入依赖

org.springframework.cloud spring-cloud-starter-openfeign

2)在订单服务启动类上添加@EnableFeignClients注解,开启openFeign功能
在这里插入图片描述

3) 编写OpenFeign客户端,调用库存微服务和账户微服务
`
//微服务的名称
@FeignClient(name = “cxqlmall-storage”)
public interface StorageServiceFeignClient {
//对应的接口
@PostMapping(“/storage/reduce-stock”)
Result<?> reduceStock(@RequestBody StorageDTO productReduceStockDTO);

}
4)OrderServiceImpl 注入 StorageServiceFeignClient
@Autowired
private StorageServiceFeignClient storageService;

之后代码中调用:
Integer storageCode = storageServiceFeignClient.reduceStock(storageDTO).getCode();

`

在 Spring Cloud 2023.0.1.0 版本中,默认的负载均衡器是 Spring Cloud LoadBalancer

2.1.3 Nacos配置中心动态管理

作用:

配置中心就是一种统一管理各种应用配置的基础服务组件。

微服务为什么需要配置中心

一个微服务一个application.yml,100个微服务100个application.yml,如果注册中心地址变了,想象一下怎么改配置
配置中心使得配置信息集中管理,易于维护,并且可以动态更新配置
b25c33b8c4757b2dcba97c3d62412&pos_id=img-iDt38703-1736131903462)

文档

官方:https://sca.aliyun.com/docs/2023/user-guide/nacos/advanced-guide/

Nacos配置中心配置方式的变化
https://blog.csdn.net/u012760435/article/details/124631138

怎么用

在SpringBoot2.4这个大版本中有一项非常重要的改动:出于对云原生多配置文件的支持,默认关闭了对bootstrap.yml的使用。
解决方案
方案1: 重新启用bootstrap.yml(不推荐)
方案2: 使用spring.config.import(官方推荐)

spring:
config:
import:
- optional:nacos:${spring.application.name}.yml
- optional:nacos:db-common.yml #公共配置
spring.config.import: - optional:nacos:tlmall-order.yml:这一行是Spring Boot 2.4.0及以上版本引入的配置文件导入机制。
optional:nacos:tlmall-order.yml表示从Nacos配置中心导入名为tlmall-order.yml的配置文件,其中optional关键字意味着如果该配置文件在Nacos中不存在,那么Spring Boot将不会抛出异常,而是继续执行后续的初始化流程。

怎么用–订单服务整合Nacos配置中心

包括公共的
db-common.yml
服务独有的
nacos-discovery.yml
tlmall-order.yml

 Data ID :配置文件的名字

1)在Nacos控制台创建dataId(对应spring.config.import指定的配置文件名)
在这里插入图片描述

2)引入依赖

<!-- nacos-config 配置中心依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

3)在订单服务的application.yml 配置文件中配置 Nacos Config 地址并引入服务配置

server:port: 8030
spring:application:name: cxqlmall-orderconfig:import:- optional:nacos:${spring.application.name}.yml- optional:nacos:db-common.yml    #数据库公共配置- nacos:nacos-discovery.ymlcloud:nacos:config:server-addr: 192.168.1.11:8848file-extension: yml
logging:level:'[com.alibaba.cloud.nacos]': debug

spring.config.import: - optional:nacos:tlmall-order.yml:
这一行是Spring Boot 2.4.0及以上版本引入的配置文件导入机制。
optional:nacos:cxqlmall-order表示从Nacos配置中心导入名为cxqlmall-order.yml的配置文件,其中optional关键字意味着如果该配置文件在Nacos中不存在,那么Spring Boot将不会抛出异常,而是继续执行后续的初始化流程。

其余几个服务 参考上面的配置去修改

该配置必须放在 bootstrap.properties 文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespace,否则将会导致读取不到正确的配置

2.1.4 Seata解决分布式事务

  • 为什么要使用分布式事务
    一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题
1)Seata是什么
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务
首选Seata AT 模式(官方推荐),可以做到业务无侵入
  • 官方文档
    https://seata.apache.org/zh-cn/docs/overview/what-is-seata/
  • Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
  • 首选Seata AT 模式(官方推荐),可以做到业务无侵入
    https://seata.apache.org/zh-cn/docs/dev/mode/at-mode
2)Seata AT模式的工作流程
  • 非常重要的三个概念(要理解)
    TC (Transaction Coordinator) - 事务协调者 --类似项目协调员
    维护全局和分支事务的状态,驱动全局事务提交或回滚。

    TM (Transaction Manager) - 事务管理器 --类似项目经理
    定义全局事务的范围:开始全局事务、提交或回滚全局事务。

    RM (Resource Manager) - 资源管理器 --类似执行者干活的
    管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

    比如,当前订单服务下单,调用库存服务扣减库存,调用账户服务扣减账户余额
    在这里插入图片描述

1) 订单服务要接入TM组件
下单操作需要开启全局事务(向TC申请一个全局事务XID),进入下单逻辑
如果下单正常,需要通知TC提交全局事务
如果下单异常,比如余额不够,需要通知TC回滚全局事务
2)订单服务,库存服务,账户服务都要接入RM组件
提交本地事务的同时,需要向TC注册分支事务信息
接收TC的通知,提交或回滚分支事务
3)TC是独立的服务
维护TM申请的全局事务信息和 RM提交的分支事务信息
TM通知TC全局事务提交或者回滚的时候,TM要通知RM分支事务提交或回滚

1. AT模式工作流程

https://www.processon.com/view/link/66dfbdf4df5e372d74e8009f?cid=66dfbddebc24f81739a5a7f5

2. Seata Server(TC)安装部署
 - [ ] 下载地址https://seata.apache.org/zh-cn/unversioned/release-history/seata-server- [ ] TC端存储模式---全局事务分支事务信息存储到哪儿?(TC存哪里)存文件或者数据库Seata1.x 支持的模式file:单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高,但是只支持单机模式部署,生产环境不考虑。db:高可用模式,全局事务会话信息通过db共享,相应性能差些 (性能要求不高的话 用db模式)redis:1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的redis持久化配置
----Seata2.x新增的Raft模式https://seata.apache.org/zh-cn/blog/seata-raft-detailed-explanation/利用Raft算法实现多个TC之间数据的同步。(不成熟)raft模式是最理想的方案,但是当前并不成熟,所以不用考虑。- [ ] 思考:RM和TM如何找到TC服务可以将TC服务注册到Nacos,RM和TC通过Nacos注册中心实现TC服务的发现![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/878c8143a02e4367ae073bbc2b3e6c3e.png)- [ ] 思考:TC的配置是不是也可以交个Nacos配置中心管理?注意:Seata的注册中心是作用于Seata自身的,和微服务自身配置的注册中心无关,但可以共用注册中心。可以创建一个seata的命名空间,区分seata的TC服务和业务微服务- [ ] 最终方案:db存储模式+Nacos(注册&配置中心)方式部署1. 前置环境准备1. db模式准备好seata的数据库sql文件:创建seata数据库,sql脚本在seata-server-2.0.0\seata\script\server\db\mysql.sql3. 准备好Nacos环境2.  配置Nacos注册中心配置将Seata Server注册到Nacos,修改/seata/conf/application.yml文件```xmlregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 192.168.1.11:8848namespace: seatagroup: SEATA_GROUPcluster: default```注意这里:需要自己到nacos新建命名空间 seata3.  配置Nacos配置中心   1)配置Nacos配置中心地址,修改conf/application.yml文件```xmlconfig:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: 192.168.1.11:8848namespace: seatagroup: SEATA_GROUPdata-id: seataServer.properties```2)将seata server的配置上传配置至Nacos配置中心a) 获取/seata/script/config-center/config.txt,修改为db存储模式,并修改mysql连接配置
store.mode=db
store.lock.mode=db
store.session.mode=db
# mysql5.x
#store.db.driverClassName=com.mysql.jdbc.Driver
#store.db.url=jdbc:mysql://tlmall-mysql:3306/seata2.0.0?useUnicode=true&rewriteBatchedStatements=true
# mysql8.x
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://tlmall-mysql:3306/seata2.0.0?useUnicode=true&rewriteBatchedStatements=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true
store.db.user=root
store.db.password=root

TC如何使用mysql8?

b) 配置事务分组, TC要与client(RM TM)配置的事务分组一致

事务分组:seata的资源逻辑,可以按微服务的需要,在应用程序(客户端)对自行定义事务分组,每组取一个名字。

集群:seata-server服务端一个或多个节点组成的集群cluster。 应用程序(客户端)使用时需要指定事务逻辑分组与Seata服务端集群的映射关系。
service.vgroupMapping.default_tx_group=default

微服务端要配置的值:default_tx_group

集群:default

事务分组如何找到后端Seata集群?

c) 在nacos配置中心中新建dataId为seataServer.properties的配置,配置内容为上面修改后的config.txt中的配置信息
在这里插入图片描述

完整版的nacos中的配置如下:

client.metadataMaxAgeMs=30000
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.lock.retryTimes=30
client.rm.reportRetryCount=5
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.sqlParserType=druid
client.rm.tableMetaCheckEnable=true
client.rm.tableMetaCheckerInterval=60000
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.tm.rollbackRetryCount=5
client.undo.compress.enable=true
client.undo.compress.threshold=64k
client.undo.compress.type=zip
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.logTable=undo_log
client.undo.onlyCareUpdateColumns=true
log.exceptionRate=100
metrics.enabled=false
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
metrics.registryType=compact
server.distributedLockExpireTime=10000
server.enableParallelHandleBranch=false
server.enableParallelRequestHandle=true
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.committingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.rollbackRetryTimeoutUnlockEnable=false
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.undo.logDeletePeriod=86400000
server.undo.logSaveDays=7
service.vgroupMapping.default_tx_group=default
store.db.branchTable=branch_table
store.db.datasource=druid
store.db.dbType=mysql
store.db.distributedLockTable=distributed_lock
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.globalTable=global_table
store.db.lockTable=lock_table
store.db.maxConn=30
store.db.maxWait=5000
store.db.minConn=5
store.db.password=root
store.db.queryLimit=100
store.db.url=jdbc:mysql://tlmall-mysql:3306/seata2.0.0?useUnicode=true&rewriteBatchedStatements=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true
store.db.user=root
store.lock.mode=db
store.mode=db
store.publicKey=
store.session.mode=db
tcc.contextJsonParserType=fastjson
tcc.fence.cleanPeriod=1h
tcc.fence.logTableName=tcc_fence_log
transport.compressor=none
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.enableTmClientBatchSendRequest=false
transport.heartbeat=true
transport.rpcRmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.serialization=seata
transport.server=NIO
transport.shutdown.wait=3
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.bossThreadSize=1
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.workerThreadSize=default
transport.type=TCP
  1. 启动Seata Server
    windows点击bin目录下seata-server.bat直接启动
    启动成功,查看控制台http://127.0.0.1:7091,账号密码都是seata。
    在Nacos注册中心中可以查看到seata-server注册成功
    mac笔记本执行:
    sh seata-server.sh start
    之后看日志根据控制台提示,我是:seata-server is starting, you can check the /Users/apple/logs/seata/ *.log
    tail -f seata-server.8091.all.log
    即可看到启动日志
3. 微服务整合Seata AT模式实战
a. 业务场景

用户下单,订单服务调用库存服务扣减库存,调用账户服务扣减账户余额
事务发起者:订单服务
事务参与者:库存服务,账户服务

b. 订单服务(事务发起者)整合Seata

1)引入seata的依赖

<!-- seata 依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
  1. 订单服务对应数据库中添加undo_log表(仅AT模式)
CREATE TABLE `undo_log` (`id` bigint NOT NULL AUTO_INCREMENT,`branch_id` bigint NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

源码的init.sql中已经执行过的 不需要在执行
3)订单服务application.yml中添加seata配置

seata:# seata 服务的,事物分组,要与服务端配置service.vgroup_mapping的后缀对应tx-service-group: default_tx_groupregistry:# 指定nacos作为注册中心type: nacosnacos:application: seata-serverserver-addr: 192.168.1.11:8848namespace: seatagroup: SEATA_GROUPconfig:# 指定nacos作为配置中心type: nacosnacos:server-addr: 192.168.1.11:8848namespace: seatagroup: SEATA_GROUPdata-id: seataServer.properties

优化写法:
config:
import:
- optional:nacos:seata-client-${spring.profiles.active}.yml
在这里插入图片描述
新建配置:
在这里插入图片描述

4)订单服务作为全局事务发起者,在下单方法上添加@GlobalTransactional注解

c. 库存服务(事务参与者)整合Seata

和整合订单服务前三步一样
库存服务只需要在扣减库存方法上添加Spring事务@Transactional注解(注意加载service层哈)

d. 账户服务(事务参与者)整合Seata

配置同库存服务一样

4.Seata2.x常见问题
  1. 微服务启动报错:io.seata.config.exception.ConfigNotFoundException: service.vgroupMapping.default_tx_group configuration item is required
    产生的原因&解决思路
    原因:无法拉取到service.vgroupMapping.default_tx_group=default这个配置,也就找不到集群名为default的seata server服务
    思路1:检查下微服务端seata配置是否未配置事务分组seata.tx-service-group=default_tx_group
    思路2:检查下namespace和group配置server端和client端是否对应,特别注意seataServer.properties是否是SEATA_GROUP
  2. seata server报错:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    产生的原因&解决思路
    原因:无法连上数据库
    思路:检查下seataServer.properties中jdbc配置是否正确,检查jdbc版本和mysql版本是否匹配
5.重启所有服务,测试分布式事务是否生效
  • 通过Seata可以解决微服务分布式事务的问题
    下单:http://localhost:8080/order
    分布式事务成功场景,模拟正常下单、扣库存,扣余额
    分布式事务失败场景,模拟下单扣库存成功、扣余额失败,事务是否回滚
    有个问题:seata2.0.0 版本的bug,还是版本不兼容引起的,正常应该抛出业务封装好的异常现在抛出的不是,解决方式是 服务端seata-server版本改为1.7.0
    对异常问题处理的扩展链接
    在这里插入图片描述

2.1.5 流量不再怕:Sentinel限流保护服务

1)微服务架构为什么要使用流控降级组件
    为了提高系统运行期间的稳定性和可用性在微服务环境下,服务之间存在复杂的调用关系,单个服务的故障或过载可能会迅速影响到整个系统,导致服务雪崩效应。流控组件可以限制进入系统的流量,防止系统因超出处理能力而崩溃。降级组件则在服务不可用或响应过慢时,提供降级逻辑,如返回备用数据或执行降级操作,以保证核心业务的正常运行.
需求:对下单接口进行流控
2)sentinel是什么
    Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。[官网](https://sentinelguard.io/zh-cn/docs/introduction.html)
3)sentinel的安装
	官方参考文档https://sentinelguard.io/zh-cn/docs/quick-start.htmlsentinel由两部分构成控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。安装Sentinel控制台安装Sentinel控制台注意版本Sentinel Version: 1.8.6 官方文档地址https://sentinelguard.io/zh-cn/docs/dashboard.html下载地址https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar启动sentinel控制台java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=tlmall-sentinel-dashboard:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar如若8080端口冲突,可使用 -Dserver.port=新端口 进行设置。访问sentinel控制台从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel访问:http://localhost:8888
4)sentinel整合微服务
		官方参考文档 https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel以订单服务为例1)引入sentinel的依赖
<!-- sentinel 依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
			2)业务代码中配置需要保护的资源当 SpringBoot 应用接入 Sentinel starter 后,可以针对某个 URL 进行流控。所有的 URL 就自动成为 Sentinel 中的埋点资源,可以针对某个 URL 进行流控。或者使用@SentinelResource 注解用来标识资源是否被限流、降级。①mvc接口方法自动埋点,不需要配置②非mvc接口方法可以使用@SentinelResource 注解用来标识资源是否被限流、降级③对下单接口进行流控,此处不需要处理3)添加yml配置,为订单服务设置sentinel控制台地址
nacos新增	sentinel-dashboard-dev.yml
spring:cloud:sentinel:transport:# 添加sentinel的控制台地址dashboard: 192.168.3.123:8888修改order的yml增加:- optional:nacos:sentinel-dashboard-${spring.profiles.active}.yml

添加规则在这里插入图片描述
连续测试下单:
在这里插入图片描述

5)小结

通过sentinel可以实现微服务的流控降级
正在更新中。。。。

智能门卫:Gateway轻松守护微服务入口
监控可视化:Skywalking实时追踪服务链路
项目源码地址:https://gitee.com/javanewbie/spring-cloud-alibaba.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503915.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云AI代码助手-每日清单助手

作品简介 每日清单助手是一款可以记录生活的小程序&#xff0c;在人们需要记录时使用&#xff0c;所以根据这个需求来创建的这款应用工具&#xff0c;使用的是腾讯云AI代码助手来生成的所有代码&#xff0c;使用方便&#xff0c;快捷&#xff0c;高效。 技术架构 python语言…

Pytorch学习12_最大池化的使用

输入图像 import torch from torch import nninputtorch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]]) inputtorch.reshape(input,(-1,1,5,5))#二维张量转换为一个四维张量。(batch_size, channels, height, width)print(input.shape)ceil_modeTrue…

009:传统计算机视觉之边缘检测

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 本节来看一个利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测&#xff1f; 边缘检测是通过一些算法来识别图像中物体之间或者物体与背景之间的边界&…

HarmonyOS Next系列之华为账号一键登录功能实现(十四)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

大数据架构设计:数据分层治理的全景指南

大数据架构设计&#xff1a;数据分层治理的全景指南 在大数据架构中&#xff0c;数据分层治理是一种被广泛采用的设计模式&#xff0c;其核心目的是为数据赋予结构化管理的能力&#xff0c;降低复杂度&#xff0c;并为数据的多样化使用场景提供保障。在这篇文章中&#xff0c;…

unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等

目录 1 初始的C# 脚本 1.1 初始的C# 脚本 1.2 创建时2个默认的方法 2 常用的几个生命周期方法 2.1 脚本的生命周期 2.1.1 其中FixedUpdate 方法 的时间间隔&#xff0c;是在这设置的 2.2 c#的基本语法别搞混 2.2.1 基本的语法 2.2.2 内置的方法名&#xff0c;要求更严…

Ubuntu中使用miniconda安装R和R包devtools

安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…

如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]

无论您是在上在线课程还是参加在线会议&#xff0c;您都可能需要在 Windows 10/11 上录制带有音频的屏幕。互联网上提供了多种可选方法。在这里&#xff0c;本博客收集了 3 种最简单的方法来指导您如何在 Windows 10/11 上使用音频进行屏幕录制。请继续阅读以探索&#xff01; …

Python 中几个库的安装与测试

一、jupyter 安装步骤 确保系统已经安装了Python&#xff08;建议 Python 3.6 及以上版本&#xff09;。点击WinR输入cdm进入命令提示符窗口&#xff0c;然后输入pip install jupyter&#xff0c;按下回车键。等待安装过程完成。安装过程中&#xff0c;你会看到命令行输出安装…

【阅读笔记】基于FPGA的红外图像二阶牛顿插值算法的实现

图像缩放技术在图像显示、传输、分析等多个领域中扮演着重要角色。随着数字图像处理技术的发展&#xff0c;对图像缩放质量的要求也越来越高。二阶牛顿插值因其在处理图像时能够较好地保持边缘特征和减少细节模糊&#xff0c;成为了图像缩放中的一个研究热点。 一、 二阶牛顿插…

5.1 数据库:INSERT 插入语句

工作中增删改查这四类sql语句里边用的最多的就是查询语句。因为绝大多数的软件系统都是读多写少的&#xff0c;而且查询的条件也是各种各样。本节课程我们来学习下一个DML语句&#xff0c;那就是向数据表里面写入记录的insert语句。Insert语句是可以向数据表里边写入&#xff0…

【 算法设计与分析-回顾算法知识点】福建师范大学数学与计算机科学学院 2006 — 2007学年第二学期考试 A 卷

一&#xff0e;填空题&#xff08;每空2分&#xff0c;共30分&#xff09; 1&#xff0e;算法的时间复杂性指算法中 元运算 的执行次数。 2&#xff0e;在忽略常数因子的情况下&#xff0c;O、和三个符号中&#xff0c; O 提供了算法运行时间的一个上界。 3&#xff0e;设Dn…

嵌入式技术之Linux(Ubuntu) 一

一、Linux入门 1.硬件和操作系统以及用户的关系 一个传感器&#xff0c;获得数据后&#xff0c;需要向服务器发送数据。传感器传数据给上位机。 上位机需要一个程序来接收数据&#xff0c;那么这个上位机是什么机器&#xff1f; 我们的笔记本电脑就可以当成上位机。 两个手…

Flink系统知识讲解之:如何识别反压的源头

Flink系统知识之&#xff1a;如何识别反压的源头 什么是反压 Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念&#xff0c;强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理&#xff0c;这里有…

浙江安吉成新的分布式光伏发电项目应用

摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾

效果图 IDEA 默认效果是“历史效果”&#xff0c;经过修改后为“预期效果” 设置方式 在设置中找到Editor > Code Style > Java > Wrapping and Braces > Binary expressions > 勾选 Operation sign on next line 即可实现。具体设置如图。

基于phpstudy快速搭建本地php环境(Windows)

好好生活&#xff0c;别睡太晚&#xff0c;别爱太满&#xff0c;别想太多。 声明 仅作为个人学习使用&#xff0c;仅供参考 对于CTF-Web手而言&#xff0c;本地PHP环境必不可少&#xff0c;但对于新手来说从下载PHP安装包到配置PHP环境是个非常繁琐的事情&#xff0c;因此笔者…

后台管理系统引导功能的实现

引导是软件中经常见到的一个功能&#xff0c;无论是在后台项目还是前台或者是移动端项目中。 那么对于引导页而言&#xff0c;它是如何实现的呢&#xff1f;通常情况下引导页是通过 聚焦 的方式&#xff0c;高亮一块视图&#xff0c;然后通过文字解释的形式来告知用户该功能的作…

vscode通过ssh连接服务器实现免密登录

一、通过ssh连接服务器 1、打开vscode&#xff0c;进入拓展&#xff08;CtrlShiftX&#xff09;&#xff0c;下载拓展Remote - SSH。 2、点击远程资源管理器选项卡&#xff0c;选择远程&#xff08;隧道/SSH&#xff09;类别。 3、点击SSH配置。 4、在中间上部分弹出的配置文件…

解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 错误描述 在HBuilderX中执行npm run build总是提醒下载插件&#xff1b;图示如下&#xff1a; 但是&#xff0c;下载总是失败。运行项目时候依然弹出上述提醒。 解决方案 …