GatewayFilter是網關中提供的一種過濾器,可以對進入網關的請求和微服務返回的響應做處理:
Spring提供了31種不同的路由過濾器工廠。例如:
名稱 說明
AddRequestHeader 給當前請求添加一個請求頭
RemoveRequestHeader 移除請求中的一個請求頭
AddResponseHeader 給響應結果中添加一個響應頭
RemoveResponseHeader 從響應結果中移除有一個響應頭
RequestRateLimiter 限制請求的流量
實例:給所有進入userservice的請求添加一個請求頭
給所有進入userservice的請求添加一個請求頭:Truth=itcast is freaking awesome!
1.局部過濾器
實現方式:在gateway中修改application.yml文件,給userservice的路由添加過濾器:
spring:
gateway:
routes:
- id: user-service # 路由標示,必須唯一
uri: lb://userservice # 路由的目標地址
predicates: ## 路由斷言,也就是判斷請求是否符合路由規則的條件
- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合
filter:
- AddRequestHeader=Truth,zhangsan is freaking awesome! #添加請求頭
2.默認過濾器
如果要對所有的路由都生效,則可以將過濾器工廠寫到default下。格式如下:
spring:
gateway:
routes:
- id: user-service # 路由標示,必須唯一
uri: lb://userservice # 路由的目標地址
predicates: ## 路由斷言,也就是判斷請求是否符合路由規則的條件
- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合
#filter:
# - AddRequestHeader=Truth,zhangsan is freaking awesome! #添加請求頭
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
- Before=2037-01-20T17:42:47.789-07:00[Asia/Shanghai]
#- After=2037-01-20T17:42:47.789-07:00[Asia/Shanghai]
default-filters:
- AddRequestHeader=Truth,lisi is freaking awesome! #添加請求頭
@RestController @RequestMapping("order") public class OrderController { @Autowired private OrderService orderService; @GetMapping("{orderId}") public Order queryOrderByUserId(@PathVariable("orderId") Long orderId, @RequestHeader(value = "Truth", required = false) String truth) { System.out.println("truth: " + truth); // 根據id查詢訂單並返回
return orderService.queryOrderById(orderId); } }
總結:
過濾器的作用是什么?
a.對路由的請求或響應做加工處理,比如添加請求頭
b.配置在路由下的過濾器只對當前路由的請求生效
defaultFilters的作用是什么?
a.對所有路由都生效的過濾器