尚硅谷springcloud2020day9(p58-73)

今天是2020-12-11。
一。服务熔断
在默认情况下,当一个服务在十秒内调用了20次并且失败率高于50%时,熔断器开启,再次尝试请求该服务将不会去调用它而是直接调用降级方法。熔断器开启后就启动休眠时间窗–默认五秒,五秒到期后尝试放过一个请求去调用服务查看是否能正常调用,如果能就关闭熔断器,如果不能就继续保持开启,休眠时间窗重新计时,再次到期后继续尝试
重要参数:
1.快照时间窗:默认是最近的 十秒,十秒内熔断器统计的情况达到开启条件,熔断器就进入开启状态
2.请求总数阈值:默认是20次,时间窗内有20次请求才能开启熔断,如果请求次数不足,即使请求都失败熔断器也不会打开
3.错误比例阈值:默认50%,如果时间窗内的请求数达到或者超过阈值,而且其中的错误比例高于错误阈值,就开启熔断器
二。服务限流
后续spring cloud alibaba 的sentinel再了解
三。hystrixdashboard
搭建步骤:
1.pom中引入spring-cloud-starter-netflix-hystrix-dashboard
2.application.yml中指定端口号
3.主启动类添加@EnableHystrixDashboard
4.访问localhost:port/hystrix
使用步骤:
1.需要监控的服务的主启动类添加:
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet=new HystrixMetricsStreamServlet();
ServletRegistrationBean servletRegistrationBean=new ServletRegistrationBean(streamServlet);
servletRegistrationBean.setLoadOnStartup(1);
servletRegistrationBean.addUrlMappings("/hystrix.stream");
servletRegistrationBean.setName(" HystrixMetricsStreamServlet");
return servletRegistrationBean;
}
2.启动需要监控的服务,比如说8001服务,然后在监控地址填写:http://localhost:8001/hystrix.stream
3.delay就填默认的2000,标题随意取,然后点击按钮开始监控
4.访问被监控的服务的被监控方法,就可以看到该方法的监控信息。
四。gateway。
简单来说就是zuul1.x的升级版,由spring官方自己开发,基于异步非阻塞模型,有如下特性:
1.基于spring5,springboot2,reactor项目
2.可对路由指定断言predicate和过滤器filter
3.集成了hystrix
4.请求限流
5.反向代理
三大概念:
1.路由,构建网关的基本模块,包含id、URI、一系列的过滤器,如果断言为true则匹配该路由
2.断言,开发人员可以匹配http请求中的所有内容(比如请求头或者请求参数),如果请求与断言匹配则进行路由,可以理解为断言就是一些匹配条件。
3.过滤器,指gatewayfilter的实例,使用过滤器可以在请求被路由前或后对请求进行修改
对于gateway来说,一个web请求到达gateway以后,根据一系列的断言匹配路由,并定位转发到真正的服务,在转发前后,用过滤器做精细化的控制,这就是一个简单的请求流程了,具体的说就是:
客户端发送请求到gateway,然后去gateway handler mapping中找到与请求匹配的路由,将路由发送到gateway handler去转发,handler在指定的过滤器链上转发该路由,将请求发送到路由对应的服务执行业务逻辑并返回,过滤器在请求转发前和返回后都可能执行。
ps:在转发前的“pre”类型的过滤器可有参数校验、权限校验、流量监控、日志输出、协议转换功能。
在返回后的"post"过滤器可有修改响应内容、响应头、日志输出、流量监控功能。
所以核心逻辑就是路由转发+执行过滤器链
五。gateway使用
1.pom:spring-cloud-starter-gateway
2.application.yml:
server:
port: 9527

