Spring Cloud Alibaba 深度实战:Nacos + Sentinel + Gateway 整合指南
在微服务架构日益成熟的今天,服务治理、流量控制与 API 网关构成了系统的核心支柱。Spring Cloud Alibaba 提供了一套行之有效的解决方案,本指南将带领您深度整合 Nacos、Sentinel 和 Gateway,构建一个功能完备的微服务体系。
参考资料
环境准备与依赖配置
首先需要在项目中引入必要的依赖,以下是核心依赖配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Nacos 服务注册与发现
Nacos 作为服务注册中心,负责服务的注册、发现和健康监测。以下是基础配置:
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
config:
server-addr: localhost:8848
file-extension: yaml
prefix: application
服务提供者的示例代码:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
@GetMapping("/service-info")
public String getServiceInfo() {
return "当前服务:user-service,端口:" + environment.getProperty("local.server.port");
}
}
Sentinel 流量控制与熔断降级
Sentinel 提供流量控制、熔断降级和系统保护能力。配置示例如下:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
eager: true
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: ${
spring.application.name}-sentinel
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
定义资源保护规则:
@RestController
@RequestMapping("/orders")
public class OrderController {
@SentinelResource(value = "createOrder", blockHandler = "createOrderBlockHandler")
@PostMapping
public ResponseEntity<Order> createOrder(@RequestBody OrderRequest request) {
Order order = orderService.create(request);
return ResponseEntity.ok(order);
}
public ResponseEntity<String> createOrderBlockHandler(OrderRequest request, BlockException ex) {
return ResponseEntity.status(429).body("系统繁忙,请稍后重试");
}
@SentinelResource(value = "getOrderDetail", fallback = "getOrderDetailFallback")
@GetMapping("/{orderId}")
public ResponseEntity<OrderDetail> getOrderDetail(@PathVariable String orderId) {
OrderDetail detail = orderService.getDetail(orderId);
return ResponseEntity.ok(detail);
}
public ResponseEntity<OrderDetail> getOrderDetailFallback(String orderId, Throwable ex) {
return ResponseEntity.ok(OrderDetail.defaultDetail());
}
}
Gateway 网关路由与过滤
Spring Cloud Gateway 作为 API 网关,负责请求路由、过滤和限流:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
- name: Sentinel
args:
resource: user_service_route
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- StripPrefix=1
- AddRequestHeader=X-Request-From, gateway
自定义网关过滤器:
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String token = request.getHeaders().getFirst("Authorization");
if (StringUtils.isEmpty(token)) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
if (!validateToken(token)) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.FORBIDDEN);
return response.setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1;
}
private boolean validateToken(String token) {
return token.startsWith("Bearer ");
}
}
整合配置与动态刷新
通过 Nacos Config 实现配置的动态管理:
在 Nacos 中创建 dataId: user-service.yaml
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/user_db
username: root
password: 123456
redis:
host: localhost
port: 6379
management:
endpoints:
web:
exposure:
include: refresh,health,info
配置刷新监听:
@RestController
@RefreshScope
public class ConfigController {
@Value("${app.config.timeout:5000}")
private Integer timeout;
@GetMapping("/config/timeout")
public Integer getTimeout() {
return timeout;
}
}
服务间调用与负载均衡
使用 OpenFeign 进行服务间调用:
@FeignClient(name = "user-service", path = "/users", configuration = FeignConfig.class)
public interface UserServiceClient {
@GetMapping("/{id}")
ResponseEntity<User> getUserById(@PathVariable("id") Long id);
@PostMapping
ResponseEntity<User> createUser(@RequestBody User user);
}
@Component
public class OrderService {
@Autowired
private UserServiceClient userServiceClient;
public Order createOrder(OrderRequest request) {
ResponseEntity<User> response = userServiceClient.getUserById(request.getUserId());
if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
User user = response.getBody();
return buildOrder(user, request);
}
throw new RuntimeException("用户不存在");
}
}
监控与仪表板
Sentinel 控制台配置规则:
[
{
"resource": "user_service_route",
"count": 100,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
},
{
"resource": "createOrder",
"count": 50,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}
]
总结
通过以上完整的整合实践,我们构建了一个基于 Spring Cloud Alibaba 的微服务系统。Nacos 提供了服务注册发现和配置管理能力,Sentinel 保障了系统的稳定性和可靠性,Gateway 统一了 API 入口并提供了丰富的过滤器功能。这种架构模式能够很好地应对微服务架构中的各种挑战,为业务系统提供坚实的技术基础。
在实际生产环境中,还需要考虑更多的因素,如分布式事务、链路追踪、安全认证等,这些都可以在现有架构基础上进行扩展和完善。
关于作者
🌟 我是suxiaoxiang,一位热爱技术的开发者
💡 专注于Java生态和前沿技术分享
🚀 持续输出高质量技术内容
如果这篇文章对你有帮助,请支持一下:
👍 点赞
⭐ 收藏
👀 关注
您的支持是我持续创作的动力!感谢每一位读者的关注与认可!