当前位置: 首页 > news >正文

快速入门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

相关文章:

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

​ 1 快速入门Spring Cloud Alibaba&#xff0c;轻松玩转微服务 1.1 架构 架构图&#xff1a; 1.2 项目结构 1.2.1 系统框架版本 版本适配查看&#xff1a;https://sca.aliyun.com/docs/2023/overview/version-explain/ Spring Boot Version &#xff1a;3.2.4 Spring Clo…...

浅尝Appium自动化框架

浅尝Appium自动化框架 Appium自动化框架介绍Appium原理Appium使用安装平台驱动 Appium自动化框架介绍 Appium 是一个开源的自动化测试框架&#xff0c;最初设计用于移动应用的测试&#xff0c;但现在它也扩展了对桌面端应用的支持。Appium 使得自动化测试变得更加简单&#xf…...

poi-tl+kkviewfile实现生成pdf业务报告

需求背景&#xff0c;需要把ai生成的一些业务数据&#xff0c;生成一份pdf报告 需求分析 简单来说&#xff0c;就是json生成pdf的方案。 直接生成pdf。适合一些pdf样式简单的场景&#xff0c;一般就是纯文本按序渲染&#xff0c;或者是纯表格。如果需要一些复杂的排布&#x…...

python导入模块失败

运行下面代码模块&#xff0c;出现报错&#xff0c;导入模块失败 import torch from layers.Embed import DataEmbedding from layers.Conv_Blocks import Inception_Block_V1 将你自己的目录添加到 sys.path&#xff0c;假设你的目录位置是D://winhzq//桌面//pydemo//…...

Vulkan 学习(12)---- Vulkan pipeline 创建

目录 Vulkan 渲染管线顶点输入阶段输入装配阶段顶点着色器阶段细分控制、评估着色器阶段(可选)几何着色器阶段(可选)图元装配阶段光栅化阶段片段着色器片段测试阶段混合阶段 Vulkan 渲染管线 渲染管线可以看作是一条生产流水线&#xff0c;定义了从输入顶点到输出图像的所有步…...

BloombergGPT: A Large Language Model for Finance——面向金融领域的大语言模型

这篇文章介绍了BloombergGPT&#xff0c;一个专门为金融领域设计的大语言模型&#xff08;LLM&#xff09;。以下是文章的主要内容总结&#xff1a; 背景与动机&#xff1a; 大语言模型&#xff08;如GPT-3&#xff09;在多个任务上表现出色&#xff0c;但尚未有针对金融领域的…...

来说数据库

什么是数据库&#xff1f; 是部署在操作系统上&#xff0c;把数据按一定的数据模型组织、永久存储&#xff0c;并可以被用户共享的软件系统。 其实数据库&#xff0c;可以理解为&#xff0c;把数据都存成文件&#xff0c;有很多的文件和很多的目录&#xff0c;不好管理&#xf…...

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站&#xff1a;https://www.jetbrains.com/pycharm/。下载社区版&#xff08;免费&#xff09;或专业版&#xff08;收费&#xff0c;提供更多功能&#xff09;。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm&#xff0c;并根…...

嵌入式驱动开发详解11(INPUT子系统)

文章目录 前言input子系统简介主要结构体API函数input子系统驱动框架上报事件后续设备树配置方式参考文献 前言 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input 子系统的框架来处理输入事件。输入设备本质上还是字符设备&…...

动态规划解决目标和问题

代码随想录链接:代码随想录 思路: 可以将数组分为两部分&#xff0c;其中一部分记作left&#xff0c;其中数字的符号全为,而另外一部分记作right&#xff0c;其中数字的符号全为-。这里全为-的意思不是真正的符号为-&#xff0c;而表示这一堆数字在计算时取值为负 因此有如下…...

【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行

0x00 前言 最近在做渗透笔记&#xff0c;其中有一个靶机在getshell后&#xff0c;需要进行提权。发现靶机使用root启动的mysql服务&#xff0c;那么尝试使用UDF提权。于是在提权成功后&#xff0c;花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用&#xff0c;加深理解。…...

特种设备安全管理人员免费题库限时练习(判断题)

