我是靠谱客的博主 等待月亮,最近开发中收集的这篇文章主要介绍Spring Cloud Alibaba 第二篇(Sentinel、Sleuth、Gateway组件)一、Sentinel二、Sleuth 三、GateWay(网关),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、Sentinel

分布式系统的流量防卫兵

1.Sentinel是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

2.Sentinel具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

3.Sentinel作用?

①容错:服务消费者去调用服务提供者,当服务提供者发生异常时,服务消费者也会挂掉,容错机制就是保证,当服务提供者挂掉后,服务消费者仍然会返回兜底数据,让客户察觉不到服务挂掉了,提升用户的体验

②流量监控:可以监控到每一个窗口的实时的流量qps(每秒接口请求数量)

③熔断降级:

        现实中的熔断:当电流过大,保险丝熔断,保护电器

        微服务中:当流量过大,异常数量超过一定阀值,就会触发熔断,调用降级的策略,响应用户的数据

4.容错

在springcloud-alibaba父工程和springcloud-alibaba-provider子工程,以及springcloud-feign-consumer子工程的基础上做以下操作:(工程在Spring Cloud Alibaba第一篇就已经建好,这里就不再创建了)

1.在feign-consumer的配置文件中引入哨兵依赖

         <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

2.在配置文件开启哨兵容错(前提是先关闭feign的容错,因为这里要测试Sentinel的容错机制,又因为Feign的容错机制的优先级高于Sentinel的容错的优先级,所以要关闭Feign的容错,我先不关闭Feign的容错进行测试)

#开启哨兵容错
feign.sentinel.enabled=true

3.在FeignTestcontroller中使用哨兵配置容错策略

package com.qf.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.qf.entity.Student;
import com.qf.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FeignTestController {

    @Autowired
    private FeignService feignService;

    @RequestMapping("/test1")
    public String test1(){
        // 调用远程 provider 中的   @RequestMapping("/getMessage/{msg}")
        return feignService.getMessage("hello BeiJing");
    }

    @RequestMapping("/test2")
    public String test2(){
        // 远程调用  @RequestMapping("/say")
        //    public String say(@RequestParam("msg") String msg)

        return feignService.say("hello - java2109");
    }

    // 配置哨兵的容错  策略
    @SentinelResource(value = "test3",fallback = "fallBackTest3")
    @RequestMapping("/test3")
    public Student test3(){
        Student student = new Student(100,"xiaohua",13,"man",173.5f);

        return feignService.updateStudent(student);
    }

    /**
     * 容错的方法的返回值 一定要和处理器返回的方法值一样,否则前端会报错
     * 兜底数据
     * @return
     * */
    public Student fallBackTest3(){
        Student student = new Student();

        student.setName("----哨兵容错返回");

        return student;
    }


}

4.只启动 feign -consumer,不启动provider 进行测试(前提要先启动nacos)

 关闭feign的容错,在application.properties文件中修改

 在FeignService中将Feign的容错的配置关闭

 重新启动服务器,再次访问:http://localhost:8086/test3

 5.使用哨兵Sentinel控制台

Sentinel 控制台提供一个轻量级的控制台,它提供机器发现,单机资源实时监控,集群资源汇总,以及规则管理的功能。您只需要对应用进行简单的配置,就可以使用这些功能。

  • 流量监控
  • 熔断降级

5.1 安装配置

1.下载:sentinel-dashboard-1.8.0 (1).jar

2.在当前jar包所在的文件夹下启动cmd窗口输入以下命令,进行端口号为8089的启动

java -Dserver.port=8089 -Dcsp.sentinel.dashboard.server=localhost:8089 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

 3.访问:

http://localhost:8089/#/login   用户名:sentinel 密码:sentinel

5.2 流量监控

4.将应用接入到控制台 ,在feign-consuer中的application.properties文件中进行配置

#配置哨兵地址  将每一次请的信息 提交到 哨兵控制台
spring.cloud.sentinel.transport.dashboard=localhost:8089

5.重新启动feign-consuer,多访问几次接口,在哨兵控制台就可以看到监控的流量

 6 熔断降级

6.1 基于流量的熔断降级

1.配置熔断降级规则 ,在FeignTestController中进行配置,然后重启应用,然后访问:http://localhost:8086/test3      (由于我配置了nacos,所以在每次启动应用以前,我的nacos都是开启的状态,就没关闭过,方便测试)

