1 Star 0 Fork 0

紫陌红尘 / Spring Cloud Alibaba

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

常见问题:

  1. Whitelabel Error Page 原因 : 白页

  2. 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"})

  3. No instances available for 127.0.0.1 restTemplate开启负载均衡后,127.0.0.1修改为服务提供者名称

Spring Cloud Alibaba

Spring Cloud Alibaba(下文简称为 SCA ) 致力于提供微服务开发的一站式解决方案。

  1. Spring Cloud Gateway:网关
  2. Nacos:服务注册和配置中心 (Nacos Server)
  3. Sentinel:熔断限流 (sentinel-dashboard)
  4. Seata:分布式事务 (Seata Server)
  5. RocketMQ:消息队列,削峰填谷
  6. Docker:使用Docker进行容器化部署
  7. Kubernetes:使用k8s进行容器化部署

用户购买商品的业务逻辑。整个业务逻辑由 3 个微服务提供支持: 仓储服务:对给定的商品扣除仓储数量。 订单服务:根据采购需求创建订单。 帐户服务:从用户帐户中扣除余额。 按顺序启动 Account, Storage, Order, Business 服务

注册中心 - Nacos

开放端口: 8848 9848 启动 Nacos Server 在接入 spring-cloud-starter-alibaba-sidecar 之前,首先需要启动 Nacos Server。

  1. 下载 下载 Nacos 二进制文件 并解压; https://github.com/alibaba/nacos/releases

  2. 配置 配置数据源 开启鉴权 设置服务端验证 key 设置默认 token

  3. 启动 下载解压后 我们需要进入到 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)。

  1. 依赖

  2. 配置

  3. 注解 启动类或配置文件

配置中心 - Config

动态刷新配置、监听配置变化等

分布式事务 - Seata

开放端口: 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

  1. 服务端配置 seata-->conf-->application.yml
  1. config 注意: 需要在Nacos先添加配置

  2. registry

    registry:
      type: nacos
      nacos:
         application: seata-server
         serverAddr: 127.0.0.1:8848
         group: SEATA_GROUP
         namespace: xxxxxx
         username: xxxx
         password: xxx
  1. store 修改store.mode="db或者redis" 修改store.db或store.redis相关属性
  1. 服务端启动 seata-server.bat -h 127.0.0.1 -p 8091 -m db sh seata-server.sh -h 127.0.0.1 -p 8091 -m db

注意: 日志目录/root/logs/seata, 如果没有可以手动创建

  1. 客户方使用
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

流量控制和服务保护

服务雪崩:在整条链路的服务中,一个服务失败,导致整条链路的服务都失败的情形。 服务熔断:当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。 服务降级: 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度! 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!

限流虽然可以避免因高并发引起的服务故障,但是服务还是可能会因为其他原因故障. 如果要将这些故障控制住,避免雪崩,就需要靠线程隔离和熔断降级的了

Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流: route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

  1. 添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>版本号</version>
</dependency>
  1. 定义资源
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 控制面板

  1. 下载 https://github.com/alibaba/Sentinel/releases

  2. 运行 java -jar -Dserver.port=8720 sentinel-dashboard-1.8.7.jar

  3. 依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 配置
spring:
  application:
    name: service-consumer          #服务名
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848   #nacos服务地址
    sentinel:
      transport:
        dashboard: 127.0.0.1:8720
  1. 设置资源点(埋点) 通过 @SentinelResource 注解,设置监控点(定义控制资源、配置控制策略) value: 名称 blockHandler: 流控 fallback: 熔断
    @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 + ": 熔断降级";
    }
  1. 登录 先访问资源 http://localhost:8720/ 用户名: sentinel 密码: sentinel
  • 流控规则 阈值类型: 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里。如果没有发生拦截,则该日志不会出现。

分布式消息 - RocketMQ

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

异构服务 - Sidecar

canal

同步Mysql数据库到redis/ElasticSearch

  1. canal.deployer-1.1.5.tar.gz
  1. RabbitMQ连接配置 canal.properties

canal.serverMode = rabbitMQ

canal.mq.topic=canal-routing-key

然后找到关于RabbitMQ的配置: #################################################
######## RabbitMQ ############
#################################################

连接rabbit,写IP,因为同个网络下,所以可以写容器名

rabbitmq.host = myrabbit
rabbitmq.virtual.host = /

交换器名称,等等我们要去手动创建

rabbitmq.exchange = canal-exchange

账密

rabbitmq.username = admin
rabbitmq.password = 123456

instance.properties 监听数据库配置

  1. canal.admin-1.1.5.tar.gz spring boot框架开发的web项目啦,canal_manager.sql 导入数据库 sh bin/startup.sh 这时候通过主机ip:8089就能在浏览器访问,默认登录用户名密码:admin/123456

  2. 集成

<dependency>
    <groupId>com.alibaba.otter</groupId>
    <artifactId>canal.client</artifactId>
    <version>1.1.7</version>
</dependency>

//https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardBinCheck=true&cardNo=6228232019012659877

空文件

简介

spring-cloud-alibaba 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/wmainng/spring-cloud-alibaba.git
git@gitee.com:wmainng/spring-cloud-alibaba.git
wmainng
spring-cloud-alibaba
Spring Cloud Alibaba
master

搜索帮助