Spring Cloud Gateway使用


一、Spring Cloud Gateway是什么?

1.是什么

微服务的反向代理
第二代网关,取代zuul,效率是zuul的1.6倍

2. 核心概念

在这里插入图片描述
例如:
在这里插入图片描述

这个配置就是一个Route。
Predicate:控制一个请求是不是要走这个转发
filter:请求在这个过滤器里处理一下,再转发给uri

3.架构图

在这里插入图片描述
外部请求发送到gateway,gateway的HandlerMapping会判断请求路径是不是符合路由的配置,如果匹配成功就会进入WebHandler,WebHanler会读取这个路由配置的filter进行处理和转发

二、使用步骤

1.建立网关应用

boot要2.0以上

2.加依赖




<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.itmuch</groupId>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>
    <description>网关</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.9.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

3.加配置

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #让gateway通过nacos找到其他微服务
server:
  port: 8048

management: #actuator ,boot的监控 包括 健康检查等
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

三、使用

http://{gateway}/{一个微服务名称}/接口/
会转发到这个微服务上

四、自定义谓词工厂

限制微服务09:00-17:00才能访问,(12306买票)

1.写配置

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #让gateway在nacos上找微服务
      routes:
        - id: before_route
          uri: lb://user-center #lb :nacos上的微服务
          predicates:
            - MyTimeBetween=上午5:00,下午9:00

2.建立工厂

注意:MyTimeBetween+RoutePredicateFactory
MyTimeBetween是配置里自定义谓词的名字,且要以RoutePredicateFactory结尾。

1.在建立工厂的时候要继承AbstractRoutePredicateFactory,返现这个类是个泛型类,需要填什么呢?

需要填的是:自定义谓词后面跟的参数,所以我们要封装一个参数类。
在这里插入图片描述

2. 建立参数类
import lombok.Data;

import java.time.LocalTime;


@Data
public class TimeBeweenConfig {

    private LocalTime start;
    private LocalTime end;
}
3.工厂

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.time.LocalTime;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

@Component
public class MyTimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<TimeBeweenConfig> {
    public MyTimeBetweenRoutePredicateFactory() {
        super(TimeBeweenConfig.class);
    }

    @Override
    //谓词工厂核心方法
    public Predicate<ServerWebExchange> apply(TimeBeweenConfig config) {
        LocalTime end = config.getEnd();
        LocalTime start = config.getStart();

        return ex->{
            //谓词
            LocalTime now = LocalTime.now();
            return now.isAfter(start) && now.isBefore(end);
        };
    }

    @Override
    //处理配置文件的自定义谓词后面的参数与配置类之间的映射关系
    //spring-cloud-gateway 是怎么知道的配置参数呢?返回Arrays.asList
    public List<String> shortcutFieldOrder() {
        //写TimeBeweenConfig里面的成员名称,这样,start会映射到第一个参数,end会映射到第二个参数
        return Arrays.asList("start","end");
    }
}

5.访问

http://localhost:8040/{微服务接口}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值