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;
}
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;
}
Spring Cloud Config 为微服务框架中的微服务提供集中化的外部配置支持,配置服务器为各个不同服务应用的所有环境提供了一个中心化外部配置
SpringCloud Config分为服务端和客户端两部分,服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问将诶口
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都能连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以它被称为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息
Bus支持两种消息代理RabbitMQ和Kafka,SpringCloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。
基本原理
ConfigClient 实例都监听MQ中的同一个topic(默认是SpringCloudBus).当一个服务刷新数据的时候,它会把这个信息放入Topic中,这样其他的监听同一个Topic的服务就能得到通知,然后更新自己的配置
官方定义SpringCloud Stream是一个构建消息驱动微服务框架,应用程序通过inputs或者outputs来与SpringCloud Stream中binder对象交互
通过我们配置来binding(绑定),而SpringCloud Stream的binder对象负责与消息中间件交互
所以我们只需要搞清除如何与SpringCloud Stream交互就可以方便使用消息驱动的方式
通过使用Spring
屏蔽掉地层消息中间件的差异,降低切换成本,统一消息的编程模式
Binder:很方便的连接中间件,屏蔽差异
Channel :通道是队列Queue的一种抽象,在消息通讯系统中就是实现存储和转发的媒介
source和Sink:简单的可以理解为参照对象是SpringCloud Stream自身,从Stream发布消息就是输出,接受消息就是输入