springcloud alibaba
1、springcloud
spring团队开源微服务工具集帮助我们快速构建分布式系统(微服务系统)
提供spring组织netflix开源解决方案
2、springcloud alibaba
alibaba团队开源微服务工具集帮助我们快速构建分布式系统(微服务系统)提供alibaba解决方案
3、springcloud alibaba
最新版本: 2021.0.1.0
官方定义:spring Cloud Allibaba provides a one-stop solut ion(解决方案) for distributed application development (分布式应用开发)
spring cloud 阿里巴巴为分布式应用开发了提供一站 式解决方案
包含开发分布式应用的所有组件
4、 springcloud alibaba 特性 特点 提供了哪些组件
a. Flow control and service degradation:服务流量控制和 服务降级(熔断)====> Sentinel 替换 springcloud 原有 Systrix 组件
b. Service registration and discovery:服务注册和发现组件 ====> Nacos 替换 springcloudconsul 和 eureka 组件
c. Distributed configuration:统一配置中心组件 ====> Nacos 替换 springcloud config 组件
d. Event-driven:事件驱动利用 MQ RocketMQ ====> 事件驱动 替换Bus 组件实现消息总线
e. Message Bus:消息总线(异步处理)
f. Distributed Transaction:分布式事务 ====> Seata
g. Dubbo RPC:集成 Dubbo 实现服务间通信 ====> Dubbo RPC ==>替换原始项目中 RestTemplate Openfeign
5、微服务项目实战开发 Springcloud NetFlix + SpringCloud Spring + Springcloud Alibaba
1. 服务注册中心 ===> Nacos
2. 服务间通信负载均衡 ===> HttpRest a. ResrTemplate+Ribbon b. openfeign
3. 服务流控和服务降级 ===> Sentinel
4. 服务网关组件 ===> Gatway
5. 统一配置中心 ===> Nacos
nacos 持久化配置
1、nacos 持久化
持久化:管理的配置信息持久化
注意:默认 nacos 存在配置信息持久化,默认的持久化方式为内嵌数据库derby
缺点:无法友好的展示数据
官方建议:在生产情况下推荐将配置存入mysql数据库 注意:nacos到目前为止仅仅支持mysql
2、将nacos持久化到mysql中
a. 安装 mysql数据库服务 版本在 5.7 以后
b. 如果 nacos 持久化到 mysql 数据库
1.创建一个数据库 nacos 编码为 utf-8
2.在 nacos 库中执行 nacos-mysql.sql
3.修改 nacos 配置文件持久化到mysql 中 编辑 application.properties
springcloud alibaba 环境搭建
1、创建全局父项目
维护 springcloud 依赖 Hoxton.SR6
维护 alibaba 依赖 2.2.1.RELEASE
继承 springboot 父项目 2.2.5.RELEASE
2、父项目中的依赖维护
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhang</groupId>
<artifactId>SpringCloudAlibaba_Parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 继承 springboot父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
</parent>
<!-- 定义版本号 -->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.cloud.version>2021.0.3</spring.cloud.version>
<spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 维护 springcloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 维护 springcloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Nacos 组件
1、Nacos 组件 Name Service(服务注册中心) Configuration Service(配置宗鑫)
Nacos = Name + Configuration + Service
作用:服务注册中心(关注)统一配置中心
2、 使用 Nacos 组件 ====> Nacos 软件 服务注册中心
a. 访问 Nacos 官方网站:home
b. github 仓库地址:https://github.com/alibaba/nacos
c.下载地址:Releases · alibaba/nacos · GitHub
找到 Nacos 下的 bin 目录:cd /Users/zhang/devTools/nacos/bin 进入
Nacos 单机启动命令:sh startup.sh -m standalone
Nacos 停止命令sh shutdown.sh
Nacos Client 微服务
1、创建独立 springboot 应用
2、引入 nacos client依赖
3、编写配置文件
nacos server 服务注册中心细节
1、安装并启动 nacos server
默认监听 web 端口:8848
访问 web 界面:localhost/nacos 用户名密码:nacos
2、开发微服务进行服务注册
a. 创建独立 springboot 应用
b. 引入依赖 springcloud-starter-alibaba-nacos-discovery
c. 编写配置
# nacos server 总地址
spring.cloud.nacos.server-addr=localhost:8848
# 注册 nacos 地址
服务间通信
1、服务间通信
两种方式:1.Http RestTemplate 推荐 2.RPC
2、使用 Rest 方式实现服务间通信
1.RestTemplate
2. RestTemplate + Ribbon
3. OpenFeign 方式调用
nacos统一配置中心使用
1、启动 nacos server
nacos 作为统一配置中心:
1.他管理配置文件的方式是在自己所在服务器上形成一个版本库,因此不需要再创建远程版本库
2.开发微服务作为统一配置中心客户端将配置交给 nacos 进行管理
2、开发微服务作为统一配置中心客户端将配置交给 nacos 进行管理
a. 开发config client 微服务 独立 springboot 应用
b. 将自身的配置交给 nacos 进行管理
c. 自身项目中引入 nacos client 依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
d. 配置配置文件
# 告诉 config server 地址 spring.cloud.nacos.config.server-addr=localhost:8848 # 告诉从那个组进行配置获取 spring.cloud.nacos.config.group=DEFAULT_GROUP # 从这个组中拉取哪个配置文件 spring.cloud.nacos.config.name=configclinet-prod # 拉取这个配置的哪个后缀的配置文件 spring.cloud.nacos.config.file-extension=yml
e. 直接启动项目出现报错,发现当前项目在启动时,并不会等待拉取配置完成之后再启动,因此直接报错,解决方案:让当前项目在启动时预先拉取配置,在已拉取的配置信息启动
application.yml 改为 bootstrap.yml
nacos 配置中心细节
1、统一配置中心 nacos
dataId细节:代表完整配置文件名称 ===> spring.cloud.nacos.config.name
完整配置文件名称 = prefix(前缀)+(env)环境 + file-extension(后缀)
dataId = spring.cloud.nacos.config.name + spring.cloud.nacos.config.file-extension
dataId = ${prefix} + ${spring.profile+active} + ${file-extension}
2、微服务拉取配置
# 告诉 config server 地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # 告诉从那个命名空间进行配置获取 spring.cloud.nacos.config.namespace=b1850f34-8a2b-4e95-a6d6-ff8da5da895a # 告诉从那个组进行配置获取 spring.cloud.nacos.config.group=CONFIGCLIENT
第一种获取配置文件的方式 dataId = name + file-extension # 从这个组中拉取哪个配置文件 spring.cloud.nacos.config.name=configclient-prod # 拉取这个配置的哪个后缀的配置文件 spring.cloud.nacos.config.file-extension=yaml
# 第二种获取配置文件的方式 dataId = prefix + env + file-extension spring.cloud.nacos.config.prefix=configclient spring.profiles.active=prod spring.cloud.nacos.config.file-extension=yaml
3、统一配置中心 nacos 三个重要概念
命名空间:namespace 默认 nacos 安装完成之后会有一个默认命名空间 这个命名空间名字为 public 作用:站在项目中角度隔离每一个项目配置文件
组:group 默认 nacos 中在管理配置文件时不显示执行 group 名称之默认的组名称为 DEFAULT_GROUP 作用:站在项目中每个服务角度,隔离同一个项目中不同服务的配置
文件名:dataId 获取一个配置文件唯一标识
nacos 集群
1、集群规划
nacos01 127.0.0.1:8845
nacos02 127.0.0.1:8846
nacos03 127.0.0.1:8847
mysql 127.0.0.1:3306
nginx 127.0.0.1:8999
2、搭建 nacos 集群注意事项
a. 数据持久化必须配置 mysql 持久化
b. 要求一个机器启动时当前内存不能少于 3G
3、搭建 nacos 集群
1. 准备三个 nacos 节点,并连接 mysql 数据库
2. 重新初始化 mysql 数据
3. 修改 nacos conf 目录中 cluster.conf 文件添加所有集群节点
4. 修改 nacos 各自端口号
nacos/conf/applicatino.properties 8841 8843 8845
注意:nacos2.0 之后端口号连续的话有可能会报错
nacos 高可用
1、配置 nginx.conf 配置文件
2、启动测试
Sentinel 哨兵
1、Sentinel 哨兵
作用:alibaba 开源用来对现有微服务系统进行保护 ====> 替换 Hystrix
Hystrix 豪猪 用来保护微服务系统主要用来解决服务雪崩====> 服务熔断
Sentinel 组件 用来解决服务雪崩 ===> 服务熔断机制(服务降级)、服务流控 等....
Sentinel 规则网址:Home · alibaba/Sentinel Wiki · GitHub
Sentinel 官方网址:home
2、Sentinel 简介 Sentinel 历史
- 2012年,Sentinel诞生于阿里巴巴,主打流量控制。
- 2013-2017 年,Sentinel 快速成长,成为阿里巴巴所有微服务的基础组件。它被用于6000多个应用程序,几乎涵盖了所有核心电子商务场景。
- 2018 年,Sentinel 演变为一个开源项目。
- 2020 年,Sentinel Go发布,带来云原生生态的进化。
- 2021 年,Sentinel Rust发布。
- 2022 年,Sentinel 演变为“流量治理”的云原生组件
3、Sentinel 概念
资源 Resource:java 中一切皆资源,服务/demo 资源:是一个微服务访问路径 rest 接口
规则 Rule: 流量规则 熔断 负载规则....
4、Sentinel 使用
Sentinel 开源组件
Sentinel(项目中实现 流量控制 熔断 降级) ------> Hystrix
Sentinel dashboard(哨兵仪表盘组件) ------------>Hystrix DashBoard
5、Sentinel 实现原理
Sentinel DashBoard 使用
1、下载:Tags · alibaba/Sentinel · GitHub
2、运行:sentinel-dashboard-1.8.1.jar
3、直接启动 springboot 应用 jar 包
java -jar sentinel-dashboard-1.8.1.jar
注意:默认端口是 8080
进入 jar 包目录:cd /Users/zhang/devTools
指定端口启动:java -jar -Dserver.port=9191 sentinel-dashboard-1.8.1.jar
4、访问 dashboard管理界面
http://127.0.0.1:9191
用户名密码:sentinel
Sentinel 组件保护微服务
1、开发微服务 独立 springboot 应用
2、添加 rest 接口 作为 sentinel 资源
3、在微服务中引入 sentinel 组件
<!-- 引入 sentinel 依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
4、配置项目中配置文件链接到 sentinel dashboard
5、直接启动微服务
6、查看启动微服务
注意:dashboard信息必须在指定服务进行资源调用之后才能进行初始化配置
关于系统吞吐量相关观念
1、QPS
Query-Per-Second:QPS 称之为系统每秒的请求数
5/s
2、RT
Response Time:RT 每个请求响应时间 单位毫秒级
Sentinel 中对系统的保护规则
1、五大规则
a. 流控规则:流量控制(flow control)
定义:其原理就是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
b. 降级规则:熔断降级(Degrade Service)
定义:其原理是监控应用中资源调用请求,达到指定阈值时自动触达熔断降级
c. 热点规则
热点:何为热点?热点即经常访问的数据。
定义:其原理很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。
d. 系统规则(Systemflow)
定义:其原理 Sentinel 系统自适应限流从整体维度对应用入口流量进行控制
e. 授权规则 黑白名单控制规则
定义: 很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有来源位于白名单时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
Sentinel 流控规则
1、流控 流量控制 FlowContorll
定义:其原理是监控应用流量的 QPS 或 并发线程指数 指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
QPS:每秒请求书 当每秒的请求书超过指定阈值之后对当前请求进行限流
并发线程数: 当服务其中创建的线程数超过指定的阈值之后对当前请求进行限流
2、高级选项
a.流控模式
1.直接:当配置资源在运行过程超过当前规则配置的阈值之后对该资源做的处理是什么
2.关联模式:当配置资源在运行过程中超过当前规则配置的阈值之后对他所关联资源进行请求做什么样的处理
3.链路模式(问题):当配置资源在运行过程超过当前规则配置的阈值之后对他链路中资源做什么的处理
b.流控效果
1.快速失败:直接拒绝请求,并抛出相应异常
2.Warm Up:(冷启动 预热)缓慢增长
3.排队等待:(始终匀速通过)
Sentinel 中降级规则
1、熔断降级
熔断:用来避免微服务架构中雪崩现象
原理:当监控到调用链路中某一个服务,出现异常(20 个以上异常)自动触发熔断,在触发之后对于该服务调用不可用
熔断:达到某个阈值之后自动触发熔断
2、Sentinel 提供熔断
a.RT 根据请求响应时间熔断
b.异常比例 根据请求调用过程中出现异常百分比进行熔断
c.异常数 根据请求调用过程中异常数进行熔断
3、熔断条件
热点参数限流
1、热点
定义:经常访问数据称之为热点
热点限流 也称之为热点参数限流,日后访问资源中携带了指定参数进行限流
2、如何使用
注意:使用热点参数限流时,不能使用资源路径,必须使用资源别名
a. 必须使用 sentinel 提供资源别名注解@SentinelResource(value="别名")
// blockHandler:使用 sentinel 进行不同规则控制时的默认处理方案 fallback:自定义业务出错时默认处理方案 defaultFallback:指定一个业务时默认方案 @SentinelResource(value = "aaa", blockHandler = "blockHandler", fallback = "fall", defaultFallback = "defaultFall") // 作用:代表这是一个 sentinel 资源