基于分布式微服务架构
SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶
分布式已成大势所趋!
SpringCloud H + Springboot2.2.X
不允许有任何一项不同步!
Nacos 重中之重!
天上飞的组件必定有落地的实现!
约定>配置>编码
锁定版本
dependencyManagement 爷爷模块, 只是声明依赖 不引入jar包
dependencies 父模块
dependency 子模块 jar包
如果子类有就用子类配置,没有的话使用父类
如果IDEA出现springboot包不提示等情况,
先试试
file>invadate cache > invadate and reset
2.build> rebuild project
第二种方法:
选择全路径,上传!
量变引起质变!
服务注册中心一般是多个,以免单点故障。
Eureka 服务注册中心
分布式微服务架构
服务治理:管理服务于服务之间依赖关系,可以实现服务调用,负载均衡,容错,注册!
注册中心不止一个,万一一个宕机还有其他可用,高可用特性
微服务的提供者:很多集群分布式架构
Eureka Server 提供服务注册服务
Eureka Client 通过注册中心进行访问,在一个心跳周期内(30天) 需要向server 发送心跳,如果3个周期内没有接收到clent发送的心跳,server就会在注册表中把这个服务器节点移除
200成功
400业务错误
999 timeout 超时
777网络exception
701网卡报错
702 网线报错
703 机房着火
集群高可用
ribbon 负载均衡 轮询模式
eureka 自我保护机制:
某一时刻一个微服务不可用了,eureka 不会立刻讲其注册表删除掉,依旧会对其信息保存。
属于CAP里面的AP分支
停更不停用!
Zookeeper
zookeeper是一个分布式协调工具,也可以实现注册中心功能与eureka 类似
主启动类
@enableDiscoveryClient 注解使用consul 和zookeeper 作为注册中心时注册服务
zookeeper 服务节点临时!没有像eureka 那样的自我保护机制,当停下时直接删除
在RestTempelet上加bean 和 loadbalanced
loadbalanced 是负载均衡
Consul
是分布式发现和配置管理系统
中国境内不允许使用
consul 和 zookeeper 当你宕机后直接删除,没有自我保护机制
C 一致性
A可用性
P分区兼容性
组件名语言CAP一致性算法服务健康检查对外暴露接口Spring Cloud集成
EurekaJavaAP无可配支持HTTP已集成
ConsulGoCPRaft支持HTTP/DNS已集成
ZookeeperJavaCPPaxos支持客户端已集成
Ribbon服务调用
客户端负载均衡的工具
主要功能:提供客户端软件负载均衡算法和服务调用
ribbon 能做什么?
负载均衡!
集中式负载均衡,进程内负载均衡
LB负载均衡(Load Balance)是什么?
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
常见的负载均衡有软件Nginx,LVS,硬件F5等。
Ribbdn本地负载均衡客户端VS Nginx服务端负载均衡区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到VM本地,从而在本地实现RPC远程服务调用技术。
nginx属于服务器负载均衡, 集中式
ribbon 属于客户端负载均衡 近程内
从客户端获取服务注册列表,缓存到本地,本地实现轮询策略。即在客户端实现负载均衡
eureka 集群
netfilx 天生自带ribbon 的坐标和jar包
Ribbon 用的 负载均衡和Resteplete
Restempelte下的getforobject和getforenetity到底有什么区别:
Irule
目前负载均衡只用到了轮询模式,假如面试问还有没有试用过其他模式:
Irule 属于ribbon loadbalence 包下
负载均衡如何替换轮询?
首先不能放在启动类所在的com包
主启动类加下面注解 表示我们需要使用该规则进行负载均衡
name是eureka 是服务支持者
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class)
负载均衡算法
//总服务器2台
1%2=1>index=1list.get(index)
2%2=0>index=0list.get(index)
例如:
List<Servicelnstance>instances=discoveryClient.getlnstances("CLOUD-PAYMENT-SERVICE");
instances就是获得到的服务器地址
自定义一个轮询算法
自旋锁+juc
定义借口 接收目前一共有多少台能提供服务的服务器
实现接口
controller 调用
测试,可用 与轮询一致
openFeign
feign 已经停止更新,使用OpenFeign
feign是什么?
Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可
feign能干什么
Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用
方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会
针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,
由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下我们只需创建一个接口并使用注解的方式来
配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成
对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon
利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与
Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
feign 可以与eureka 和 ribbon 组合使用 以支持负载均衡
openfeign与feign区别
使用feign做到负载均衡:轮询
这里getmapping是8001,8002 服务支持者的端口,调用查询信息
主启动类上加@EnableFeignClients
controller 普通的请求
openfeign超时控制
feign的默认读取数据时间为1秒,如果超过了一秒 那么客户端直接报错
ribbon:
#指的是建立所需要的时间,网络正常,两端连接需要的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读到数据的时间
ConnectTimeout: 5000
设置feign 客户端超时时间 openfeign 默认支持 ribbon
则 可以完美等待后访问.
openfeign的日志级别
新建config 包 以及日志config
配置文件yaml
完成
Hystrix断路器
随着我们微服务调用的服务器越来越多,如果说一个出问题了,余下的调用会占据越来越多的资源,那么造成全体雪崩
服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的扇出如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.
hystrix是什么
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失
败,比如超时、异常等,
Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹
性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向
调用方返回一个符合预期的、可处理的备选响应(FallBacky,而不是长时间的等待或者抛出调用方无法处理的异
常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,
乃至雪崩。
hystrix 三特点
服务降级fallback
服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback
程序运行异常
超时
服务熔断触发服务降级
线程池/信号量打满也会导致服务降级
服务熔断break
类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
服务的降级->进而熔断->恢复调用链路
相当于保险丝
服务限流 flowlimit
秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
保证了服务调用方的线程不会被长时间不必要的占用
Jmeter
以后测试压力使用
everthing 搜索 或者在D properties 下 启动 bat
点击后等自动启动 即可测试
切换中文
1.添加线程组
添加保存 使用crtl+s
剩下使用http测试
Hystrix服务降级
需要用到@HystrixCommand
这个注解
@HystrixCommand(fallbackMethod="paymenHystrixTimeoutBreak",commandProperties={
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
})
// fallbackMethod 这个指定的是当此方法出现异常了,我会去执行另一个方法的方法名
//HystrixProperty 捕捉异常 name 里面是异常的方法
//value 是当系统执行方法超过3秒 就会执行此注解
计算异常,和超时异常 都会执行此方法!
客户端服务降级
feign:
hystrix:
enabled: true#如果处理自身的容错就开启。开启方式与生产端不一样。
1 application配置
2 主启动类
3 请求路径
和服务端是基本一样
为每一个方法都配置fallbackmethod是不是很傻,那么我们需要一个全局的配置
这个方法需要加到类上
方法上需要加上@HystrixCommand(表示有兜底方法)
FeignFallback
实现服务端的接口,以免服务端宕机
即使宕机以后,
也可指定兜底方法
Hyrstrix服务熔断
熔断机制概述
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长
时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,恢复调用链路。
//服务熔断
@HystrixCommand(fallbackMethod="paymentCircuitBreaker_fallback",commandProperties={
@HystrixProperty(name="circuitBreaker.enabled",value="true"),//是否开启断路器
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="10"),//请求次数
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="10000"),//时间范围
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="60"),//失败率达到多少后跳闸
})
publicStringpaymentCircuitBreaker(@PathVariable("id")Integerid){
if(id<0){
thrownewRuntimeException("*****id 不能负数");
}
StringserialNumber=IdUtil.simpleUUID();
returnThread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
}
publicStringpaymentCircuitBreaker_fallback(@PathVariable("id")Integerid){
return"id 不能负数,请稍候再试,(┬_┬)/~~ id: "+id;
}
多次错误,然后慢慢正确,发现刚开始不满足条件,就算是正确的访问地址也不能进行访问,需要慢慢的恢复链路
当 熔断时短期内所有请求都无法使用
SpringCloud GateWay
概述
Spring Cloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
特性
基于spring 5 project reactor 和 springbbot 2.x
动态路由 predicate (断言) filter 过滤器
zuul 1.x
为一个请求绑定一个线程
gateway
底层使用 webflux + netty 异步 非阻塞的 支持
gateway 工作流程
通过配置 断言: 请求地址 可以使用8001 访问 也可以使用路由端口 9527 访问
动态路由
在网关9527 配置文件中加入
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
网关下配置 用服务名创建动态路由
uri: lb://cloud-payment-service
将地址改为 服务名
predicate断言
小知识(时区,时间)
public static void main(String[] args) {
ZonedDateTime zonedDateTime=ZonedDateTime.now();
System.out.println(zonedDateTime);
}
打印结果:
2020-07-29T14:21:36.853+08:00[Asia/Shanghai]
After
当我的时间没有到时,此方法为404 无法访问
如下:
Before
2020-07-29T14:21:36.853+08:00[Asia/Shanghai]
此时间之前可以访问,之后无法访问
Between
2020-07-29T14:21:36.853+08:00[Asia/Shanghai],2020-07-29T19:21:36.853+08:00[Asia/Shanghai]
此时间段之内可以访问,之前和之后都不行
Cookie
正常携带cookie 访问
未携带cookie 或者 cookie 错误
Header
↑
定义请求头
当定义请求头之后,就必须携带请求头来请求
Host
Host=**.atguigu.com
总结
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_routh2
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
#- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
#- Cookie=username,zhangshuai #并且Cookie是username=zhangshuai才能访问
#- Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式
#- Host=**.atguigu.com
#- Method=GET
#- Query=username, \d+ #要有参数名称并且是正整数才能路由
Filter
自定义过滤器:
路径参数为空或者为null
config服务配置
是什么?
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
怎么用?
怎么玩SpringCloud Config分为服务端和客户端两部分。
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信
息,加密/解密信息等访问接口
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取
和加载配置信息配置服 务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过
git客户端工具来方便的管理和访问配置内容
怎么做?
配置文件
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://github.com/fhqi511/springcloud-config.git #自己仓库的地址
search-paths:
- springcloud-config
label: master #默认读取哪个分支
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
主启动类
即可读取到
小总结
建议使用
application-dev.yml
application-test.yml
application-prod.yml
注意分隔符 -----
bootstrap.yaml
value 此处写读取的github 里面的配置文件
动态配置config
yaml改监控端点
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
controller 类上加此注解
@RefreshScope //动态 自动刷新 自动获取
不需要重启,只需要两步
运维人员改 github 配置文件
运维人员发送一个post 请求 curl -X POST "http://localhost:3355/actuator/refresh"
只避免了服务器重启。
大重点
使用命令行操作 可代替 postman
curl -X POST 是发送post请求
curl -X PUT是发送put请求
默认不加是get请求
服务总线bus
和config 一起使用最佳
rabbitmq
使用bus/refresh思想,通知总控,让总控来通知其他客户端
广播式通知,一处修改 处处生效
未成功,不分享方法
Stream
消息驱动
为什么引入cloud stream ?
MQ消息中间件
一句话:
屏蔽底层消息中间件的差异,降低切换版本,统一消息的编程模型
是什么
是一个构建消息驱动微服务的框架
了解与stream 中的binder 对象
目前只支持rabbitmq 和 fafka
通过绑定器binder 作为中间层,实现了应用程序与消息中间件细节之间的隔离
服务者
@EnableBinding(Source.class) //定义消息的推送
public class IMessageProviderImpl implements IMessageProvider
{
@Resource
private MessageChannel output;//消息的发送管道
@Override
public String send() {
String uuid = UUID.randomUUID().toString();
output.send(MessageBuilder.withPayload(uuid).build());
System.out.println("uuid***********=="+uuid);
return null;
}
}
source 服务者
controller 只需调用即可
消费者
通过sink 和 input 来接收
@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController
{
@Value("${server.port}")
private String serverPort;
@StreamListener(Sink.INPUT)
public void input(Message<String> message)
{
System.out.println("消费者2号,----->接受到的消息: "+message.getPayload()+"\t port: "+serverPort);
}
}
会存在问题:重复消费,一个消息两个人读到了
用到stream 是组 group
不同组可以全面消费,
但是相同组的只能有一个人消费
//微服务应用放置于同一个group中,就能够保证消息只会被其中一个应用消费一次
//不同的组是可以消费的,同一个组内会发生竞争关系,只有其中一个可以消费。
只需在配置文件中加入group 即可分为一组,分为一组则为轮询模式
如果说两个微服务宕机了,服务方还在发送消息,假如一个消费组把分组去掉了,就是不在这个分组里了,那么即使他再启动,也不会接收到消息了,但是另一台没有去掉分组,那么他启动之后还会继续接收到服务端发送的消息
Sleuth
分布式请求链路跟踪
java -jar 启动jar 包
访问地址 http://localhost:9411/zipkin/
trace:表示一条链路,存在唯一标识
span: 表示链路来源,通俗的讲就是每个span 都是一个请求信息
可以查看依赖关系
查询毫秒级别的请求
SpringCloud Alibaba Nacos
Nacos
服务注册与配置中心
nacos官网:https://nacos.io/zh-cn/
为什么叫nacos:
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
安装nacos
从官网下载nacos 目前使用1.1.4
https://github.com/alibaba/nacos/releases/tag/1.1.4
下载之后 使用命令行打开startup.cmd
成功启动:
登陆界面:
虚拟映射:
如果想copy 一份一模一样的代码可以使用copy 功能
//只修改了端口号
//-DServer.port=
Nacos 支持 ap + cp 的切换
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
cap指:C 强一致性,A 高可用性, P 分区容错性
以下代码即可切换cp 模式,我们默认使用ap 模式,高可用
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
Config
公式:为什么要叫这个名字
//prefix默认为spring.application.name的值
//spring.profile.active即为当前环境对应的profile,可以通过配置项spring.profile.active来配置。
//file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置
group 分组教程
不同的组 读不同的内容,也可以使用命名空间
命名空间
Nacos 集群
Nacos默认自带的是嵌入式数据库derby
多个nacos集群,都使用一个高可用的mysql
nacos 采用了集中式存储的方式来支持集群化部署,目前只支持mysql的存储
持久化
D:\properties\nacos-server-1.1.4\nacos\conf
找到此目录下
nacos-mysql.sql 可以在mysql 里面执行
在application.properties里面 最下面加入:
##################################################
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
即可指明地址 从derby 切换到 mysql
Linux
把文件上传到linux opt 目录下
tar -zxvf 压缩包名字
进行解压
cp -r 是递归拷贝
把nacos/conf/nacos-mysql.sql文件 加入到linux 下的mysql里面
修改application.propertis
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://1.7.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=admin
修改cluster.conf 修改之前先拷贝一份
hostname -i 先看一下本机地址
3333 4444 5555 是端口,前面是本机地址
/mynacos/nacos/bin目录下有startup.sh
#集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例。
#命令:./startup.sh-p3333表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致。
修改 vim startup.sh
修改nginx 的配置
都启动后:修改yaml文件
server-addr: 写你自己的虚拟机ip: 端口
即可注册进nacos 服务
SpringCloud Alibaba Sentinel
分布式系统的流量防卫兵
启动sentinel 需要 nacos 一起配合运行
java -jar 启动 sentinel
sentinel 启用的是懒加载,当你程序执行时才会显示,要不然不会显示在控制台
流控规则
流量控制
QPS每秒请求数
表示1秒钟内查询1次就是OK,若超过次数1,就直接-快速失败,报默认错误
超过一秒一次就会报错
调用的 是默认的报错信息,怎么才能让他调用我自己定义的报错信息呢?
类似fallback 的改善 兜底方法
流控效果
线程数:
关联
当A惹事了,相当于压力大了,那么B就不会再让服务进来了
比如支付接口挂了,那么下订单的接口就要关闭
postman 测试,一个程序员不要纠结于工具的问题,只要工具够用即可
表示20个线程,每0.3秒就发送一次请求
发现当一直访问b时,a 会异常,报错
关联效应
预热
coldfactor 冷加载因子 默认为3
下图为例:
阈值是10 但是默认阈值为3 就用设置的阈值10 / 3 ≈3
预热时长 为 5 秒 就是说 如果突然访问暴增,即使设置一秒十次访问,在冷加载因子(coldfactor)阈值下也只能3秒一次,但是会在5秒之后 慢慢恢复正常一秒10次
如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阀值增长到设置的阀值。 例如小米 京东秒杀活动
排队等待
熔断降级
降级规则:
RT
平均响应时间:秒级
# RT(平均响应时间,秒级)
# 平均响应时间超出间值且在时间窗口内通过的请求》=5,两个条件同时满足后触发降级
# 窗口期过后关闭断路器
# RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)
异常比例 :秒级
# QPS>=5 且异常比例 超过阈值,触发降级,时间窗口结束,关闭降级
异常数 分钟级
# 异常数(分钟统计)超过阀值时,触发降级;时间窗口结束后,关闭降级
Sentinel 没有半开状态!!
官网要求一秒钟不能超过5个,RT响应时间0.2 秒 但是代码里面睡眠了1秒 百分百无法完成,即是:
10个打进来 超过5个 并且 响应时间超过了RT设置的0.2 秒 达到降级要求。 保险丝熔断
时间窗口是当熔断后,什么时候恢复, 秒级
异常比例
每秒请求量>5
异常数
时间窗口一定要大于60秒
一分钟内 错误次数超过了阈值
比如下图 一分钟之内错误了20次 自动熔断 65秒之后才可继续访问
热点Key限流
路径 第0个参数 这个第0个参数指的是在标注了SentinelResource 方法上的第一个参数,比如 下面带p1 每秒超过必错,
但是p2 怎么刷都不会错,因为 sentinel 没有配置对他的规则
http://localhost:8401/testHotKey?p1=1&p2=2
QPS 单机阈值 一秒一次 超过一秒一次就熔断 跳闸
方法如下:
默认方法:
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2){
return "testHotKey";
}
如果发生异常啦,那么调用blockHandler 里面的兜底方法:
public String deal_testHotKey(String p1, String p2, BlockException blockExcesp){
return "testHotKey ::>_<::";
//sentinel 系统默认提示 Blocked by Sentinel (flow limiting
}
特例情况
当我后面路径第一个参数跟的是5这个特定值的时候,那么阈值=10 每秒10次 不再受每秒一次的约束
前提: 必须是基本类型,或者是String 类型
而且 sentinel 只管 控制台限制的错误,会兜底,但是java 运行时异常 比如 int 10/0 这种异常 不属于sentinel 管辖
系统自适应限流
属于全局配置,不再是配置某某请求路径,而是配置端口
testA,testB,testC
所有接口都是只能一秒一次
SentinelResouce
按资源名称限流
正常资源名称限流
额外问题: 关闭8401 查看流控规则 消失了 临时的?
按url限流
和按资源名称一样的效果,唯一即可
当sentinelResource 没有写兜底方法 还是会返回
兜底方法面临的问题:
自定义限流
定义全局兜底类
测试成功
兜底方法为1 则触发1 兜底方法为2 触发2
红色对应类,蓝色对应方法
@sentinelResource 不支持private 方法
也可以使用代码进行定义流控规则
sentinel整合ribbon openfeign fallback
@SentinelResource(value = "fallback",
fallback = "handlerFallback", //fallback 负责对java 运行时异常进行处理
blockHandler = "blockHandler") //blockHandler只负责sentinel控制台配置违规
如果两者同时达到触发条件,那么 sentinel 定义的异常处理优先触发
比如java 异常 会显示 如果说 运行达到了sentinel的级别,那么不再显示java 异常 而是显示sentinel 兜底方法
exceptionsToIgnore = {IllegalArgumentException.class}
可手动排出异常,使sentinel 不再对此异常进行拦截
Sentinel 和 hystrix 框架比较
sentinel 持久化
引入pom文件:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
Spring cloud sentinel 下加:
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: cloudalibaba-sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
使用 spring application name 作为配置规则 配置到nacos 上
当服务停机后,配置的规则也会消失,当服务启动后 规则也随之出现
SpringCloud Alibaba Seata
一次业务操作必须要跨多个数据源或者需要跨多个系统进行远程调用,就会产生分布式事务的问题
全局数据一致性的保障
是什么
Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
能干嘛
1+3 的套件组成
1 就是 transaction id xid 也就是全局唯一的事务ID
3 TC 事务协调者 TM 事务管理器 RM资源管理器
怎么玩
本地@Transactional
全局@GlobalTransactional
Seate-Server 安装
修改注册文件 registy.conf
file.conf
使用:
只需在需要的类上加此注解即可
@GlobalTransactional(name = "order",rollbackFor = Exception.class)
前提:
微服务 分布式, 不同数据库 不同调用服务
做到:
跨数据库保持数据持久性, 一致性