56.(判断题)特别重大事故、重大事故、较大事故和一般事故,负责事故调查的人民政府应当自收到事故调查报告之日起15日内做出批复。 A.正确 B.错误 答案:错误 57.(判断题)每一类事故灾难的应急救援措施可能千差万别,因此其基本应急模式是不一致的。 A.正确 B.错误 答案:错…...

linux-25 文件管理(三)复制、移动文件,cp,mv

命令cp是copy的简写&#xff0c;而mv则是move的简写。那既然copy是用于实现复制文件的&#xff0c;那通常一般我们要指定其要复制的是谁&#xff1f;而且复制完以后保存在什么地方&#xff0c;对吧&#xff1f;那因此它的使用格式很简单&#xff0c;那就是cp srcfile dest&…...

中国科技统计年鉴EXCEL版(2021-2023年)-社科数据

中国科技统计年鉴EXCEL版&#xff08;2021-2023年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028724 https://download.csdn.net/download/paofuluolijiang/90028724 中国科技统计年鉴提供了从2021至2023年的详尽数据&#xff0c;覆盖了科技…...

Idea(中文版) 项目结构/基本设置/设计背景

目录 1. Idea 项目结构 1.1 新建项目 1.2 新建项目的模块 1.3 新建项目模块的包 1.4 新建项目模块包的类 2. 基本设置 2.1 设置主题 2.2 设置字体 2.3 设置注释 2.4 自动导包 2.5 忽略大小写 2.6 设置背景图片 3. 项目与模块操作 3.1 修改类名 3.2 关闭项目 1. I…...

jenkins入门--安装jenkins

下载地址https://www.jenkins.io/ jdk 安装 &#xff1a;Jenkins需要安装对应版本的jdk,我在安装过程中显示需要21,17 Java Downloads | Oracle jenkins安装过程参考全网最清晰Jenkins安装教程-windows_windows安装jenkins-CSDN博客 安装完成后&#xff0c;浏览器输入127.0.…...

基于Springboot + vue实现的小型养老院管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…...

shell基础使用及vim的常用快捷键

一、shell简介 参考博文1 参考博文2——shell语法及应用 参考博文3——vi的使用 在linux中有很多类型的shell&#xff0c;不同的shell具备不同的功能&#xff0c;shell还决定了脚本中函数的语法&#xff0c;Linux中默认的shell是 / b in/ b a s h &#xff0c;流行的shell…...

Mac 安装psycopg2出错:Error:pg_config executable not found的解决

在mac 上执行pip3 install psycopg2-binary出现如下错误&#xff1a; Error:pg_config executable not found然后我又到终端里执行 brew install postgresql16 显示 Warning: You are using macOS 15. We do not provide support for this pre-release version. It is expe…...

UniApp | 从入门到精通:开启全平台开发的大门

UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…...

Kafka3.x KRaft 模式 (没有zookeeper) 常用命令

版本号&#xff1a;kafka_2.12-3.7.0 说明&#xff1a;如有多个地址&#xff0c;用逗号分隔 创建主题 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1删除主题 bin/kafka-topics.sh --delete --boots…...

【竞技宝】CS2:NertZ离队Liquid光速加盟!

2025年1月7日&#xff0c;目前CS2的赛事正处于空窗期中&#xff0c;很多队伍在近期都在进行阵容上的调整&#xff0c;其中出现了很多震惊观众的转会消息。今日凌晨&#xff0c;HEROIC官宣队内的NertZ选手正式离队&#xff0c;此后Liquid很快发布消息宣布了NertZ的加盟。 今日凌…...

PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 PDFMathTranslate是一个开源项目&#xff0c;旨在为用户提供便捷的PDF科学论文翻译解决方案。它不仅能够翻译文本&#xff0c;还能保留公式、图表、目…...

滑动窗口——最小覆盖子串

一.题目描述 76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 题目还是很好理解的&#xff0c;就是在字符串s中找到一个子串&#xff0c;该子串包含字符串t的所有字符。返回最短的子串。如果s中不包含这样的子串就返回一个空串。 需要注意的是&#…...

2012mfc,几种串

