目录

Spring Cloud Alibaba 安装

# Spring Cloud Alibaba 组件

Nacos:注册中心 & 配置中心

Sentienl:流量控制 & 服务熔断、降级

Seata:分布式事务

OOS:云存储服务

# Nacos

Nacos 的全称是 Dynamic Naming and Configuration Service,Na 为 naming/nameServer 即注册中心,co 为 configuration 即注册中心,service 是指该注册/配置中心都是以服务为核心。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

官方网址:https://nacos.io/zh-cn/

# 安装

安装包下载地址:https://github.com/alibaba/nacos/releases

解压后会有两个重要的文件夹:

  • bin:运行脚本

  • conf:配置文件

主要的安装是配置文件修改:

# 端口修改

Nacos 的默认端口是 8848,如果要修改,前往 conf/application.properties(如果没有则复制一份 application.properties.example 文件,改名即可) 修改,找到 server.port=8848 进行修改。

# 数据库修改

如果将 Nacos 里的配置进行持久化,则配置 MySQL,将配置存到 MySQL。

在 config 找到 nacos-mysql.sql 文件,在 MySQL 先创建 nacos_config 数据库,然后执行该 sql 文件,在 nacos_config 数据库生成 Nacos 需要的表。

最后打开 conf/application.properties,替换为如下配置:

spring.sql.init.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://172.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=5000&socketTimeout=8000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1234
1
2
3
4
5
6
7
8
9

如果实现数据库高可用,则可以配置多个数据库,需要修改 db.num 和添加多个数据库源。

spring.sql.init.platform=mysql

### Count of DB:
db.num=2

### Connect URL of DB:
db.url.0=jdbc:mysql://172.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=5000&socketTimeout=8000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=Arthur10035@202207

db.url.1=jdbc:mysql://172.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=5000&socketTimeout=8000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.1=root
db.password.1=1234
1
2
3
4
5
6
7
8
9
10
11
12
13

多数据库源通过 .0.1 来区分,如果需要更多数据库,依次类推。

# 单机

Nacos 默认是集群启动方式。如果是单机(一台 Nacos)运行,则需要修改启动方式,编辑 bin/startup.cmd(Windows)或者 /bin/startup.sh(Linux)。

如果是 Windows,则找到

set MODE="cluster"
1

修改为:

set MODE="standalone"
1

然后双击修改后的该文件启动即可。

如果是 Linux,则找到

export MODE="cluster"
1

修改为:

export MODE="standalone"
1

# 集群

Nacos 默认是集群启动方式,所以无需修改启动方式,而是配置多个集群地址即可。打开 conf/cluster.conf(如果没有则复制一份 cluster.conf.example 文件,改名即可),添加自己的地址和其他 Nacos 的地址(其他 Nacos 也要打开自己的该文件,配置双方 Nacos 地址,实现双向奔赴)。

172.16.49.42:8848 # 自己的地址
172.16.49.46:8848 # 其他 Nacos 的地址
1
2

最后运行脚本 startup.cmd 或者 startup.sh 即可。

如果默认端口、本地运行,则访问 http://localhost:8848/nacos 进入控制台页面。

# 客户端配置

安装依赖

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1
2
3
4
5
6
7
8

一个 Nacos 的配置中心使用,一个是 Nacos 的服务注册使用。

application.yml 配置 Nacos 配置中心和服务注册的地址:

spring:
  application:
    name: generic-service # 项目名
  profiles:
    active: dev # 运行环境
  cloud:
    nacos:
      config: # 配置中心
        server-addr: 172.16.138.184:8848 # Nacos 地址
        file-extension: yaml # 文件后缀名
        namespace: 5014d494-958a-4476-9aad-880c2a0c9498 # 命名空间 ID
        group: SIS_GROUP # 读取文件所在的组
        
    discovery: #服务注册
        service: ${spring.application.name} # 使用微服务的名称作为注册的服务名称
        server-addr: 172.16.138.184:8848 # Nacos服务地址
        namespace: 5014d494-958a-4476-9aad-880c2a0c9498 # 命名空间 ID
        group: DEFAULT_GROUP # 读取文件所在的组
        
  config: # 指定该项目读取配置中心的文件名
    import:
      - optional:nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
      - optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
      - optional:nacos:nacos-discovery.yaml?group=DEFAULT_GROUP&refreshEnabled=true
      - nacos:datasource.yaml?group=DEFAULT_GROUP&refreshEnabled=true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# Sentinel

# 概述

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件

Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现

  • 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等

# Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

# Sentinel 的组成

Sentinel 主要由以下两个部分组成:

  • Sentinel 核心库:Sentinel 的核心库不依赖任何框架或库,能够运行于 Java 8 及以上的版本的运行时环境中,同时对 Spring Cloud、Dubbo 等微服务框架提供了很好的支持

  • Sentinel 控制台(Dashboard):Sentinel 提供的一个轻量级的开源控制台,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能

