综合实战:订单服务调用库存服务
9.1 实战目标
最终实现:
text
客户端请求 Gateway
↓
Gateway 路由到 order-service
↓
order-service 创建订单
↓
order-service 使用 OpenFeign 调用 stock-service 扣减库存
↓
Sentinel 对订单接口限流
↓
stock-service 故障时 Feign fallback 降级
↓
全链路 Header 透传9.2 stock-service 完整 pom.xml
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.demo</groupId>
<artifactId>cloud-demo-2025</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>stock-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
</dependencies>
</project>9.3 order-service 完整 pom.xml
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.demo</groupId>
<artifactId>cloud-demo-2025</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>order-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
</project>9.4 gateway-service 完整 pom.xml
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.demo</groupId>
<artifactId>cloud-demo-2025</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>gateway-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway-server-webflux</artifactId>
</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>
</dependencies>
</project>9.5 order-service application.yml
yaml
server:
port: 8081
spring:
application:
name: order-service
profiles:
active: dev
config:
import:
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
namespace: public
group: DEFAULT_GROUP
config:
namespace: public
group: DEFAULT_GROUP
file-extension: yml
openfeign:
sentinel:
enabled: true
client:
config:
default:
connectTimeout: 3000
readTimeout: 5000
loggerLevel: BASIC
sentinel:
transport:
dashboard: 127.0.0.1:8080
logging:
level:
com.demo.order.client: DEBUG9.6 stock-service application.yml
yaml
server:
port: 8082
spring:
application:
name: stock-service
profiles:
active: dev
config:
import:
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
namespace: public
group: DEFAULT_GROUP
config:
namespace: public
group: DEFAULT_GROUP
file-extension: yml9.7 gateway-service application.yml
yaml
server:
port: 9000
spring:
application:
name: gateway-service
profiles:
active: dev
config:
import:
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
namespace: public
group: DEFAULT_GROUP
config:
namespace: public
group: DEFAULT_GROUP
file-extension: yml
gateway:
server:
webflux:
routes:
- id: order-route
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
- id: stock-route
uri: lb://stock-service
predicates:
- Path=/api/stock/**
filters:
- StripPrefix=19.8 启动顺序
推荐启动顺序:
text
1. Nacos Server
2. Sentinel Dashboard
3. stock-service
4. order-service
5. gateway-service9.9 测试服务注册
访问 Nacos:
text
http://localhost:8848/nacos查看服务列表:
text
gateway-service
order-service
stock-service9.10 测试 Gateway 路由
访问:
text
http://localhost:9000/api/stock/stock/info期望:
text
stock-service is running访问:
text
http://localhost:9000/api/order/order/create?productId=1001&count=2期望:
text
创建订单成功,库存服务返回:扣减库存成功,productId=1001, count=29.11 测试 Sentinel 限流
先访问一次:
text
http://localhost:8081/order/create?productId=1001&count=2打开 Sentinel:
text
http://localhost:8080进入:
text
order-service -> 簇点链路找到:
text
/order/create添加流控规则:
text
QPS = 1快速刷新接口。
期望:
text
Blocked by Sentinel (flow limiting)或者自定义 JSON:
json
{
"code": 429,
"message": "请求过于频繁,请稍后再试"
}9.12 测试 Feign 降级
停止 stock-service。
访问:
text
http://localhost:8081/order/create?productId=1001&count=2期望:
text
创建订单成功,库存服务返回:库存服务暂时不可用,扣减库存失败,已进入降级逻辑或者你自己定义的 fallback 返回值。
9.13 测试上下文透传
访问:
text
http://localhost:9000/api/order/order/context/feign期望 stock-service 收到:
text
X-Request-Id
X-User-Id
X-Tenant-Id返回类似:
text
stock-service received: requestId=xxx, userId=10001, tenantId=tenant-a