SpringCloud之Hystrix、Resilience4j、GateWay、Sentinel、Config、Bus、Stream

一、什么是Hystrix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返一个符合预期、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩
Hystrix之服务降级
服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好的提示,fallback
哪些情况会发出服务降级
1、程序运行异常
2、超时
3、服务熔断触发服务降级
4、线程池或者信号量打满导致服务降级

Hystrix 之服务熔断
类似保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
就是一个保险丝 服务的降级>进而熔断>恢复调用链路

Hystrix之服务限流
秒杀高并发等操作,严禁一窝蜂过来拥挤,大家排队,一秒钟N个,有序进行

   //=====服务熔断
    @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"),// 失败率达到多少后跳闸
    })
    public String paymentCircuitBreaker(@PathVariable("id") Integer id)
    {
        if(id < 0)
        {
            throw new RuntimeException("******id 不能负数");
        }
        String serialNumber = IdUtil.simpleUUID();

        return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
    }
    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id)
    {
        return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
    }

二、什么是GateWay

Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用Zuul网关,但是在2.x版本中,zuul的升级一直在跳票,SpringCloud最后自己研发了一个网关代替Zuul,SprinWebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty
Spring Cloud GateWay的目标是提供统一的路由方式基于Filter链的方式提供了网关基本的功能,例如安全、监控/指标,和限流。

在这里插入图片描述

Spring Cloud GateWay有以下特点
1、基于Spring5 、Project Reactor和Spring Boot2.0进行构建
2、动态路由:能够匹配任何请求属性
3、可以对路由指定Predicate(断言)和Filter(过滤器)
4、集成Hystrix的断路器功能
5、集成Spring Cloud服务发现功能
6、易于编写的Predicate和Filter
7、请求限流功能
8、支持路径重写、支持WebSocket
GataWay的三大核心概念
1、Route(路由)
路由是构建网关的基本模块,它是由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
2、Predicate(断言)
参考的是Java8,开发人员可以匹配HTTP请求中的内容(如请求头或者请求参数),如果请求与断言匹配则进行断路由
3、Filter(过滤)
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者路由之后对请求进行修改。

在这里插入图片描述


GateWay工作流程

在这里插入图片描述


客户端向Spring Cloud Gateway发出请求,然后在Gateway Handler Mapping中找到与请求i相匹配的路由,将其发送到GateWay Web Handler
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前pre或者post执行业务逻辑

自定义过滤器
自定义全局GlobalFilter实现GlobalFilter,Ordered接口实现全局日志记录,统一网关鉴权

public class MyLogGateWayFilter implements GlobalFilter,Ordered
{

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        log.info("***********come in MyLogGateWayFilter:  "+new Date());

        String uname = exchange.getRequest().getQueryParams().getFirst("uname");

        if(uname == null)
        {
            log.info("*******用户名为null,非法用户,o(╥﹏╥)o");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder()
    {
        return 0;
    }

三、什么是Config

Spring Cloud Config 为微服务框架中的微服务提供集中化的外部配置支持,配置服务器为各个不同服务应用的所有环境提供了一个中心化外部配置
SpringCloud Config分为服务端和客户端两部分,服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问将诶口
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容

四、什么是Bus

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都能连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以它被称为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息
Bus支持两种消息代理RabbitMQ和Kafka,SpringCloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。
基本原理
ConfigClient 实例都监听MQ中的同一个topic(默认是SpringCloudBus).当一个服务刷新数据的时候,它会把这个信息放入Topic中,这样其他的监听同一个Topic的服务就能得到通知,然后更新自己的配置

五、什么是Stream

官方定义SpringCloud Stream是一个构建消息驱动微服务框架,应用程序通过inputs或者outputs来与SpringCloud Stream中binder对象交互
通过我们配置来binding(绑定),而SpringCloud Stream的binder对象负责与消息中间件交互
所以我们只需要搞清除如何与SpringCloud Stream交互就可以方便使用消息驱动的方式
通过使用Spring
屏蔽掉地层消息中间件的差异,降低切换成本,统一消息的编程模式

在这里插入图片描述


Binder:很方便的连接中间件,屏蔽差异
Channel :通道是队列Queue的一种抽象,在消息通讯系统中就是实现存储和转发的媒介
source和Sink:简单的可以理解为参照对象是SpringCloud Stream自身,从Stream发布消息就是输出,接受消息就是输入

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340