串,即是由符组成的串,在标准C,标准C,MFC中串这一功能的实现是不相同的,C完全兼容了C. 1.标准C中的串 在标准C中没有串数据类型,C中的串是有符类型的符数组或符类型的符指针来实现的.如: char name[26]"This is a Cstyle string"; //或char *name"This is a…...

基于SpringBoot的乐器商城购物推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维

Jurgen提出的Highway Networks&#xff1a;LSTM时间维方法应用到深度维 具体实例与推演 假设我们有一个离散型随机变量 X X X&#xff0c;它表示掷一枚骰子得到的点数&#xff0c;求 X X X 的期望。 步骤&#xff1a; 列出 X X X 的所有可能取值 x i x_i xi​&#xff08;…...

asp.net core中的 Cookie 和 Session

在 Web 开发中&#xff0c;用户会话管理是非常重要的&#xff0c;尤其是在需要保持用户状态和身份验证的应用中。ASP.NET Core 提供了多种状态管理技术&#xff0c;如 Cookie 和 Session&#xff0c;它们可以帮助你管理用户会话、存储数据并实现用户身份验证等功能。下面将详细…...

【STM32+CubeMX】 新建一个工程(STM32F407)

相关文章&#xff1a; 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定&#xff1a;本系列的前五篇&#xff0c;为了方便新手玩家熟悉CubeMX、Keil的使用&#xff0c;会详细地截图每一步Cu…...

IO进程day1

一、思维导图...

剧本字幕自己看

Hello English learners! Welcome back to my channel! My name is Ethan, and today we’re diving into a topic we deal with every day—traffic. 大家好,英语学习者们!欢迎回到我的频道!我是Ethan,今天我们要聊一个每天都会遇到的话题——交通。 When I drive somewh…...

Java排序

