Spring Cloud 微服务开发
00:00
Spring Cloud微服务架构与开发
1. 微服务架构概述
微服务架构是一种将应用程序拆分为多个独立、可部署服务的架构风格。每个服务都围绕特定业务功能构建,并且可以独立开发、部署和扩展。
核心特性
- 服务拆分:按业务领域拆分应用
- 独立部署:每个服务可以单独部署和升级
- 服务通信:通过网络协议进行服务间通信
- 弹性伸缩:根据负载自动调整服务实例数量
- 容错处理:服务故障不影响整体系统
2. Spring Cloud 生态系统
Spring Cloud 为微服务架构提供了完整的解决方案,包括服务发现、配置管理、负载均衡、断路器等核心组件。
核心组件
| 组件 | 功能 | 实现 |
|---|---|---|
| 服务发现 | 自动注册和发现服务 | Eureka, Consul, Zookeeper |
| 配置管理 | 集中管理配置 | Config Server |
| 负载均衡 | 分发请求到多个服务实例 | Ribbon, LoadBalancer |
| 断路器 | 防止服务雪崩 | Hystrix, Resilience4j |
| API网关 | 统一入口和路由 | Gateway, Zuul |
| 链路追踪 | 监控服务调用链 | Sleuth + Zipkin |
| 分布式事务 | 跨服务事务处理 | Seata |
3. 环境搭建
3.1 基础依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 服务注册与发现 (Eureka)
服务端
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
客户端
@SpringBootApplication
@EnableEurekaClient
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
}
}
4. 服务通信
4.1 RestTemplate
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable Long id) {
// 调用商品服务
Product product = restTemplate.getForObject(
"http://product-service/product/1", Product.class);
// 处理订单逻辑
return new Order(id, product);
}
}
4.2 Feign
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
定义Feign客户端
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/product/{id}")
Product getProduct(@PathVariable("id") Long id);
}
使用Feign客户端
@RestController
public class OrderController {
@Autowired
private ProductClient productClient;
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable Long id) {
// 调用商品服务
Product product = productClient.getProduct(1L);
// 处理订单逻辑
return new Order(id, product);
}
}
5. 配置管理
5.1 配置服务器
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
配置
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
application.yml
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/your-repo/config-repo
search-paths: '{application}'
5.2 配置客户端
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
bootstrap.yml
spring:
application:
name: order-service
cloud:
config:
uri: http://localhost:8888
profile: dev
6. API网关
6.1 Spring Cloud Gateway
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置
spring:
cloud:
gateway:
routes:
- id: product_route
uri: lb://product-service
predicates:
- Path=/api/product/**
filters:
- StripPrefix=2
- id: order_route
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=2
7. 断路器
7.1 Resilience4j
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
使用
@RestController
public class OrderController {
@Autowired
private ProductClient productClient;
@CircuitBreaker(name = "productService", fallbackMethod = "fallbackGetProduct")
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable Long id) {
Product product = productClient.getProduct(1L);
return new Order(id, product);
}
public Order fallbackGetProduct(Long id, Exception e) {
// 降级逻辑
return new Order(id, new Product(0L, "默认商品", 0.0));
}
}
8. 链路追踪
8.1 Sleuth + Zipkin
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
配置
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1.0
9. 分布式事务
9.1 Seata
添加依赖
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.7.1</version>
</dependency>
使用
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@GlobalTransactional
@PostMapping("/order")
public Order createOrder(@RequestBody OrderDTO orderDTO) {
return orderService.createOrder(orderDTO);
}
}
10. 部署与监控
10.1 Docker 部署
Dockerfile
from openjdk:17-jdk-alpine
COPY target/order-service.jar order-service.jar
ENTRYPOINT ["java","-jar","/order-service.jar"]
10.2 Kubernetes 部署
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order-service
image: order-service:latest
ports:
- containerPort: 8080
10.3 监控
- Spring Boot Actuator:提供健康检查、指标监控
- Prometheus + Grafana:收集和可视化监控数据
- ELK Stack:日志收集和分析
11. 最佳实践
- 服务拆分原则:按业务领域拆分,避免过细或过粗
- API 设计:遵循 RESTful 规范,版本化 API
- 配置管理:集中管理配置,支持环境区分
- 容错设计:实现断路器、重试、超时等机制
- 监控告警:建立完善的监控体系
- 安全防护:实现服务间认证和授权
- 持续集成:自动化构建和部署
12. 常见问题与解决方案
12.1 服务发现问题
症状:服务无法注册到注册中心 解决方案:检查网络连接、注册中心地址配置、服务名称配置
12.2 服务调用超时
症状:服务调用经常超时 解决方案:设置合理的超时时间、实现重试机制、优化服务响应时间
12.3 配置更新不生效
症状:修改配置后服务未更新 解决方案:检查配置文件路径、重启服务或使用刷新机制
12.4 分布式事务问题
症状:跨服务事务不一致 解决方案:使用 Seata 等分布式事务框架,实现最终一致性
13. 项目实战
13.1 微服务架构示例
服务结构
eureka-server:服务注册中心config-server:配置中心gateway:API 网关product-service:商品服务order-service:订单服务user-service:用户服务
13.2 开发流程
- 创建父项目,管理依赖版本
- 搭建注册中心和配置中心
- 开发各个业务服务
- 配置 API 网关
- 实现服务间通信
- 添加监控和容错机制
- 部署和测试
14. 延伸阅读
- Spring Cloud 官方文档
- Spring Cloud Netflix 文档
- Spring Cloud Gateway 文档
- Resilience4j 文档
- Seata 官方文档 通过本教程,你已经了解了 Spring Cloud 微服务开发的核心概念和实践技巧。在实际项目中,你可以根据具体需求选择合适的组件和架构方案,构建可靠、可扩展的微服务系统。