Skip to content

Spring Cloud 微服务架构

application.yml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
shared-configs:
- data-id: common.yaml
refresh: true
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
@FeignClient(name = "user-service", fallback = UserFallback.class)
public interface UserClient {
@GetMapping("/user/{id}")
Result<User> getById(@PathVariable Long id);
}
@Component
public class UserFallback implements UserClient {
@Override
public Result<User> getById(Long id) {
return Result.fail("服务不可用");
}
}
@RestController
public class OrderController {
@SentinelResource(value = "createOrder",
blockHandler = "handleBlock",
fallback = "handleFallback")
@PostMapping("/order")
public Result createOrder(@RequestBody OrderDTO dto) {
return Result.success();
}
public Result handleBlock(BlockException e) {
return Result.fail("系统繁忙,请稍后重试");
}
public Result handleFallback(Throwable t) {
return Result.fail("服务异常");
}
}
seata:
enabled: true
tx-service-group: my_tx_group
service:
vgroup-mapping:
my_tx_group: default
registry:
type: nacos
nacos:
server-addr: localhost:8848
@Service
public class OrderService {
@GlobalTransactional
public void createOrder(OrderDTO dto) {
orderMapper.insert(order);
stockClient.deduct(dto.getProductId(), dto.getQuantity());
accountClient.deduct(dto.getUserId(), dto.getAmount());
}
}
@Configuration
public class RabbitConfig {
@Bean
public Queue orderQueue() {
return new Queue("order.queue", true);
}
@Bean
public DirectExchange orderExchange() {
return new DirectExchange("order.exchange");
}
@Bean
public Binding orderBinding() {
return BindingBuilder.bind(orderQueue())
.to(orderExchange())
.with("order.created");
}
}
@Component
public class OrderConsumer {
@RabbitListener(queues = "order.queue")
public void handleOrder(OrderMessage msg) {
// 处理订单消息
}
}
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1.0
  1. 服务拆分: 按业务领域拆分,避免过度拆分
  2. 接口版本: 使用版本号管理接口变更
  3. 异常处理: 统一异常码和错误信息
  4. 日志规范: 使用 TraceId 串联请求链路
  5. 配置管理: 敏感配置使用加密存储