文章目录
一、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/{微服务接口}