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

  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/12773420.html
Copyright © 2011-2022 走看看