一、微服務閘道器跨域問題
專案採用前後端分離架構,前段存在自己的前段系統,並且會單獨部署,同樣後端系統也都是單獨部署,這樣就一定存在跨域問題。可以在controller類上新增註解來進行解決,但是現在的訪問都是基於閘道器進行操作,所以還需要在閘道器係統上對跨域問題進行解決。具體解決方案:在閘道器係統新增配置資訊:
修改application.yml ,在spring.cloud.gateway節點新增配置:
globalcors:
cors-configurations:
'[/**]': # 匹配所有請求
allowedOrigins: "*" #跨域處理 允許所有的域
allowedMethods: # 支援的方法
- GET
- POST
- PUT
- DELETE
閘道器模組spring.cloud.gateway的配置檔案application.yml如下:
spring:
application:
name: sysgateway
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有請求
allowedOrigins: "*" #跨域處理 允許所有的域
allowedMethods: # 支援的方法
- GET
- POST
- PUT
- DELETE
routes:
- id: goods
uri: lb://goods
predicates:
- Path=/goods/**
filters:
- StripPrefix= 1
server:
port: 9101
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
二、微服務閘道器自定義過濾器
當有了閘道器係統,客戶端所有訪問先進入到閘道器中,由閘道器將請求轉發到具體某個服務。基於這個特點,可以在閘道器上透過過濾器的形式進行特定業務的操作:比如ip(黑白名單)攔截、特定地址的攔截等。
定義兩個過濾器 :獲取客戶端訪問IP 和客戶端訪問URL地址:
(1)shangcheng_gateway_system建立IpFilter(獲取客戶端訪問IP)
@Component public class IpFilter implements GlobalFilter, Ordered { //具體業務邏輯 @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("經過第1個過濾器IpFilter"); ServerHttpRequest request = exchange.getRequest(); InetSocketAddress remoteAddress = request.getRemoteAddress(); System.out.println("ip:"+remoteAddress.getHostName()); return chain.filter(exchange);//放行過濾器 } //過濾器的執行優先順序 @Override public int getOrder() { return 1; } }
(2)shangcheng_gateway_system建立UrlFilter(獲取客戶端訪問url地址)
@Component public class UrlFilter implements GlobalFilter, Ordered { //具體業務邏輯 @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("經過第2個過濾器UrlFilter"); ServerHttpRequest request = exchange.getRequest(); String url = request.getURI().getPath(); System.out.println("url:"+url); return chain.filter(exchange);//放行過濾器 } //過濾器的執行優先順序 @Override public int getOrder() { return 2; } }
三、閘道器訪問路由轉發測試
閘道器訪問路由轉發測試:
直接訪問Goods微服務:localhost:9001/brand/category/手機
成功返回結果。
訪問閘道器:localhost:9101/goods/brand/category/手機
成功返回結果。