電商專案-微服務閘道器使用的問題

努力--坚持發表於2024-12-05

  一、微服務閘道器跨域問題


  專案採用前後端分離架構,前段存在自己的前段系統,並且會單獨部署,同樣後端系統也都是單獨部署,這樣就一定存在跨域問題。可以在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/手機

  成功返回結果。

相關文章