Sentinel 核心库不依赖 Sentinel Dashboard,但两者结合使用可以有效的提高效率,让 Sentinel 发挥它最大的作用。

# 安装控制台

Sentinel 提供了一个轻量级的开源控制台 Sentinel Dashboard,它提供了机器发现与健康情况管理、监控(单机和集群)、规则管理与推送等多种功能。

Sentinel 控制台提供的功能如下:

  • 查看机器列表以及健康情况:Sentinel 控制台能够收集 Sentinel 客户端发送的心跳包,判断机器是否在线

  • 监控(单机和集群聚合):Sentinel 控制台通过 Sentinel 客户端暴露的监控 API,可以实现秒级的实时监控

  • 规则管理和推送:通过 Sentinel 控制台,我们还能够针对资源定义和推送规则

  • 鉴权:从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel

Sentinel Dashboard 是我们配置和管理规则(例如流控规则、熔断降级规则等)的重要入口之一。通过它,我们不仅可以对规则进行配置和管理,还能实时查看规则的效果。

下载地址 (opens new window)

启动:(全部使用默认配置)

java -jar sentinel-dashboard-1.8.6.jar
1

启动时指定端口:

java -Dserver.port=8480 -jar sentinel-dashboard-1.8.6.jar
1

启动时指定端口,是否监控自己,项目名称,登录的帐号和密码:

java -Dserver.port=8480 -Dcsp.sentinel.dashboard.server=localhost:8480 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard-1.8.6.jar
1

参数说明:(注意:参数要放到 -jar 的前边)

# 指定控制台的端口为8480
-Dserver.port=8480 
# 指定要被哪个控制台监控(这里指定的是自己监控自己)
-Dcsp.sentinel.dashboard.server=localhost:8480 
# 指定实例名称(名称会在控制台左侧以菜单显示)
-Dproject.name=sentinel-dashboard 
# 设置登录的帐号为:sentinel 
-Dsentinel.dashboard.auth.username=sentinel 
# 设置登录的密码为:123456
-Dsentinel.dashboard.auth.password=123456 
1
2
3
4
5
6
7
8
9
10

# 客户端配置

引入依赖:

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
1
2
3
4
5
6
7
8

第一个是 Sentinel 的使用,第二个是 Sentinel 读取在 Nacos 的配置。

application.yml 配置 Sentienl 的地址:

spring:
  application:
    name: generic-service # 项目名
  profiles:
    active: dev # 运行环境
  cloud:
    sentinel:
      transport:
        dashboard: 172.16.138.184:8080 # 控制台地址
      web-context-unify: false
      datasource: # 读取在 Nacos 的配置
        generic-service: # 随便取,这里以项目名命名
          nacos:
            server-addr: 172.16.138.184:8848 # nacos地址
            namespace: 5014d494-958a-4476-9aad-880c2a0c9498 # 命名空间 ID
            dataId: ${spring.application.name}-flow-rules # 文件名
            groupId: SIS_GROUP # 文件所在的分组
            dataType: json # 文件是 JSON 格式
            ruleType: flow # 规则类型
            username: nacos # Nacos 用户名
            password: nacos # Nacos 密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

此时在 Sentinel 可以读取 Nacos 的配置,但是无法在 Sentinel 添加规则配置时,同步到 Nacos。

换句话说,就是我们目前只能在 Nacos 手动添加 Sentienl 需要的规则配置,然后 Sentienl 去读取,而无法我们在操作 Sentienl 的规则时,这些规则自动同步到 Nacos。也就是 Nacos 单向奔赴。

如果 Sentinel 的规则配置自动同步到 Nacos,进行如下操作:

# Seata

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 ATTCCSAGAXA 事务模式,为用户打造一站式的分布式解决方案。

  • 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入

  • 高性能:减少分布式事务解决方案所带来的性能消耗

官方文档:https://seata.io/zh-cn/index.html

seata 的几种术语:

  • TC(Transaction Coordinator):事务协调者。管理全局的分支事务的状态,用于全局性事务的提交和回滚

  • TM(Transaction Manager):事务管理者。用于开启、提交或回滚事务

  • RM(Resource Manager):资源管理器。用于分支事务上的资源管理,向 TC 注册分支事务,上报分支事务的状态,接收 TC 的命令来提交或者回滚分支事务

# 安装

下载地址:http://seata.io/zh-cn/blog/download.html

接着解压下载的压缩包。

# 数据库创建

在 MySQL 创建 Seata 需要的务日志,回滚日志等表。

先在 MySQL,创建 seata 数据库,然后打开 script\server\db,在 MySQL 运行 mysql.sql,最后可以看到 seata 数据库下有 Seata 需要的表。

