gateway组件是spring cloud框架中负责网关层的,下面简单介绍一下gateway的基本使用:
1,引入依赖
<!--actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--redis插件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
2,基本配置
spring:
application:
name: gateway-service
cloud:
gateway:
discovery:
locator:
#使eureka能通过服务发现定位到这个服务
enabled: true
#对于gateway自动创建的路由规则,默认只能用大写的服务名称去调用。
#这是因为,eureka注册中心默认的服务名是大写的,在调用的时候也要是大写的。用小写的名称调用服务会404
#这个属性可以让用户通过小写的服务名称调用服务,不过用大写的名称去调用,会404
lower-case-service-id: true
3,配置路由规则
路由规则的 配置有 两种方式,代码config配置类或者配置文件中配置。
3.1,config配置类
通过返回一个RouteLocater,可以自定义gateway的路由规则,包括对什么样的uri做拦截并转发到哪个service,转发后在请求或响应中加header,或者应该具备什么样的header才能被拦截等等很多规则。
其中通过TimerFilter可以指定自定义规则的过滤器。
@Configuration
public class GatewayConfiguration {
@Autowired
private TimerFilter timerFilter;
@Bean
@Order
public RouteLocator customizedRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(r ->
//该path断言要求路径匹配到/java/**
r.path("/java/**")
//该method断言要求方法为GET
.and().method(HttpMethod.GET)
//该header断言要求header中包括"name"
.and().header("name")
//类似于配置文件中的StripPrefix
.filters(f -> f.stripPrefix(1)
//给响应中添加header
.addResponseHeader("java-param", "gateway-config")
//指定自定义的filter
// .filter(timerFilter)
)
.uri("lb://FEIGN-CLIENT")
)
.route(r -> r.path("/seckill/**")
//after断言可以让gateway的路由规则只在某个时间点以后生效(推迟一分钟)
.and().after(ZonedDateTime.now().plusMinutes(1))
// .and().before()
.filters(f -> f.stripPrefix(1))
.uri("lb://FEIGN-CLIENT")
)
.build();
}
}
3.2,配置文件配置路由规则
routes节点下,开始进行路由规则的配置。
spring:
routes:
- id: feignclient
#如果匹配上了断言,转发到FEIGN-CLIENT
uri: lb://FEIGN-CLIENT
#断言(谓词)
predicates:
#所有匹配到/yml的都转发到这里
- Path=/yml/**
filters:
#意为匹配port后的第一个单词,
#也就是localhost:65000/yml/sayHi,路由后为localhost:65000/FEIGN-CLIENT/sayHi
- StripPrefix=1
4,自定义过滤器
通过实现Orderd、GlobalFilter(全局过滤)或GatewayFilter(按路由规则过滤),可以自定义过滤规则。
代码示例如下:
@Slf4j
@Component
//实现GlobalFilter,不用注入Config类,即可实现全局过滤。
//实现GatewayFilter,需要注入Config类并使用,实现gateway过滤。
public class TimerFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
StopWatch timer = new StopWatch();
timer.start(exchange.getRequest().getURI().getRawPath());
return chain.filter(exchange).then(
Mono.fromRunnable(() -> {
timer.stop();
log.info(timer.prettyPrint());
})
);
}
@Override
public int getOrder() {
return 0;
}
}
另外还可以通过配置文件的方式进行配置,此处省略。