zoukankan      html  css  js  c++  java
  • SpringCloud第五天

    网关配置文件的讲解

    route组成部分
    id:路由的ID
    uri:匹配路由的转发地址

    • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。
      转发的判断条件,SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等
    predicates:
      - Host=
      - Path=
      - Method=
      - Header=
      - Query=
      - Cookie=
      - Before=2020-09-09T01:01:01.000+08:00 #可以在这个时间之间访问
    

    order:路由的优先级,数字越小,优先级越高。

    • filters: 过滤器
      比如一开始的
              filters: #过滤器,请求在传递过程中通过过滤器修改
                - StripPrefix=1  #去掉第一层前缀
    

    过滤器分为
    局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以 GatewayFilterFactory 结尾
    全局过滤器:作用全部路由上,比如在网关模块创建一个全局过滤器,用于进行身份验证

    @Component
    public class UserGlobalFilter implements GlobalFilter,Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    ​
            String token = exchange.getRequest().getHeaders().getFirst("token");
    ​
            System.out.println(token);
            if(StringUtils.isBlank(token)){
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
    ​
            //继续往下执行
            return chain.filter(exchange);
    ​
        }
    ​
        //数字越小,优先级越高
        @Override
        public int getOrder() {
            return 0;
        }
    }
    

    网关不要加太多业务逻辑,否则会影响性能

    交互过程

    • 客户端向Spring Cloud Gateway发出请求
    • 如果网关处理程序映射确定请求与路由匹配
    • 则将其发送到网关Web处理程序
    • 通过特定过滤器链运行,前置处理-后置处理

      order就是定义过滤器的级别的

    链路追踪问题

    在微服务的各个服务之间的调用的时候,如何确定调用链路出现了问题怎么快速排查,链路耗时长怎么定位是哪个服务,传统的监控工具并无法满足,分布式链路系统由此诞生。

    将一次请求分布式调用,使用GPS定位串起来,记录每个调用的耗时、性能等日志,并通过可视化工具展示出来,我们是用Sleuth和zipking

    Sleuth组件

    一个组件,专门用于记录链路数据的开源组件

    1. 在每个服务添加依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    

    这个组件是为了记录一下链路信息的
    2. 使用zipkin来可视化
    下载jar包,然后启动
    java -jar zipkin-server-2.12.9-exec.jar
    zipkin组成:Collector、Storage、Restful API、Web UI组成

    sleuth收集跟踪信息通过http请求发送给zipkin server
    zipkin server进行跟踪信息的存储以及提供Rest API即可
    Zipkin UI调用其API接口进行数据展示默认存储是内存,可也用mysql 或者elasticsearch等存储
    3. 微服务加入依赖

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

    4.填写配置

    spring:
      application:
        name: api-gateway
      zipkin:
        base-url: http://vm02:9411/ #zipkin地址
        discovery-client-enabled: false  #不用开启服务发现
    ​
      sleuth:
        sampler:
          probability: 1.0 #采样百分比
    

    默认为0.1,即10%,这里配置1,是记录全部的sleuth信息,是为了收集到更多的数据(仅供测试用)。
    在分布式系统中,过于频繁的采样会影响系统性能,所以这里配置需要采用一个合适的值。

    1. 然后重新启动服务,接着,在Zipkin的网页查看

    后端idea也有相应的链路显示

    第一个值,spring.application.name的值
    第二个值,96f95a0dd81fe3ab ,sleuth生成的一个ID,叫Trace ID,用来标识一条请求链路,一条请求链路中包含一个Trace ID,多个Span ID
    第三个值,852ef4cfcdecabf3、spanid 基本的工作单元,获取元数据,如发送一个http
    第四个值:false,是否要将该信息输出到zipkin服务中来收集和展示。

    但是现在的链路信息,当服务重启之后,就会丢失掉,现在进行把信息持久化到mysql
    在mysql创建表

    CREATE TABLE IF NOT EXISTS zipkin_spans (
      `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
      `trace_id` BIGINT NOT NULL,
      `id` BIGINT NOT NULL,
      `name` VARCHAR(255) NOT NULL,
      `remote_service_name` VARCHAR(255),
      `parent_id` BIGINT,
      `debug` BIT(1),
      `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
      `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
      PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
    ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
     
    ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
    ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
    ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
    ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
     
    CREATE TABLE IF NOT EXISTS zipkin_annotations (
      `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
      `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
      `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
      `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
      `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
      `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
      `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
      `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
      `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
      `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
      `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
    ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
     
    ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
    ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
    ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
    ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
    ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
    ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
    ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
     
    CREATE TABLE IF NOT EXISTS zipkin_dependencies (
      `day` DATE NOT NULL,
      `parent` VARCHAR(255) NOT NULL,
      `child` VARCHAR(255) NOT NULL,
      `call_count` BIGINT,
      `error_count` BIGINT,
      PRIMARY KEY (`day`, `parent`, `child`)
    ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
    

    用下面命令重新启动

    java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin_log --MYSQL_USER=root --MYSQL_PASS=xdclass.net
    
    个人qq:835493858 有事联系我
  • 相关阅读:
    shutil、zipfile,tarfile
    time、datetime、calendar
    stat
    os与sys模块
    数据同步解决方案
    Oracle数据同步交换
    SQL Server数据同步交换
    MySQL数据同步交换
    Informix网页数据维护客户端工具
    Kingbase数据库web统一管理平台
  • 原文地址:https://www.cnblogs.com/wpbing/p/14346203.html
Copyright © 2011-2022 走看看