Map Stream 排序 最簡單的排序方式 Map<String,String> _lineMap = _itRow.next();_lineMap = _lineMap.entrySet().stream().sorted((i1,i2)>i1.getKey().compareTo(i2.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(e1,e2)->e…...

Geoserver修行记-后端调用WMS/WMTS服务无找不到图层Could not find layer

项目场景 调用geoserver地图服务WMS,找不到图层 我在进行地图服务调用的时候&#xff0c;总是提示我找不多图层 Could not find layer&#xff0c;重点是这个图层我明明是定义了&#xff0c;发布了&#xff0c;且还能够正常查看图层的wms的样式&#xff0c;但是在调用后端调用…...

JavaScript代码片段二

见过不少人、经过不少事、也吃过不少苦&#xff0c;感悟世事无常、人心多变&#xff0c;靠着回忆将往事串珠成链&#xff0c;聊聊感情、谈谈发展&#xff0c;我慢慢写、你一点一点看...... JavaScript统计文字个数、特殊字符转义、动态插入js代码、身份证验证 统计文字个数 f…...

Opencv图片的旋转和图片的模板匹配

图片的旋转和图片的模板匹配 目录 图片的旋转和图片的模板匹配1 图片的旋转1.1 numpy旋转1.1.1 函数1.1.2 测试 1.2 opencv旋转1.2.1 函数1.2.2 测试 2 图片的模板匹配2.1 函数2.2 实际测试 1 图片的旋转 1.1 numpy旋转 1.1.1 函数 np.rot90(kl,k1)&#xff0c;k1逆时针旋转9…...

ebpf 笔记

eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能 https://zhuanlan.zhihu.com/p/712220029 eBPF技术简介 - 阅读清单 - 腾讯云开发者社区-腾讯云 从石器时代到成为“神”&#xff0c;一文讲透eBPF技术发展演进史 …...

C++编程基础之override关键字

在C中&#xff0c;override关键字用于显式地标识派生类中的成员函数是对基类中虚函数的重写&#xff0c;具有以下重要作用和使用说明&#xff1a; 作用 增强代码可读性&#xff1a;通过使用override关键字&#xff0c;能够清晰地向阅读代码的人表明该函数是有意重写基类中的虚…...

自动化之数据库:docker部署mongo,为下一步的使用打下基础

以下是一个详细的Docker Compose配置示例&#xff0c;用于设置一个包含三个节点的MongoDB副本集&#xff0c;并确保安全性&#xff08;使用账号密码进行认证&#xff09;。所有节点都将设置在同一个Docker网络&#xff08; py-mongo &#xff09;下&#xff0c;以便于未来的扩…...

VR+智慧消防一体化决策平台

随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术与智慧城市建设的结合越来越紧密。在消防安全领域&#xff0c;VR技术的应用不仅能够提升消防训练的效率和安全性&#xff0c;还能在智慧消防一体化决策平台中发挥重要作用。本文将探讨“VR智慧消防一体化…...

新能源网站提升用户体验的关键

新能源网站的用户体验对于吸引和留住访问者至关重要。一个优秀的用户体验可以增加用户的满意度&#xff0c;提高他们对网站的忠诚度。在设计新能源网站时&#xff0c;关键在于简洁明了的界面和易于导航的布局。用户应该能够轻松找到他们需要的信息&#xff0c;而不会感到困惑或…...

【12_多数元素】

问题 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 思路 使用摩尔投票算法来解决。该算法的基本思想是维护一个候选人和一个…...

深入理解 Android 中的 ActivityInfo

深入理解 Android 中的 ActivityInfo 在 Android 开发中&#xff0c;ActivityInfo 是一个非常重要的类&#xff0c;它包含了关于 Activity 的元信息。这些信息通常是从 AndroidManifest.xml 文件中提取的&#xff0c;开发者可以通过 ActivityInfo 类来获取和操作这些信息。本文…...

【通识安全】煤气中毒急救的处置

1.煤气中毒的主要症状与体征一氧化碳中毒&#xff0c;其中毒症状一般分为轻、中、重三种。 (1)轻度&#xff1a;仅有头晕、头痛、眼花、心慌、胸闷、恶心等症状。如迅速打开门窗&#xff0c;或将病人移出中毒环境&#xff0c;使之吸入新鲜空气和休息&#xff0c;给些热饮料&am…...

windows从0开始配置llamafactory微调chatglm3-6b

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、准备工作1、创建python虚拟环境(annoconda)2、配置pytorch傻瓜版3、llamafactory配置4、微调数据准备 一、准备工作 1、创建python虚拟环境(annoconda) 本篇文…...

IM-Magic Partition Resizer(分区调整软件) v7.5.0 多语便携版

IM-Magic Partition Resizer是一款功能强大的分区调整软件&#xff0c;允许用户调整并重新分配硬盘分区空间&#xff0c;从而在不丢失数据的情况下改变分区的大小和位置。 软件功能 支持调整和重新分配硬盘分区的空间大小。能够将分区扩大或缩小而不会导致数据丢失。可以改变分…...

matlab中高精度计算函数vpa与非厄米矩阵本征值的求解

clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…...

流程图(四)利用python绘制漏斗图

流程图&#xff08;四&#xff09;利用python绘制漏斗图 漏斗图&#xff08;Funnel Chart&#xff09;简介 漏斗图经常用于展示生产经营各环节的关键数值变化&#xff0c;以较高的头部开始&#xff0c;较低的底部结束&#xff0c;可视化呈现各环节的转化效率与变动大小。一般重…...

Elasticsearch:索引mapping

这里写目录标题 一、介绍二、动态mapping三、mapping属性&#xff08;1&#xff09;analyzer&#xff08;分析器&#xff09;(2) coerce&#xff08;强制类型转换&#xff09;&#xff08;3&#xff09;copy_to&#xff08;合并参数&#xff09; 一、介绍 二、动态mapping 三…...

AI赋能跨境电商:魔珐科技3D数字人破解出海痛点

跨境出海进入狂飙时代&#xff0c;AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节&#xff0c;迎来了发展的高光时刻。生成式AI时代的大幕拉开&#xff0c;AI工具快速迭代&#xff0c;为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…...

计算机网络之---信号与编码

信号 在物理层&#xff0c;信号是用来传输比特流的物理量&#xff0c;它可以是电压、电流、光强度等形式&#xff0c;通常通过电缆、光纤或者无线信道等媒介传播。 信号主要分为以下两种类型&#xff1a; 模拟信号&#xff08;Analog Signal&#xff09;&#xff1a;信号在时间…...