为什么需要使用网关

 

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

posted on 2020-04-25 22:27  自由港  阅读(1349)  评论(0编辑  收藏  举报