spring:
application:
name: cloud-gateway
eureka:
instance:
hostname: cloud-gateway-service
client:
register-with-eureka: true
defaultZone: http://localhost:7001/eureka
3.主启动类添加@EurekaClient
4.application.yml添加对具体服务的路由规则:
cloud:
gateway:
routes:
#路由的id,要求唯一
- id: payment_routh
#匹配后提供服务的路由地址
uri: http://localhost:8001
#断言,路径相匹配的进行路由
predicates:
- Path=/payment/get/**
5.填坑,pom移出spring-boot-starter-web
6.启动各模块,访问localhost:9527/payment/get/5,成功
7.配置多个路由规则时,从上到下匹配,如果有范围交叉的可以用order来配置优先级
添加网关后,就要访问网关来间接访问服务
六。动态路由:默认情况下gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,配置:
1.application.yml改动:
spring:
application:
name: cloud-gateway
cloud:
gateway:
#开启动态路由
discovery:
locator:
enabled: true
routes:
#路由的id,要求唯一
- id: payment_routh
#匹配后提供服务的路由地址
uri: lb://cloud-payment-service
#断言,路径相匹配的进行路由
predicates:
- Path=/payment/get/**
ps:注意uri的写法,uri的协议是lb–表示启用gateway的负载均衡功能,lb://servicename是gateway帮我们自动创建的uri
如果我们访问localhost:9527/payment/get/5,那么匹配/payment/get/,则负载均衡选择cloud-payment-service服务下的一个实例地址并转发,比如转发到localhost:8001/payment/get/5
七。predicates
prediactes与routes一样,都可以配置多个,有如下几种
1.After断言
接受一个日期参数,判断请求日期是否在该日期参数之后,如果是的允许路由转发
例:-After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai],注意:时区必须是Asia/Shanghai
2.between断言
接受两个日期参数,判断请求日期是否在两参数的范围之间,如果是的允许路由转发
3.before断言
接受一个日期参数,判断请求日期是否在该日期参数之前,如果是的允许路由转发
4.cookie断言
接受两个参数,第一个是cookie name,第二个是正则表达式。该断言会获取对应cookie name的值去和正则表达式匹配,如果满足就可以路由
例:- cookie=username,cfy ,这就要求我们的请求中要含有名为username、值为cfy的cookie
5.header断言
接受两个参数,第一个是属性名,第二个是正则表达式。该断言会获取请求头中对应属性名的值去和正则表达式匹配,如果满足就可以路由
例: - Header=X-Request-Id, \d+ ,如果请求中带有请求头名为 x-request-id,其值与 \d+ 正则表达式匹配(值为一个或多个数字),则此路由匹配。
6.host断言
接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。
例:-Host=
.cfy.com ,判断请求头中host的值是否满足**.cfy.com
7.method断言
接受一个参数, 判断请求类型是否跟指定的类型匹配。
例:- method=GET,判断请求是不是get请求
8.path断言
接收一个参数,判断请求的URI部分是否满足路径规则。
例: - Path=/payment/get/**, 如果请求的uri满足就路由
9.query断言
接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。
例:-Query=username,\d+ ,要求请求中包含名为username的参数,且值要满足正则表达式
八。过滤器
生命周期:pre–转发前过滤器,post–返回后过滤器
种类:
1.gateway过滤器,默认的内置过滤器,比如其中的一种:
filters:
- AddRequestHeader=X-Request-Foo, Bar,AddRequestHeader过滤器工厂会在请求头加上一对请求头,名称为X-Request-Foo,值为Bar。
2. global过滤器,全局的自定义过滤器,一般用作全局日志记录以及统一网关鉴权:
需要implements GatewayFilter, Ordered,重写filter和getorder方法:
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
//exchange可以获取Response和Request,chain就是过滤器链对象,

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    log.info("hello ! this is myglobalfilter");
    String uname = exchange.getRequest().getQueryParams().getFirst("uname");
    if (uname==null){
        log.info("sorry ,you cant go in ");
        exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
        return exchange.getResponse().setComplete();
    }
    return chain.filter(exchange);
}

//加载该过滤器的优先级

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

}
需要注意自定义的过滤器类肯定是要添加@component注入到容器中的。
今天…只能说疲惫了,但是还是感觉没学好,继续加油

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值