package com.qf.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.qf.entity.Student;
import com.qf.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FeignTestController {

    @Autowired
    private FeignService feignService;

    @RequestMapping("/test1")
    public String test1(){
        // 调用远程 provider 中的   @RequestMapping("/getMessage/{msg}")
        return feignService.getMessage("hello BeiJing");
    }

    @RequestMapping("/test2")
    public String test2(){
        // 远程调用  @RequestMapping("/say")
        //    public String say(@RequestParam("msg") String msg)

        return feignService.say("hello - java2109");
    }

    /**
     *
     * blockHandler="blockHandlerTest3"  配置熔断降级
     *
     * */

    // fallback = "fallBackTest3" 即配置哨兵的容错  策略
    @SentinelResource(value = "test3",fallback = "fallBackTest3",blockHandler = "blockHandlerTest3")
    @RequestMapping("/test3")
    public Student test3(){
        Student student = new Student(100,"xiaohua",13,"man",173.5f);

        return feignService.updateStudent(student);
    }


    /**
     * 熔断降级  规则
     *
     * 该规则中必须有 BlockException e 形式参数,否则该降级策略无法生效
     * 兜底数据
     * @return
     * */
    public Student blockHandlerTest3(BlockException e){

        e.printStackTrace();

        Student student = new Student();

        student.setName("哨兵熔断  降级   返回数据");

        return student;
    }


    /**
     * 容错的方法的返回值 一定要和处理器返回的方法值一样,否则前端会报错
     * 兜底数据
     * @return
     * */
    public Student fallBackTest3(){
        Student student = new Student();

        student.setName("----哨兵容错返回");

        return student;
    }


}

2.在控制台增加流控规则 (一定要注意,应用重启,流控规则失效)

 3.快速的刷新请求 测试

6.2 其它熔断降级

慢调用比例

异常比例

 异常数

 降级规则

1 平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.

2 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

3 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。

参考博文如下:

Sentinel规则之熔断降级规则_ouYang的博客-CSDN博客_sentinel 熔断规则

二、Sleuth

sleuth 是一个链路追踪工具,主要用来检测 收集 所有远程请求的响应时长,及依赖

Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案.

其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数

据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。

一个请求过来,调用服务,一条链路通过Trace Id唯一标识,Span标识发起的请求,各Span通过parent id关联起来。

2.1 Sleuth的术语

Span:基本工作单元,发送一个远程调度任务,就会产生一个Span,Span是一个64位ID唯一标识的

Trace:用另一个64位ID唯一标识的,Trace还有其他数据信息,比如摘要、时间戳事件、Trace的ID,以及进度ID。

Trace包含多个span

