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:
- defaultFilter (được khai báo toàn cục)
- Filter theo route cụ thể
- 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.