zoukankan      html  css  js  c++  java
  • spring gateway 学习

    为什么需要使用网关

    1.实现统一认证

    2.统一一个域名,解决调用困难。

    3.协议转换 将不友好的协议转成友好的协议。

     spring cloud gateway 是什么

    是spring cloud 的第二代网关,会替代zuul 第一代网关。

    基于 netty,reactor,webflux 构建。

    优点:

    1.性能强劲 是 zuul 的1.6倍

    2.功能强大

     内置 监控,限流,转发等

    3.设计优雅,容易扩展。

    编写spring cloud gateway

    增加依赖

    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>

    网关配置

    server:
      port: 8040
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
        gateway:
          discovery:
            locator:
              # 让gateway通过服务发现组件找到其他的微服务
              enabled: true
    management:
      endpoints:
        web:
          exposure:
            include: '*'
      endpoint:
        health:
          show-details: always

    这样网关就编写好了

    通过网关访问为微服务

    http://网关地址/user-center/user/1

    这个将会将请求转发到 http://用户微服务/user/1 的地址。

    - id: sytem
      uri: lb://jpaas-system
      predicates:
        - Path=/api-system/**
      filters:
        - StripPrefix=1

    这个作用是,当路径为

    /api-system/ 开头的路径,转发到 jpaas-system 的微服务,并将URL 去掉前缀。
    
    
    

    spring gateway 的核心概念

    1.路由

    spring clound gateway  的基础元素,可以理解成为一条转发规则:

    包含ID ,目标URL ,Predicate 集合和 Filter 集合。

    2.Predicate (谓词)

     即 java.util.function.Predicate ,spring cloud gateway 使用谓词实现路由匹配条件

    3.Filter 过滤器

     修改请求 以及响应

     典型的路由配置:

    spring:
      application:
        name: gateway
      cloud:
        gateway:
          discovery:
            locator:
              # 让gateway通过服务发现组件找到其他的微服务
              enabled: true
          routes:
            - id: user_route
              uri: lb://user-center
              predicates:
                - Path=/users/**
            - id: content_route
              uri: lb://content-center
              predicates:
                - Path=/shares/**,/admin/**
    filters:
    - AddRequestHeader=token,0001

    包括:

    id,uri,predicates,filtres 等

    spring gateway 架构图

    1. gateway client 是浏览器

    2. proxied service 表示 被代理的微服务

    3. handler maping 判断路径是否和路由配置匹配。

    4.webhandler 会读取这个路由的过滤器,交给过滤器处理。

    内置路由谓词工厂

     参考文档

    http://www.imooc.com/article/290804

    自定义谓词工厂

    比如限制在 9-17 点才允许访问某个路径

    import lombok.Data;
    
    import java.time.LocalTime;
    
    @Data
    public class TimeBeweenConfig {
        private LocalTime start;
        private LocalTime end;
    }

    配置代码

    自定义谓词工厂代码

    @Component
    public class TimeBetweenRoutePredicateFactory
        extends AbstractRoutePredicateFactory<TimeBeweenConfig> {
        public TimeBetweenRoutePredicateFactory() {
            super(TimeBeweenConfig.class);
        }
    
        @Override
        public Predicate<ServerWebExchange> apply(TimeBeweenConfig config) {
            LocalTime start = config.getStart();
            LocalTime end = config.getEnd();
    
            return new Predicate<ServerWebExchange>() {
                @Override
                public boolean test(ServerWebExchange serverWebExchange) {
                    LocalTime now = LocalTime.now();
                    return now.isAfter(start) && now.isBefore(end);
                }
            };
        }
        @Override
        public List<String> shortcutFieldOrder() {
            return Arrays.asList("start", "end");
        }
    }

     类使用 RoutePredicateFactory 结束,这个是约定。

    在配置文件中进行配置。

    predicated:

      -TimeBetween=上午8:00,下午17:00

    网关过滤器配置

    http://www.imooc.com/article/290816

    内置过滤器介绍。

    编写自定义过滤器代码。

    @Component
    public class PreLogGatewayFilterFactory
        extends AbstractNameValueGatewayFilterFactory {
        @Override
        public GatewayFilter apply(NameValueConfig config) {
            return new GatewayFilter() {
                @Override
                public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                    log.info("请求进来了...{},{}", config.getName(), config.getValue());
                    ServerHttpRequest modifiedRequest = exchange.getRequest()
                            .mutate()
                            .build();
                    ServerWebExchange modifiedExchange = exchange.mutate()
                            .request(modifiedRequest)
                            .build();
    
                    return  chain.filter(modifiedExchange);
    
                }
            };
        }
    }

    配置编写为

    filters:

       -PreLog:a,b

    filters:
    - StripPrefix=1
    StripPrefix 过滤器的作用
    当我们访问
    /api-user/user/org/osUser/current
    配置这个过滤器后,访问路径会被修改为
    /user/org/osUser/current
    会将前缀进行截取。 

    全局过滤器介绍

    https://www.cnblogs.com/yinjihuan/p/10474768.html

    GATEWAY 监控

    使用 springboot actuator 进行监控

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>

    增加配置到pom.xml 

    修改 配置文件:

    management:
      endpoints:
        web:
          exposure:
            include: '*'
      endpoint:
        health:
          show-details: always

     配置好后,访问路径都在 /actoator/gateway 下面

    在这里我们可以通过 actuator 增加或更新路由。

    调试方法

    http://www.imooc.com/article/290824

    限流

    http://www.imooc.com/article/290828

  • 相关阅读:
    java-工具代码
    idea-常用快捷键
    idea-环境配置
    mysql-常用命令
    Java IO流学习总结
    Java类加载机制
    Struts2标签 %{ } %{# }详解
    EL语法
    SQL语句
    在servlet转向jsp页面的路径问题
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/12773420.html
Copyright © 2011-2022 走看看