- 创建Maven项目并引入依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-gateway
- 增加SpringBoot项目启动类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
- 编写配置文件
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
# 设置Nacos地址
server-addr: http://localhost:8848
discovery:
# 设置集群名称
cluster-name: BeiJing
# 设置是否为临时实例
# ephemeral: false
# 设置命名空间/隔离
# namespace: 6e66d662-df1a-4f77-b9b3-0a113c769b64
#设置网关
gateway:
routes:
#id不重复就行
- id: user-service
#lb指使用loadbalanced,userservice指注册中心中的服务名
uri: lb://userservice
#指使用这个前缀的都会被导向上面设置的uri
predicates:
- Path=/user/**
#过滤器配置,可以增减请求头,请求体等
# filters:
# - AddRequestHeader=newHeader, thisIsNewHeaderValue
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
#默认过滤器
default-filters:
- AddRequestHeader=newHeader, thisIsNewHeaderValue
- 编写全局过滤器,类似于AOP
// order的值越小,优先级反而越高,越先执行
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap queryParams = request.getQueryParams();
//获取token
String token = queryParams.getFirst("token");
if ("niceToken".equals(token)) {
//放行
return chain.filter(exchange);
}
//不满足条件的token拦截
//设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//拦截请求
return exchange.getResponse().setComplete();
}
}
- 编写跨域许可类
@Configuration
public class GwCorsFilter {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 允许cookies跨域
config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
config.addAllowedMethod("OPTIONS");// 允许提交请求的方法类型,*表示全部允许
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
org.springframework.web.cors.reactive.UrlbasedCorsConfigurationSource source =
new org.springframework.web.cors.reactive.UrlbasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}