服务网关
SpringCloud GateWay
SpringCloud Gateway 是SpringCloud网关的第二代,相对于Zuul,它的性能提升了大约一半,但是它不是Servlet编程模型,不能在Tomcat容器中运行,无法构成war包,并且不支持SpringBoot 1.x。不支持的原因是Gateway是异步编程模型,而Tomcat是同步编程模型,Gate适合于Netty这种服务器上跑。
构建GateWay
- 创建SpringBoot项目,选择gateway依赖,一路next。
- 在pom文件中引入
springcloud alibaba
依赖、springcloud nacos
依赖、以及监控依赖。 - 书写配置文件
server:
port: 8040
spring:
application:
name: gateway
cloud:
这里的nacos可以换成其他的如eureka的注册中心
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
# 让gateway通过服务发现组件找到其他的微服务 开启动态路由
enabled: true
rotes:
- id: payment_routh 路由的ID,没有固定规则但是要求唯一,建议配合服务名
uri: lb://微服务名称 lb代表从注册中心获取服务
predicates:
- Path=/payment/get/** 断言,路径相匹配的进行路由
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
- 访问 gateway地址/其他微服务名/参数 就会跳转到对应的微服务方法中
PS : 在使用GateWay时,必须去除spring-boot-starter-web
的依赖,否则会报错。
GateWay核心架构
GateWay谓词工厂(匹配规则)
谓词工厂是进行url匹配的所有规则,可以根据url的不同,从而实现其转发的各个微服务,或者是通过一些特定的条件,让其跳转到一些指定的微服务。
谓词工厂可以直接在配置文件中指定,也可以自定义谓词工厂。
自定义路由谓词工厂
例如限制指定时间内才能访问。
- 在配置文件中写入
predicates:
- TimeBetween:=9:00,17:00 # 这个名字可以自定义
- 编写对应的类 例如 TimeBetweenRoutePredicateFactory 后面这个一定要写成这样,继承AbstractRoutePredicateFactory,实现其中的方法,因为这个类是一个泛型,所以要传入一个配置类,配置类中的属性要对应配置文件中的参数。
其中shortcutFieldOrder方法是设置配置类与配置文件对应,apply方法是设置配置规则。
@Component
public class TimeBetweenRoutePredicateFactory
extends AbstractRoutePredicateFactory<TimeBetweenConfig> {
public TimeBetweenRoutePredicateFactory() {
super(TimeBetweenConfig.class);
}
@Override
public Predicate<ServerWebExchange> apply(TimeBetweenConfig config) {
LocalTime start = config.getStart();
LocalTime end = config.getEnd();
return exchange -> {
LocalTime now = LocalTime.now();
return now.isAfter(start) && now.isBefore(end);
};
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("start", "end");
}
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
System.out.println(formatter.format(LocalTime.now()));
}
}
- 编写配置类,用来对应配置文件的参数
package com.itmuch.gateway;
import lombok.Data;
import java.time.LocalTime;
@Data
public class TimeBeweenConfig {
private LocalTime start;
private LocalTime end;
}
过滤器工厂详解(GatewayFilter Factory)
Spring Cloud Gateway-过滤器工厂详解(GatewayFilter Factories)
自定义过滤器工厂
- 编写自定义过滤器工厂类继承AbstractNameValueGatewayFilterFactory,实现其中的方法。
@Slf4j
@Component
public class PreLogGatewayFilterFactory
extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return ((exchange, 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 # 前面是name 后面是value
全局过滤器
全局过滤器会作用于所有的路由。全局过滤器详解
SpringCloud Gateway 整合Sentinel
网关也有可能会被某个微服务崩溃而陷入连环雪崩的情况,所以也要配置负载均衡。
Spring Cloud Gateway-过滤器工厂详解(GatewayFilter Factories)