目录
一、Gateway初始化
- 添加依赖
xml
<!--gateway 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- nacos依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 负载均衡器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 开启默认路由规则(使得localhost/order会自动去Nacos找order服务)
yml
server:
port: 80
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
# 开启默认的路由规则,会根据注册中心中的服务名作为路径实现理由规则
enabled: true
- 启动类
java
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayStaterApp {
public static void main(String[] args) {
SpringApplication.run(GatewayStaterApp.class, args);
}
}
二、自定义路由配置
yml方式
yml
spring:
cloud:
gateway:
routes:
- predicates:
- Path=/order/**
uri: http://localhost:8082/order
Java类方式
java
package com.hxd.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayRoutesConfig {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder) {
return routeLocatorBuilder.routes()
.route(route ->
route.path("/order/**")
.uri("lb://order")).build();
}
}
三、断言
官网提供的断言类型
- After:在给定的时间之后
- Before:在给定的时间之前
- Between:在给定的时间之间,使用逗号隔开
- Cookie:cookie中含有该name并且值匹配表达式
- Header:Header中包含该key,并且值匹配表达式
- Host:匹配host name
- Method:匹配请求方法
- Paht:匹配给定的请求路径
- Query:请求中包含该请求参数
- RemoteAddr: 请求的远程地址匹配
- Weight:设置权重
- XForwardedRemoteAddr: 如果 X-Forwarded-For 头包含,则此路由匹配
四、Filter
Filter是在网关通过断言判断需要转发后,将请求转发给服务前 和服务返回结果后,增加一些逻辑
Spring Could Gateway自带的Filter
官网Filter
常用Filter
- AddRequestHeader
- AddRequestParameter
- AddResponseHeader
- StripPrefix
- DefaultFilter 全局过滤器
自定义Filter
自定义filter需要实现两个接口:
- GlobalFilter
- Ordered
java
package com.hxd.filter;
import com.alibaba.nacos.common.utils.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class ParameterGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String value = request.getQueryParams().getFirst("key");
if (StringUtils.isEmpty(value)) {
System.out.println("不符合条件!!");
// 不符合条件,返回400
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.BAD_REQUEST);
return response.setComplete();
}
// 符合条件继续放行
return chain.filter(exchange);
}
@Override
public int getOrder() {
// 值越小,优先级越高
return 0;
}
}