此时 Seata 还没有和 seata 数据库绑定,下面配置文件修改将进行绑定。

# 配置文件修改

这里将修改 Seata 的一些配置:

  • 绑定 Nacos,从 Nacos 读取需要的配置文件

  • 注册 Nacos,将 Seata 服务注册到 Nacos

  • 持久化 MySQL,Seata 执行过程的事务日志,回滚日志存储到 MySQL

打开 conf/application.yml 文件,修改 config、registry、store 配置:

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 172.16.138.184:8848
      namespace: 5014d494-958a-4476-9aad-880c2a0c9498 # 命名空间 ID
      group: SEATA_GROUP
      username: nacos
      password: nacos
      data-id: seataServer.properties
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 172.16.138.184:8848
      group: SEATA_GROUP
      namespace: 5014d494-958a-4476-9aad-880c2a0c9498 # 命名空间 ID
      cluster: default # 集群名
      username: nacos
      password: nacos
  store:
    # support: file 、 db 、 redis
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
      user: mysql
      password: mysql
      min-conn: 10
      max-conn: 100
      global-table: global_table
      branch-table: branch_table
      lock-table: lock_table
      distributed-lock-table: distributed_lock
      query-limit: 1000
      max-wait: 5000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

具体的 Nacos 地址、登录和 MySQL 的地址、登录根据情况配置。

如果需要更多的配置参考,请打开 application.example.yml 参考。

# 配置同步到 Nacos

我们需要实现准备 Seata 需要的配置文件,将其放到 Nacos,这样启动的时候 Seata 就能读取到。

在 Nacos 新建一个配置,名字叫做 seataServer.properties,然后将 script/config-center/config.txt 的内容复制过来,其中如果没用到 Redis 和 file,都可以删除,然后三个 store.mode 都改成 db,接着修改 MySQL 的数据库源

store.mode=db
store.lock.mode=db
store.session.mode=db
1
2
3

接着打开 script/config-center/nacos,运行 nacos-config.sh,将剩下的其他配置文件推到 Nacos。

如果在 Windows,需要打开 Git-Bash 运行。

nacos-config.sh -h 172.16.138.184 -p 8848 -t 08e8c083-a242-4407-94bb-16a096b41d5d -u nacos -w nacos
1
  • h 是 Nacos 的地址

  • p 是 Nacos 的端口

  • t 是 Nacos 的命名空间 ID

  • u 是 Nacos 用户名

  • w 是 Nacos 密码

# 启动

双击 bin/seata-server.bat(Windows)或者 bin/seata-server.sh(Linux)文件启动。

# 客户端配置(RM)

添加依赖

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  <!-- 自带的这个 jar 版本可能和服务器的 Seata 不匹配,排除掉了自行导入和服务器版本匹配的依赖 -->
  <exclusions>
    <exclusion>
      <groupId>io.seata</groupId>
      <artifactId>seata-spring-boot-starter</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>io.seata</groupId>
  <artifactId>seata-spring-boot-starter</artifactId>
  <version>1.6.1</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

保持 seata-spring-boot-starter 版本和自己的 seata-server.jar 版本一致

application.yml 配置

seata:
  enabled: true
  config:
    type: nacos
    nacos:
      server-addr: 172.16.138.184:8848
      data-id: seataServer.properties
      group: SEATA_GROUP
      namespace: 08e8c083-a242-4407-94bb-16a096b41d5d
      username: nacos
      password: nacos
  registry:
    type: nacos
    nacos:
      server-addr: 172.16.138.184:8848
      group: SEATA_GROUP
      namespace: 08e8c083-a242-4407-94bb-16a096b41d5d
      username: nacos
      password: nacos
      application: seata-server
      cluster: default
  tx-service-group: default_tx_group # 事务分组配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

注意的是:

seata.tx-service-group 的值是 default_tx_group,对应着 Nacos 的 seataServer.properties 里的

service.vgroupMapping.default_tx_group=default
1

这个规范是 seata.service.vgroup-mapping.事务分组名=集群名称,因为我们有很多客户端,所以我们要配置一个事务分组,即在 application.yml 里的 default_tx_group 就对应 Nacos seataServer.properties 的 default_tx_group。

而 default 就是集群名称,也就是 Nacos 的集群名称,默认是 default。

如果修改了 Nacos 的集群名称,则 default 要进行修改。

当然也可以在 application.yml 覆盖:

seata:
  service:
    vgroup-mapping:
      default_tx_group: default # 指定事务分组至集群映射关系(等号右侧的集群名需要与 Seata-server 注册到 Nacos 的 cluster 保持一致)
1
2
3
4

# 使用

AT 模式

在需要开启事务的方法上加 @GlobalTransactional ji'k

更新时间: 2024/01/17, 05:48:13
最近更新
01
JVM调优
12-10
02
jenkins
12-10
03
Arthas
12-10
更多文章>