SpringCloud2020-alibaba


基于分布式微服务架构

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)

前提:

微服务 分布式,  不同数据库 不同调用服务 

做到:

跨数据库保持数据持久性, 一致性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342