Xây Dựng Lớp Gateway Tập Trung với Spring Cloud Gateway

Chức Năng Chính Của Gateway

Thành phần gateway đóng vai trò trung tâm trong kiến trúc microservices với các nhiệm vụ cốt lõi:

  • Xác thực danh tính và kiểm tra phân quyền
  • Định tuyến dịch vụ và phân tải yêu cầu
  • Giới hạn tốc độ truy cập (rate limiting)

Thiết Lập Cơ Bản

1. Thêm phụ thuộc Maven

<!-- Phụ thuộc phát hiện dịch vụ Nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- Phụ thuộc gateway Spring Cloud -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2. Cấu hình application.yml

server:
  port: 10010
spring:
  application:
    name: lop-gateway
  cloud:
    nacos:
      server-addr: localhost:9998
    gateway:
      routes:
        - id: dich-vu-nguoi-dung
          uri: lb://user-service
          predicates:
            - Path=/nguoi-dung/**
        - id: dich-vu-don-hang
          uri: lb://order-service
          predicates:
            - Path=/don-hang/**

Filter Trong Gateway

Local Filter - Thêm header vào request

@GetMapping("/{ma}")
public NguoiDung layTheoMa(
    @PathVariable("ma") Long ma, 
    @RequestHeader(value = "XacNhan", required = false) String xacNhan
) {
    log.info("Gia tri XacNhan: {}", xacNhan);
    return nguoiDungService.layTheoMa(ma);
}

Global Filter - Xác thực toàn cục

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class BoLocXacThuc implements GlobalFilter, Ordered {
    
    @Override
    public Mono<Void> filter(ServerWebExchange traoDoi, GatewayFilterChain chain) {
        String giaTriXacThuc = traoDoi.getRequest()
            .getQueryParams()
            .getFirst("xac_thuc");
        
        if ("chu_quan".equals(giaTriXacThuc)) {
            return chain.filter(traoDoi);
        }
        
        traoDoi.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        return traoDoi.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return -100;
    }
}

Thứ Tự Thực Thi Filter

Khi các filter có cùng mức độ ưu tiên:

  1. defaultFilter (được khai báo toàn cục)
  2. Filter theo route cụ thể
  3. GlobalFilter

Cấu Hình CORS

spring:
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true
        corsConfigurations:
          '[/**]':
            allowedOrigins:
              - "https://domain-chinh.com"
              - "http://localhost:3000"
            allowedMethods: [GET, POST, PUT, DELETE, OPTIONS]
            allowedHeaders: "*"
            allowCredentials: true
            maxAge: 1800

Cơ chế này xử lý preflight request (OPTIONS) tự động khi frontend gọi API từ domain khác, đồng thời cho phép truyền cookie qua các domain.

Thẻ: spring-cloud-gateway Nacos CORS Microservices

Đăng vào ngày 20 tháng 9 lúc 00:35