Gateway网关:路由和鉴权
网关的核心功能是:路由和过滤(鉴权)
- 搭建网关
<dependencies><!--引入gateway 网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency> </dependencies>
- 编写启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class,args);}}
- 编写配置
server:port: 10010 spring:application:name: api-gatewaycloud:# 网关配置gateway:# 路由配置:转发规则routes: #集合。# id: 唯一标识。默认是一个UUID# uri: 转发路径# predicates: 条件,用于请求网关路径的匹配规则- id: userserviceuri: http://localhost:8081/predicates:- Path=/user/**
application.yml 中的uri是写死的,就是Gateway-静态路由
Gateway-动态路由
<dependency><--添加注册中心Eureka--> <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
修改配置文件
server:port: 10010
spring:application:name: api-gatewaycloud:# 网关配置gateway:# 路由配置:转发规则routes: #集合。# id: 唯一标识。默认是一个UUID# uri: 转发路径# predicates: 条件,用于请求网关路径的匹配规则- id: user-serviceuri: lb://userservice # lb负载均衡predicates:- Path=/user/**eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka
Gateway-过滤器
GatewayFilter:局部过滤器,针对单个路由 GlobalFilter :全局过滤器,针对所有路由
全局过滤器
GlobalFilter 全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上。
Spring Cloud Gateway 核心的功能也是通过内置的全局过滤器来完成。
自定义全局过滤器步骤:
定义类实现 GlobalFilter 和 Ordered接口
复写方法
完成逻辑处理
/*** 自定义全局过滤器*/ @Component public class MyGlobalFilter implements GlobalFilter, Ordered {//需求 :请求参数中带有token 内容,就放行,否则提示未授权@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 获取请求对象ServerHttpRequest request = exchange.getRequest(); // 获取参数MultiValueMap<String, String> valueMap = request.getQueryParams();List<String> valList = valueMap.get("token");if(CollectionUtils.isEmpty(valList)){//异常情况,没有token参数// 获取响应对象ServerHttpResponse response = exchange.getResponse();// 返回响应码response.setStatusCode(HttpStatus.FORBIDDEN);//401// 完成响应return response.setComplete();}return chain.filter(exchange);//放行}@Overridepublic int getOrder() {return 0;} }