一个请求过来,调用服务,一条链路通过Trace ID唯一标识,Span标识发起的请求,各Span通过parent id关联起来。

 微服务跟踪(Sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。

2.2 SpringCloudSleuth有4个特点

特点说明
提供链路追踪通过sleuth可以很清楚的看出一个请求经过了哪些服务, 可以方便的理清服务的调用关系
性能分析通过sleuth可以很方便的看出每个采集请求的耗时, 分析出哪些服务调用比较耗时,当服务调用的耗时 随着请求量的增大而增大时,也可以对服务的扩容提 供一定的提醒作用
数据分析 优化链路对于频繁地调用一个服务,或者并行地调用等, 可以针对业务做一些优化措施
可视化对于程序未捕获的异常,可以在zipkpin界面上看到

2.3 Zipkin

Zipkin是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。功能包括该数据的收集和查找。

重点在于展示:链路追踪,查找数据

ipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服

务架构中的延迟问题,包括数据的收集、存储、查找和展现。 我们可以使用它来收集各个服务器上请求链路

的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而

及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提

供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户

请求的处理时间等。 Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。

接下来的测试为方便直接采用 In-Memory 方式进行存储,生产推荐 Elasticsearch。

2.4 案例

1.下载

​​​​​https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec

2.启动,在命令行输入:

java -jar zipkin-server-2.22.2-exec.jar

3.访问

http://127.0.0.1:9411/zipkin/

4.将Feigin应用的监控数据上传到 zipkin

在springcloud-feign-consumer应用中引入依赖(sleuth,zipkin)

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

在application.properties文件中配置

#配置sleuth
# 采样率
spring.sleuth.sampler.probability=1
#要将数据上传到 127.0.0.1:9411
spring.zipkin.base-url=http://127.0.0.1:9411
#以http 形式上传
spring.zipkin.sender.type=web
spring.zipkin.service.name=springcloud-alibaba-feign-consumer

#显示日志
logging.level.root=info
logging.level.org.springframework.web.servlet.DispatcherServlet=debug
logging.level.org.springframework.cloud.sleuth=debug

启动服务提供者provider,再启动feign-consumer,然后访问:http://localhost:8086/test3

接口调用

最后访问:http://127.0.0.1:9411/zipkin/,访问之后多刷新几次服务页面

 三、GateWay(网关)

Gateway 网关,同以前学的过滤器,拦截器的作用基本一样,拦截,过滤 鉴权,记录日志 等功能

过滤器,拦截器?

过滤器:他是servlet 中的内容,接口,作用可以拦截所有的servlet

拦截器:他是springmvc 中的,作用拦截 DispatchServlet中的内容

使用设计模式:责任链模式

3.1 什么是 Spring Cloud Gateway?

Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流,路由等。

安全:鉴权

监控/埋点:记录日志

限流:限制流量

路由:路径重写,提供统一的接口规范

功能特征

  • 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0

  • 动态路由

  • Predicates 和 Filters 作用于特定路由

  • 集成 Hystrix 断路器 和 sentinel 类似

  • 集成 Spring Cloud DiscoveryClient

  • 易于编写的 Predicates 和 Filters

  • 限流( Hystrix )

  • 路径重写

 

 3.2 案例

1.创建一个Springcloud-alibaba-gateway工程


    <dependencies>

        <!--

         gate way  依赖 和  spring-boot-starter-web 依赖是 互斥关系,两者不可以共存

         网关中 不可以有 spring-boot-starter-web依赖
         -->

        <!--alibaba.cloud 相关-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>

    </dependencies>

2.创建启动类

package com.qf;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

3. 创建application.yaml配置文件

spring:
  application:
    name: springcloud-alibaba-gateway
  cloud:
    gateway:
      routes:
        - id: springcloud-alibaba-consumer #设置id
          uri: lb://springcloud-alibaba-consumer  #设置服务名
          predicates:
            -  Method=GET,POST   #设置请求方法
            -  Path=/api1/*     #设置匹配路径的网关
          filters:
            - StripPrefix=1      #去掉前缀offer
        - id: springcloud-alibaba-feign-consumer
          uri: lb://springcloud-alibaba-feign-consumer
          predicates:
            - Method=GET,POST
            - Path=/api2/*
          filters:
            - StripPrefix=1
server:
  port: 9000

logging:
  level:
    org.springframework.cloud.gateway: debug

 

 3.3 Gateway的负载均衡

修改application.yaml配置文件


spring:
  application:
    name: springcloud-alibaba-gateway
  cloud:
    gateway:
      routes:
        - id: springcloud-alibaba-consumer #设置id
          uri: lb://springcloud-alibaba-consumer  #设置服务名
          predicates:
            -  Method=GET,POST   #设置请求方法
            -  Path=/api/*     #设置匹配路径的网关
            -  Weight=g1,2
          filters:
            - StripPrefix=1      #去掉前缀offer
        - id: springcloud-alibaba-feign-consumer
          uri: lb://springcloud-alibaba-feign-consumer
          predicates:
            - Method=GET,POST
            - Path=/api/*
            - Weight=g1,8
          filters:
            - StripPrefix=1
server:
  port: 9000

logging:
  level:
    org.springframework.cloud.gateway: debug

 3.4 基于filter 实现拦截鉴权功能

拦截鉴权的路径,一般都是去检查 token ,路径中必须携带token

http://localhost:9000/api/test1?token=xxxxxx

token:就是令牌,就是通行证,包含了该用户的个人信息,我们可以看到一长串字符串,但是能解析出来 该用户的信息,权限,账户等内容,

在登录的时候生成,返回给前端,前端后续发起的请求都要携带token ,需要验证

1.创建config包下的TokenFilter

package com.qfedu.config;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.Map;

@Component
public class TokenFilter  implements GlobalFilter , Ordered {
    @Override // 过滤拦截
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        // 获取请求路径中的 token  ,如果没有传递token  则拦截该请求


        // ServerWebExchange exchange 包含了 所有的请求数据

        ServerHttpRequest request = exchange.getRequest();

        String token = request.getQueryParams().getFirst("token");

        if (StringUtils.isEmpty(token)){ // 拦截
            // 返回前端 说 没有传递token

            //固定写法 返回json
            ServerHttpResponse response = exchange.getResponse();

            Map<String,Object> responseData = new HashMap<>();
            responseData.put("code",401);
            responseData.put("message","非法请求,请传递token");
            try {
                // 将信息转换为 JSON
                ObjectMapper objectMapper = new ObjectMapper();
                byte[] data = objectMapper.writeValueAsBytes(responseData);

                // 输出错误信息到页面
                DataBuffer buffer = response.bufferFactory().wrap(data);
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
                return response.writeWith(Mono.just(buffer));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }


        }


        // 放行 不拦截
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        // s数字越小优先级 越高
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

启动配置文件中配置的对应的应用,开始访问

 

最后

以上就是等待月亮为你收集整理的Spring Cloud Alibaba 第二篇(Sentinel、Sleuth、Gateway组件)一、Sentinel二、Sleuth 三、GateWay(网关)的全部内容,希望文章能够帮你解决Spring Cloud Alibaba 第二篇(Sentinel、Sleuth、Gateway组件)一、Sentinel二、Sleuth 三、GateWay(网关)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部