Skip to content

Spring Cloud Alibaba

Spring Cloud Alibaba 知识图谱

参考资料

https://spring.io/projects/spring-cloud-alibaba/#learn

https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

https://github.com/alibaba/Sentinel/wiki

https://nacos.io/zh-cn/docs/quick-start-docker.html

https://nacos.io/zh-cn/docs/concepts.html

https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html

https://github.com/alibaba/Sentinel/releases

前置

压测工具

启动mysql

yml
version: '3.9'
services:
  mysql:
    restart: always
    image: mysql:5.7.40
    container_name: mysql
    hostname: mysql
    ports:
      - 3307:3306
    environment:
      MYSQL_USER: nacos
      MYSQL_PASSWORD: nacos
      MYSQL_ROOT_PASSWORD: root
    volumes:
     - ./mysql_data:/var/lib/mysql

networks:
  default:
    external: true
    name: global

导入数据库

  • nacos_devtest

https://raw.githubusercontent.com/alibaba/nacos/develop/distribution/conf/mysql-schema.sql

启动nacos

yml
version: "3.9"
services:
  nacos:
    image: nacos/nacos-server:v2.2.0
    container_name: nacos-standalone-mysql
    env_file:
      - ../env/custom-application-config.env
    volumes:
      - ./standalone-logs/:/home/nacos/logs
      - ./init.d/application.properties:/home/nacos/conf/application.properties
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9555:9555"

networks:
  default:
    external: true
    name: global

父工程

  • pom.xml
xml
<packaging>pom</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.6.11</version>
</parent>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.4.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
 </dependencyManagement>

注册中心客户端

导入依赖

  • spring-boot-starter-web
  • spring-cloud-starter-alibaba-nacos-discovery

配置

yml
server:
  port: 8080

spring:
  application:
    name: Client
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public

启动器

java
@SpringBootApplication
@EnableDiscoveryClient

服务通信

  1. DiscoveryClient+RestTemplate,与 netflix 一样

  2. RestTemplate+LoadBalanced,需要添加依赖

  • spring-cloud-starter-loadbalancer

配置中心

服务端

图形化配置使用即可

客户端

导入依赖

  • spring-cloud-starter-bootstrap
  • spring-cloud-starter-alibaba-nacos-config

配置

必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址

  • bootstrap.properties

nacos配置中的Data ID需要配置为register.properties

properties
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=yaml
spring.profiles.active=develop
  • bootstrap.yml

nacos配置中的Data ID需要配置为register.yaml

yaml
spring:
  application:
    name: register
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
#        namespace配置后,整个程序崩溃,原因不明
#        namespace: public

读取

java
@Controller
@RefreshScope
public class RegisterController {
    @Value("${custom.username}")
    private String customUsername;

    @RequestMapping("/refresh_config")
    @ResponseBody
    public String refreshConfig() {
        return customUsername;
    } 
}

多配置文件拼接

yml
spring:
  cloud:
    nacos:
      config:
     # 测试发现,extension-configs与shared-configs效果一样
        shared-configs:
          - data-id: common1.yaml
    - data-id: common2.yaml

sentinel

快速入门

下载

https://github.com/alibaba/Sentinel/releases

启动

用户名和密码都是sentinel

bash
java -jar sentinel-dashboard-1.8.6.jar

导入依赖

  • spring-cloud-starter-alibaba-sentinel
  • sentinel-datasource-nacos

编写配置

  • application.yml
yml
spring:
  cloud:
    sentinel:
   transport:
     dashboard: localhost:8080
  port: 8719
management:
  endpoints:
    web:
      exposure:
        include: "*"

访问仪表盘

初次访问什么都没有,原因是sentinel控制台懒加载,需要访问客户端,客户端才会把自己的访问信息推送给sentinel

流控规则入门

概念

  • QPS(Queries Per Second)
  • TPS(Transactions Per Second)

配置

进入簇点链路配置 +流控 单机阈值1 qps

查看配置

导航: 流控规则

线程流控演示

浏览器狂刷

流控规则深入

流控模式

  • 直接

  • 关联

    你生病,我吃药 postman疯狂刷新B,浏览器访问A

  • 链路

流控效果

  • 直接

  • 预热 <github.com/alibaba/Sentinel/wiki/限流--冷启动>

    假设 单机阈值10 预热时长5 效果为: 从3开始(10/3),5秒钟后达到10 测试时狂点,错误页面越来越少

  • 排队等待

    排队等待

JMeter

安装

  1. 改编码

开jmeter.properties

sampleresult.default.encoding

改成UTF-8

  1. 改语言

开jmeter.properties

language

改成zh_CN

入门使用(GET)

  1. 测试计划右键-添加-线程(用户)-线程组

  2. 线程组右键-添加-取样器-HTTP 请求

  3. 配置

  • 协议: http
  • 服务器名称或 ip: local
  • 端口号: 8080
  • 方法: GET
  • 路径: /api/departments
  1. 测试计划右键-添加-监听器-查看结果树

  2. 绿色按钮 Run

并发访问与顺序访问

测试计划-勾选独立运行每个线程组(例如在一个组运行结束后启动下一下)

两个特殊线程组

setUp 线程组 tearDown 线程组

线程属性

线程数 Ramp-Up 时间 循环次数 调度器

http请求默认值

测试计划右键-添加-配置元件-HTTP 请求默认值

信息头管理器

测试计划右键-添加-配置元件-HTTP 信息头管理器 Content-Type: application/json;charset=utf-8

熔断降级

https://github.com/alibaba/Sentinel/wiki/熔断降级

SentinelResource注解

类似HystrixCommand

配置到方法头

Seata

下载seata-server

https://github.com/seata/seata/releases

改配置

  • registry.conf

改两处: 注册中心、配置中心

type="nacos"

  • nacos-config.txt

my_test_tx_group改成微服务名称

service.vgroup_mapping.my_test_tx_group=default

service.vgroup_mapping.product-service=default

service.vgroup_mapping.order-service=default

初始化seata在nacos的配置

注意localhost是注册中心地址

nacos-config.sh localhost

启动seata

seata-server.bat -p 9000 -m file

导入依赖

  • spring-cloud-starter-alibaba-seata

配置DataSourceProxyConfig

Seata是通过代理数据源实现事务分支的,所以需要配置io.seata.rm.datasource.DataSourceProxy的Bean,且是@Primary默认的数据源,否则事务不会回滚,无法实现分布式事务

java
@Configuration
public class DataSourceProxyConfig {
 @Primary
 @Bean
 public DataSourceProxy dataSource(DruidDataSource ds) {
  return new DataSourceProxy(ds);
 }
}

配置文件

将 seata 中的 registry.conf 拿过来,放到 maven 项目的 resources 目录

application.yml

yml
spring:
  alibaba:
    seata:
   tx-service-group: ${spring.application.name}

开启全局事务控制

java
@GlobalTransactional

测试

测试