Spring Cloud 详解
Spring Cloud是构建分布式系统和微服务架构的完整解决方案,它基于Spring Boot提供了服务注册发现、配置管理、负载均衡、熔断降级等微服务核心功能。
Spring Cloud = 微服务架构 + 服务治理 + 配置管理 + 负载均衡 + 熔断降级
- 🔍 服务治理:服务注册发现、API网关
- ⚖️ 负载均衡:智能路由、客户端负载均衡
- 🛡️ 熔断降级:服务容错、失败隔离
- ⚙️ 配置管理:集中配置、动态刷新
- 📊 链路追踪:分布式系统监控、调用链分析
1. Spring Cloud基础概念
1.1 什么是微服务?
微服务是一种软件架构风格,将应用程序拆分为一组小型、独立的服务,每个服务运行在自己的进程中,通过轻量级机制进行通信。
微服务架构特点
| 特点 | 说明 | 优势 |
|---|---|---|
| 服务拆分 | 按业务功能拆分服务 | 职责单一,易于维护 |
| 独立部署 | 每个服务可独立部署 | 快速迭代,降低风险 |
| 技术异构 | 不同服务可使用不同技术栈 | 技术选型灵活 |
| 数据隔离 | 每个服务管理自己的数据 | 数据一致性可控 |
| 故障隔离 | 单个服务故障不影响整体 | 提高系统可用性 |
1.2 Spring Cloud组件
Spring Cloud提供了一套完整的微服务解决方案,包含多个组件共同构建分布式系统。
Spring Cloud依赖配置
1<dependencyManagement>2 <dependencies>3 <dependency>4 <groupId>org.springframework.cloud</groupId>5 <artifactId>spring-cloud-dependencies</artifactId>6 <version>2021.0.8</version>7 <type>pom</type>8 <scope>import</scope>9 </dependency>10 </dependencies>11</dependencyManagement>2. 服务注册与发现
服务注册与发现是微服务架构的基础设施,用于管理和定位服务实例。
2.1 Eureka Server
- Java配置
- YAML配置
- 集群配置
1@SpringBootApplication2@EnableEurekaServer3public class EurekaServerApplication {4 public static void main(String[] args) {5 SpringApplication.run(EurekaServerApplication.class, args);6 }7}1server:2 port: 876134spring:5 application:6 name: eureka-server78eureka:9 instance:10 hostname: localhost11 client:12 register-with-eureka: false13 fetch-registry: false14 service-url:15 defaultZone: http://localhost:8761/eureka/16 server:17 enable-self-preservation: false18 eviction-interval-timer-in-ms: 10001# eureka-server-1 配置2server:3 port: 876145spring:6 application:7 name: eureka-server89eureka:10 instance:11 hostname: eureka112 client:13 register-with-eureka: true14 fetch-registry: true15 service-url:16 defaultZone: http://eureka2:8762/eureka/,http://eureka3:8763/eureka/17 18# eureka-server-2 配置19server:20 port: 87622122spring:23 application:24 name: eureka-server2526eureka:27 instance:28 hostname: eureka229 client:30 register-with-eureka: true31 fetch-registry: true32 service-url:33 defaultZone: http://eureka1:8761/eureka/,http://eureka3:8763/eureka/2.2 Eureka Client
- Java配置
- YAML配置
1@SpringBootApplication2@EnableEurekaClient3public class UserServiceApplication {4 public static void main(String[] args) {5 SpringApplication.run(UserServiceApplication.class, args);6 }7}1spring:2 application:3 name: user-service45eureka:6 client:7 service-url:8 defaultZone: http://localhost:8761/eureka/9 register-with-eureka: true10 fetch-registry: true11 instance:12 prefer-ip-address: true13 instance-id: ${spring.application.name}:${server.port}14 lease-renewal-interval-in-seconds: 3015 lease-expiration-duration-in-seconds: 90Eureka Client核心配置说明
| 配置项 | 说明 | 默认值 | 推荐设置 |
|---|---|---|---|
| register-with-eureka | 是否注册到Eureka | true | 生产环境保持true |
| fetch-registry | 是否从Eureka获取注册信息 | true | 生产环境保持true |
| prefer-ip-address | 是否使用IP地址注册 | false | 建议设为true |
| lease-renewal-interval | 心跳间隔时间(秒) | 30 | 根据负载调整 |
| lease-expiration-duration | 失效时间(秒) | 90 | 通常为心跳间隔的3倍 |
2.3 服务注册示例
1@RestController2@RequestMapping("/users")3public class UserController {4 5 @Autowired6 private UserService userService;7 8 @GetMapping("/{id}")9 public ResponseEntity<User> getUser(@PathVariable Long id) {10 User user = userService.findById(id);11 return ResponseEntity.ok(user);12 }13 14 @PostMapping15 public ResponseEntity<User> createUser(@RequestBody User user) {16 User savedUser = userService.save(user);17 return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);18 }19}3. 服务网关
3.1 Gateway配置
Spring Cloud Gateway是API网关服务,提供了路由、过滤、限流等功能。
- Java配置
- YAML配置
1@SpringBootApplication2@EnableDiscoveryClient3public class GatewayApplication {4 public static void main(String[] args) {5 SpringApplication.run(GatewayApplication.class, args);6 }7}1spring:2 cloud:3 gateway:4 discovery:5 locator:6 enabled: true7 lower-case-service-id: true8 routes:9 - id: user-service10 uri: lb://user-service11 predicates:12 - Path=/api/users/**13 filters:14 - StripPrefix=115 - name: RequestRateLimiter16 args:17 redis-rate-limiter.replenishRate: 1018 redis-rate-limiter.burstCapacity: 2019 20 - id: order-service21 uri: lb://order-service22 predicates:23 - Path=/api/orders/**24 filters:25 - StripPrefix=126 - name: CircuitBreaker27 args:28 name: orderCircuitBreaker29 fallbackUri: forward:/fallback/order3.2 自定义过滤器
1@Component2public class AuthFilter implements GlobalFilter, Ordered {3 4 @Override5 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {6 ServerHttpRequest request = exchange.getRequest();7 String token = request.getHeaders().getFirst("Authorization");8 9 if (token == null || !isValidToken(token)) {10 ServerHttpResponse response = exchange.getResponse();11 response.setStatusCode(HttpStatus.UNAUTHORIZED);12 return response.setComplete();13 }14 15 return chain.filter(exchange);16 }17 18 @Override19 public int getOrder() {20 return -100;21 }22 23 private boolean isValidToken(String token) {24 // 验证token逻辑25 return token != null && token.startsWith("Bearer ");26 }27}3.3 限流配置
- 代码配置
- Redis限流器
1@Configuration2public class RateLimiterConfig {3 4 @Bean5 public KeyResolver userKeyResolver() {6 return exchange -> Mono.just(7 exchange.getRequest().getHeaders().getFirst("X-User-Id")8 );9 }10 11 @Bean12 public KeyResolver ipKeyResolver() {13 return exchange -> Mono.just(14 exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()15 );16 }17}1spring:2 cloud:3 gateway:4 routes:5 - id: user-service6 uri: lb://user-service7 predicates:8 - Path=/api/users/**9 filters:10 - name: RequestRateLimiter11 args:12 redis-rate-limiter.replenishRate: 10 # 令牌桶每秒填充速率13 redis-rate-limiter.burstCapacity: 20 # 令牌桶总容量14 key-resolver: "#{@ipKeyResolver}" # 限流键解析器4. 负载均衡
Spring Cloud提供了客户端负载均衡功能,主要通过Ribbon和LoadBalancer组件实现。
4.1 Ribbon配置
- 基础配置
- YAML配置
1@Configuration2public class RibbonConfig {3 4 @Bean5 @LoadBalanced6 public RestTemplate restTemplate() {7 return new RestTemplate();8 }9 10 @Bean11 public IRule ribbonRule() {12 return new RoundRobinRule(); // 轮询策略13 }14 15 @Bean16 public IPing ribbonPing() {17 return new PingUrl();18 }19}1ribbon:2 ReadTimeout: 50003 ConnectTimeout: 20004 MaxAutoRetries: 15 MaxAutoRetriesNextServer: 26 # 特定服务的配置7 user-service:8 ReadTimeout: 100009 ConnectTimeout: 50004.2 负载均衡策略
1@Service2public class UserService {3 4 @Autowired5 @LoadBalanced6 private RestTemplate restTemplate;7 8 public User getUserById(Long id) {9 // 使用服务名进行负载均衡调用10 return restTemplate.getForObject(11 "http://user-service/users/" + id, 12 User.class13 );14 }15 16 public List<User> getAllUsers() {17 return restTemplate.getForObject(18 "http://user-service/users", 19 List.class20 );21 }22}4.3 自定义负载均衡
- 自定义规则
- 配置自定义规则
1@Component2public class CustomLoadBalancerRule extends AbstractLoadBalancerRule {3 4 @Override5 public Server choose(Object key) {6 ILoadBalancer lb = getLoadBalancer();7 8 List<Server> reachableServers = lb.getReachableServers();9 List<Server> allServers = lb.getAllServers();10 11 if (reachableServers.isEmpty()) {12 return null;13 }14 15 // 自定义负载均衡逻辑16 return reachableServers.get(new Random().nextInt(reachableServers.size()));17 }18 19 @Override20 public void initWithNiwsConfig(IClientConfig clientConfig) {21 // 初始化配置22 }23}1@Configuration2public class RibbonClientConfig {3 4 @Bean5 public IRule ribbonRule() {6 return new CustomLoadBalancerRule();7 }8}910// 针对特定服务的配置11@Configuration12@RibbonClient(name = "user-service", configuration = UserServiceRibbonConfig.class)13public class UserServiceRibbonConfig {14 15 @Bean16 public IRule ribbonRule() {17 return new WeightedResponseTimeRule();18 }19 20 @Bean21 public IPing ribbonPing() {22 return new PingUrl();23 }24}5. 熔断降级
熔断器设计模式用于保护系统免受级联故障影响,当服务调用失败达到阈值时,触发熔断,并提供后备响应。
5.1 Hystrix配置
- 应用配置
- 服务配置
- 关键属性
1@SpringBootApplication2@EnableCircuitBreaker3public class UserServiceApplication {4 public static void main(String[] args) {5 SpringApplication.run(UserServiceApplication.class, args);6 }7}1@Service2public class UserService {3 4 @Autowired5 private RestTemplate restTemplate;6 7 @HystrixCommand(8 fallbackMethod = "getUserFallback",9 commandProperties = {10 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000"),11 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),12 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),13 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")14 }15 )16 public User getUserById(Long id) {17 return restTemplate.getForObject(18 "http://user-service/users/" + id, 19 User.class20 );21 }22 23 public User getUserFallback(Long id, Throwable e) {24 // 降级逻辑25 User fallbackUser = new User();26 fallbackUser.setId(id);27 fallbackUser.setName("默认用户");28 fallbackUser.setEmail("default@example.com");29 return fallbackUser;30 }31}Hystrix关键属性
| 属性 | 说明 | 默认值 | 推荐值 |
|---|---|---|---|
| execution.isolation.thread.timeoutInMilliseconds | 执行超时时间 | 1000ms | 根据接口调整 |
| circuitBreaker.requestVolumeThreshold | 熔断触发最小请求数 | 20 | 生产环境调大 |
| circuitBreaker.errorThresholdPercentage | 错误率阈值 | 50% | 根据容错率调整 |
| circuitBreaker.sleepWindowInMilliseconds | 熔断恢复时间窗口 | 5000ms | 根据服务恢复时间调整 |
5.2 Sentinel配置
Sentinel是阿里巴巴开源的流量控制组件,提供了熔断降级、系统负载保护、实时监控等功能。
1@Configuration2public class SentinelConfig {3 4 @PostConstruct5 public void init() {6 // 配置限流规则7 List<FlowRule> rules = new ArrayList<>();8 FlowRule rule = new FlowRule();9 rule.setResource("getUser");10 rule.setGrade(RuleConstant.FLOW_GRADE_QPS);11 rule.setCount(10);12 rules.add(rule);13 FlowRuleManager.loadRules(rules);14 }15}- 服务使用
- 规则配置
1@Service2public class UserService {3 4 @SentinelResource(5 value = "getUser",6 blockHandler = "getUserBlockHandler",7 fallback = "getUserFallback"8 )9 public User getUserById(Long id) {10 return userRepository.findById(id).orElse(null);11 }12 13 public User getUserBlockHandler(Long id, BlockException ex) {14 // 限流处理15 return new User();16 }17 18 public User getUserFallback(Long id, Throwable e) {19 // 降级处理20 return new User();21 }22}1// 流控规则2private void initFlowRules() {3 List<FlowRule> rules = new ArrayList<>();4 FlowRule rule = new FlowRule();5 rule.setResource("getUser");6 rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS模式7 rule.setCount(20); // 每秒允许20次调用8 9 // 流控效果10 rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP); // 预热方式11 rule.setWarmUpPeriodSec(10); // 预热时间10秒12 13 rules.add(rule);14 FlowRuleManager.loadRules(rules);15}1617// 降级规则18private void initDegradeRules() {19 List<DegradeRule> rules = new ArrayList<>();20 DegradeRule rule = new DegradeRule();21 rule.setResource("getUser");22 rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); // 异常比例23 rule.setCount(0.5); // 异常比例阈值50%24 rule.setTimeWindow(10); // 熔断时间10秒25 26 rules.add(rule);27 DegradeRuleManager.loadRules(rules);28}6. 配置管理
Spring Cloud Config提供了集中化的配置管理,支持动态刷新和版本管理。
6.1 Config Server
- 服务配置
- YAML配置
- 本地配置
1@SpringBootApplication2@EnableConfigServer3public class ConfigServerApplication {4 public static void main(String[] args) {5 SpringApplication.run(ConfigServerApplication.class, args);6 }7}1server:2 port: 888834spring:5 application:6 name: config-server7 cloud:8 config:9 server:10 git:11 uri: https://github.com/example/config-repo12 default-label: main13 search-paths: config14 username: ${GIT_USERNAME}15 password: ${GIT_PASSWORD}1spring:2 cloud:3 config:4 server:5 native:6 search-locations: classpath:/config,file:./config7 profiles:8 active: native6.2 Config Client
1@SpringBootApplication2@EnableDiscoveryClient3@RefreshScope4public class UserServiceApplication {5 public static void main(String[] args) {6 SpringApplication.run(UserServiceApplication.class, args);7 }8}- YAML配置
- Bootstrap配置
- 配置使用
1spring:2 application:3 name: user-service4 cloud:5 config:6 uri: http://localhost:88887 fail-fast: true8 retry:9 initial-interval: 100010 max-interval: 200011 max-attempts: 61spring:2 application:3 name: user-service4 cloud:5 config:6 uri: http://localhost:88887 fail-fast: true8 profiles:9 active: dev1@RestController2@RefreshScope3public class ConfigController {4 5 @Value("${app.feature.enabled:false}")6 private boolean featureEnabled;7 8 @Value("${app.max.users:100}")9 private int maxUsers;10 11 @GetMapping("/config")12 public Map<String, Object> getConfig() {13 Map<String, Object> config = new HashMap<>();14 config.put("featureEnabled", featureEnabled);15 config.put("maxUsers", maxUsers);16 return config;17 }18}6.3 动态刷新配置
- 手动刷新
- 消息总线自动刷新
1# 单个服务手动刷新2curl -X POST http://localhost:8080/actuator/refresh34# 添加actuator依赖和配置5# pom.xml6<dependency>7 <groupId>org.springframework.boot</groupId>8 <artifactId>spring-boot-starter-actuator</artifactId>9</dependency>1011# application.yml12management:13 endpoints:14 web:15 exposure:16 include: refresh,health,info1# 添加依赖2# pom.xml3<dependency>4 <groupId>org.springframework.cloud</groupId>5 <artifactId>spring-cloud-starter-bus-amqp</artifactId>6</dependency>78# application.yml9spring:10 rabbitmq:11 host: localhost12 port: 567213 username: guest14 password: guest15 cloud:16 bus:17 enabled: true18 trace:19 enabled: true20 21# 刷新所有服务配置22curl -X POST http://localhost:8888/actuator/busrefresh2324# 刷新指定服务配置25curl -X POST http://localhost:8888/actuator/busrefresh/user-service:80807. 分布式链路追踪
分布式链路追踪用于跟踪和可视化微服务调用链路,帮助开发人员理解系统行为和排查问题。
7.1 Sleuth配置
- 依赖配置
- YAML配置
- 使用示例
1<dependency>2 <groupId>org.springframework.cloud</groupId>3 <artifactId>spring-cloud-starter-sleuth</artifactId>4</dependency>1spring:2 sleuth:3 sampler:4 probability: 1.05 web:6 client:7 enabled: true8 messaging:9 enabled: true1@Service2public class UserService {3 4 private static final Logger logger = LoggerFactory.getLogger(UserService.class);5 6 @Autowired7 private RestTemplate restTemplate;8 9 public User getUserById(Long id) {10 logger.info("开始获取用户信息,用户ID: {}", id);11 12 User user = restTemplate.getForObject(13 "http://user-service/users/" + id, 14 User.class15 );16 17 logger.info("获取用户信息成功,用户: {}", user);18 return user;19 }20}7.2 Zipkin配置
1spring:2 application:3 name: zipkin-server4 sleuth:5 zipkin:6 base-url: http://localhost:9411- Zipkin依赖
- Zipkin服务器
1<!-- Zipkin依赖 -->2<dependency>3 <groupId>org.springframework.cloud</groupId>4 <artifactId>spring-cloud-starter-zipkin</artifactId>5</dependency>1// 现代版本推荐使用Docker方式启动Zipkin服务器2// docker run -d -p 9411:9411 openzipkin/zipkin34// 或者使用Java命令5// java -jar zipkin-server.jar67// Spring Boot 2.0后不再推荐自建Zipkin服务器8@SpringBootApplication9@EnableZipkinServer // 已弃用10public class ZipkinServerApplication {11 public static void main(String[] args) {12 SpringApplication.run(ZipkinServerApplication.class, args);13 }14}8. 面试题精选
8.1 基础概念题
- 微服务架构
- 核心组件
Q: 什么是微服务架构?它的优势和挑战是什么?
A: 微服务架构是一种将应用程序拆分为小型、独立服务的架构风格。
优势包括:
- 服务拆分:按业务功能拆分,职责单一
- 独立部署:每个服务可独立部署和扩展
- 技术异构:不同服务可使用不同技术栈
- 故障隔离:单个服务故障不影响整体
挑战包括:
- 分布式复杂性:网络通信、数据一致性等
- 服务治理:服务发现、负载均衡、熔断降级
- 数据管理:分布式事务、数据一致性
- 运维复杂度:监控、日志、部署等
Q: Spring Cloud的核心组件有哪些?
A: Spring Cloud的核心组件包括:
- Eureka/Nacos/Consul:服务注册与发现
- Gateway/Zuul:API网关
- Ribbon/LoadBalancer:客户端负载均衡
- Hystrix/Sentinel/Resilience4j:熔断降级
- Config:配置管理
- Bus:消息总线
- Sleuth:分布式链路追踪
- Zipkin:调用链可视化
8.2 实践题
- 服务注册发现
- API网关
Q: 如何实现服务注册与发现?
A: 实现服务注册与发现的步骤:
- 配置Eureka Server:
1@SpringBootApplication2@EnableEurekaServer3public class EurekaServerApplication {4 public static void main(String[] args) {5 SpringApplication.run(EurekaServerApplication.class, args);6 }7}- 配置Eureka Client:
1@SpringBootApplication2@EnableEurekaClient3public class ServiceApplication {4 public static void main(String[] args) {5 SpringApplication.run(ServiceApplication.class, args);6 }7}- 服务调用:使用@LoadBalanced注解的RestTemplate或Feign客户端
- 负载均衡:通过Ribbon实现,可自定义负载均衡策略
Q: 如何实现API网关?
A: 实现API网关的方法:
- 配置Gateway:
1spring:2cloud:3 gateway:4 routes:5 - id: user-service6 uri: lb://user-service7 predicates:8 - Path=/api/users/**9 filters:10 - StripPrefix=1- 过滤器链:实现GlobalFilter接口,可处理认证、限流、日志等
- 服务发现:结合Eureka,实现动态路由
- 负载均衡:使用lb://前缀进行负载均衡
8.3 高级题
- 分布式事务
- 熔断降级
Q: 如何实现分布式事务?
A: 实现分布式事务的方法:
- 2PC/3PC:两阶段/三阶段提交协议,强一致性但性能较差
- TCC模式:Try-Confirm-Cancel模式,补偿事务
1// Try阶段2@Transactional3public void tryCreate(Order order) {4 orderMapper.insert(order); // 创建订单5 accountService.tryDeduct(order.getUserId(), order.getAmount()); // 尝试扣减余额6}78// Confirm阶段9@Transactional10public void confirmCreate(Order order) {11 order.setStatus("CONFIRMED");12 orderMapper.updateStatus(order); // 确认订单13 accountService.confirmDeduct(order.getUserId(), order.getAmount()); // 确认扣减14}1516// Cancel阶段17@Transactional18public void cancelCreate(Order order) {19 order.setStatus("CANCELED");20 orderMapper.updateStatus(order); // 取消订单21 accountService.cancelDeduct(order.getUserId(), order.getAmount()); // 取消扣减22}- Saga模式:长事务的补偿模式,每步都有对应的补偿操作
- 消息事务:基于消息的最终一致性,通过消息表+定时任务实现
- Seata:阿里开源的分布式事务框架,支持AT、TCC、Saga和XA模式
Q: 如何实现服务熔断降级?
A: 实现服务熔断降级的方法:
- Hystrix:
1@HystrixCommand(2 fallbackMethod = "fallbackMethod",3 commandProperties = {4 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),5 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),6 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")7 }8)9public String serviceMethod() {10 // 业务逻辑11}1213public String fallbackMethod() {14 return "降级响应";15}- Sentinel:
1@SentinelResource(2 value = "resourceName",3 blockHandler = "blockHandler",4 fallback = "fallbackMethod"5)6public String serviceMethod() {7 // 业务逻辑8}910public String blockHandler(BlockException ex) {11 return "限流响应";12}1314public String fallbackMethod(Throwable t) {15 return "降级响应";16}- Resilience4j:新一代熔断器,可替代Hystrix
- 理解微服务架构:掌握微服务的设计原则和最佳实践
- 熟悉核心组件:了解Eureka、Gateway、Ribbon等组件
- 掌握服务治理:学会服务注册发现、负载均衡、熔断降级
- 学会配置管理:掌握分布式配置和配置中心
- 了解监控追踪:学会分布式链路追踪和监控
通过本章的学习,你应该已经掌握了Spring Cloud的核心概念、组件使用和微服务架构设计。Spring Cloud是构建分布式系统的重要框架,掌握Spring Cloud对于构建高可用、可扩展的微服务应用至关重要。
9. Spring Cloud Alibaba
Spring Cloud Alibaba是阿里巴巴开源的微服务框架,提供了丰富的微服务组件,与Spring Cloud生态完美集成。
9.1 Nacos服务注册与发现
Nacos是阿里巴巴开源的服务注册与发现组件,支持服务注册、配置管理、服务发现等功能。
- Nacos Server配置
- Nacos Client配置
1spring:2 application:3 name: nacos-server4 cloud:5 nacos:6 discovery:7 server-addr: localhost:88488 namespace: public9 group: DEFAULT_GROUP10 config:11 server-addr: localhost:884812 namespace: public13 group: DEFAULT_GROUP14 file-extension: yaml1spring:2 application:3 name: user-service4 cloud:5 nacos:6 discovery:7 server-addr: localhost:88488 namespace: public9 group: DEFAULT_GROUP10 cluster-name: DEFAULT11 metadata:12 version: 1.0.013 zone: zone-a14 config:15 server-addr: localhost:884816 namespace: public17 group: DEFAULT_GROUP18 file-extension: yaml19 refresh-enabled: true9.2 Sentinel流量控制
Sentinel是阿里巴巴开源的流量控制组件,提供了丰富的流量控制、熔断降级、系统负载保护等功能。
- Sentinel配置
- Sentinel规则配置
1spring:2 cloud:3 sentinel:4 transport:5 dashboard: localhost:80806 port: 87197 datasource:8 ds:9 nacos:10 server-addr: localhost:884811 dataId: sentinel-rules12 groupId: DEFAULT_GROUP13 rule-type: flow1@Configuration2public class SentinelConfig {3 4 @PostConstruct5 public void init() {6 // 流控规则7 initFlowRules();8 // 降级规则9 initDegradeRules();10 // 系统规则11 initSystemRules();12 }13 14 private void initFlowRules() {15 List<FlowRule> rules = new ArrayList<>();16 FlowRule rule = new FlowRule();17 rule.setResource("getUser");18 rule.setGrade(RuleConstant.FLOW_GRADE_QPS);19 rule.setCount(20);20 rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);21 rule.setWarmUpPeriodSec(10);22 rules.add(rule);23 FlowRuleManager.loadRules(rules);24 }25 26 private void initDegradeRules() {27 List<DegradeRule> rules = new ArrayList<>();28 DegradeRule rule = new DegradeRule();29 rule.setResource("getUser");30 rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);31 rule.setCount(0.5);32 rule.setTimeWindow(10);33 rules.add(rule);34 DegradeRuleManager.loadRules(rules);35 }36 37 private void initSystemRules() {38 List<SystemRule> rules = new ArrayList<>();39 SystemRule rule = new SystemRule();40 rule.setHighestSystemLoad(0.8);41 rule.setMaxThread(1000);42 rule.setQps(100);43 rules.add(rule);44 SystemRuleManager.loadRules(rules);45 }46}9.3 Seata分布式事务
Seata是阿里巴巴开源的分布式事务框架,支持AT、TCC、Saga和XA四种事务模式。
- Seata配置
- Seata使用示例
1seata:2 tx-service-group: my_test_tx_group3 service:4 vgroup-mapping:5 my_test_tx_group: default6 registry:7 type: nacos8 nacos:9 server-addr: localhost:884810 namespace: public11 group: SEATA_GROUP12 config:13 type: nacos14 nacos:15 server-addr: localhost:884816 namespace: public17 group: SEATA_GROUP18 data-id: seataServer.properties1@Service2public class OrderService {3 4 @Autowired5 private OrderMapper orderMapper;6 7 @Autowired8 private AccountService accountService;9 10 @GlobalTransactional11 public void createOrder(Order order) {12 // 创建订单13 orderMapper.insert(order);14 15 // 扣减账户余额16 accountService.deduct(order.getUserId(), order.getAmount());17 18 // 如果这里抛出异常,整个事务会回滚19 if (order.getAmount() > 1000) {20 throw new RuntimeException("订单金额过大");21 }22 }23}9.4 RocketMQ消息队列
RocketMQ是阿里巴巴开源的消息队列,支持分布式事务消息、顺序消息、延时消息等特性。
- RocketMQ配置
- RocketMQ使用示例
1rocketmq:2 name-server: localhost:98763 producer:4 group: my-producer-group5 send-message-timeout: 30006 retry-times-when-send-failed: 27 consumer:8 group: my-consumer-group9 consume-timeout: 1510 max-reconsume-times: 31@Service2public class MessageService {3 4 @Autowired5 private RocketMQTemplate rocketMQTemplate;6 7 public void sendMessage(String topic, String message) {8 rocketMQTemplate.convertAndSend(topic, message);9 }10 11 public void sendOrderedMessage(String topic, String message, String hashKey) {12 rocketMQTemplate.syncSendOrderly(topic, message, hashKey);13 }14 15 @RocketMQMessageListener(16 topic = "order-topic",17 consumerGroup = "order-consumer-group"18 )19 public class OrderMessageListener implements RocketMQListener<String> {20 21 @Override22 public void onMessage(String message) {23 // 处理订单消息24 System.out.println("收到订单消息: " + message);25 }26 }27}10. 微服务架构设计模式
10.1 服务拆分模式
10.2 服务通信模式
- 同步通信
- 异步通信
10.3 数据一致性模式
11. 微服务监控与运维
11.1 监控体系
11.2 日志管理
- ELK架构
- Logback配置
1<configuration>2 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">3 <encoder>4 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>5 </encoder>6 </appender>7 8 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">9 <file>logs/application.log</file>10 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">11 <fileNamePattern>logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>12 <maxHistory>30</maxHistory>13 </rollingPolicy>14 <encoder>15 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>16 </encoder>17 </appender>18 19 <root level="INFO">20 <appender-ref ref="STDOUT" />21 <appender-ref ref="FILE" />22 </root>23</configuration>12. 面试题精选(全面版)
12.1 Spring Cloud基础题
- 微服务架构
- 核心组件
Q: 什么是微服务架构?它的优势和挑战是什么?
A: 微服务架构是一种将应用程序拆分为小型、独立服务的架构风格。
优势包括:
- 服务拆分:按业务功能拆分,职责单一
- 独立部署:每个服务可独立部署和扩展
- 技术异构:不同服务可使用不同技术栈
- 故障隔离:单个服务故障不影响整体
- 团队自治:不同团队可独立开发维护
挑战包括:
- 分布式复杂性:网络通信、数据一致性等
- 服务治理:服务发现、负载均衡、熔断降级
- 数据管理:分布式事务、数据一致性
- 运维复杂度:监控、日志、部署等
- 测试复杂性:集成测试、端到端测试
Q: Spring Cloud的核心组件有哪些?
A: Spring Cloud的核心组件包括:
- Eureka/Nacos/Consul:服务注册与发现
- Gateway/Zuul:API网关
- Ribbon/LoadBalancer:客户端负载均衡
- Hystrix/Sentinel/Resilience4j:熔断降级
- Config:配置管理
- Bus:消息总线
- Sleuth:分布式链路追踪
- Zipkin:调用链可视化
- Feign:声明式HTTP客户端
- Stream:消息驱动
12.2 Spring Cloud Alibaba题
- Nacos
- Sentinel
Q: Nacos相比Eureka有什么优势?
A: Nacos相比Eureka的优势:
- 功能更全面:不仅支持服务注册发现,还支持配置管理
- 支持多数据中心:支持多环境、多命名空间
- 配置动态刷新:支持配置的实时推送和动态刷新
- 支持多种协议:支持HTTP、gRPC等多种协议
- 更好的可用性:支持集群部署,提供更好的高可用性
- 支持服务标签:支持服务分组、标签等高级功能
- 支持权重路由:支持基于权重的负载均衡
Q: Sentinel的流量控制策略有哪些?
A: Sentinel的流量控制策略:
- QPS限流:基于每秒查询数的限流
- 并发线程数限流:基于并发线程数的限流
- 基于调用关系的限流:基于调用方、调用链路等
- 基于资源的限流:基于特定资源的限流
- 预热限流:系统预热期间逐步增加限流阈值
- 排队等待:超过阈值时排队等待而不是直接拒绝
- 热点参数限流:基于热点参数的限流
12.3 分布式系统题
- 分布式事务
- 服务治理
Q: 如何实现分布式事务?
A: 实现分布式事务的方法:
- 2PC/3PC:两阶段/三阶段提交协议,强一致性但性能较差
- TCC模式:Try-Confirm-Cancel模式,补偿事务
- Saga模式:长事务的补偿模式,每步都有对应的补偿操作
- 消息事务:基于消息的最终一致性,通过消息表+定时任务实现
- Seata:阿里开源的分布式事务框架,支持AT、TCC、Saga和XA模式
- 本地消息表:本地事务+消息表的方式
- 事务消息:基于消息队列的事务消息
Q: 微服务治理包括哪些方面?
A: 微服务治理包括:
- 服务注册与发现:服务的注册、发现、健康检查
- 负载均衡:客户端负载均衡、服务端负载均衡
- 熔断降级:服务熔断、降级、限流
- 配置管理:集中配置、动态配置、配置版本管理
- 服务监控:性能监控、健康监控、业务监控
- 链路追踪:分布式调用链追踪、性能分析
- 服务安全:认证、授权、加密、审计
- 服务容错:重试、超时、降级策略
12.4 高级架构题
- 高可用设计
- 性能优化
Q: 如何设计高可用的微服务架构?
A: 高可用微服务架构设计要点:
- 服务冗余:关键服务部署多个实例,避免单点故障
- 负载均衡:使用负载均衡器分发请求
- 熔断降级:实现熔断器模式,快速失败
- 超时重试:设置合理的超时时间和重试策略
- 异步处理:使用消息队列异步处理,提高响应速度
- 缓存策略:使用多级缓存提高性能
- 监控告警:实时监控系统状态,及时发现问题
- 灾备方案:多机房部署,数据备份
Q: 微服务架构如何做性能优化?
A: 微服务架构性能优化策略:
- 服务拆分优化:合理拆分服务,避免过度拆分
- 缓存优化:使用Redis等缓存减少数据库访问
- 数据库优化:读写分离、分库分表、索引优化
- 异步处理:使用消息队列异步处理耗时操作
- 连接池优化:合理配置数据库连接池、HTTP连接池
- 负载均衡优化:选择合适的负载均衡算法
- 监控优化:使用APM工具分析性能瓶颈
- JVM优化:合理配置JVM参数
12.5 实战应用题
- 架构设计
- 问题排查
Q: 设计一个电商微服务架构,需要考虑哪些方面?
A: 电商微服务架构设计要点:
- 服务拆分:用户服务、商品服务、订单服务、库存服务、支付服务、物流服务
- 数据一致性:订单创建涉及库存扣减、支付等,需要分布式事务
- 高并发处理:秒杀场景需要限流、缓存、异步处理
- 服务治理:服务注册发现、负载均衡、熔断降级
- 监控告警:业务监控、性能监控、异常监控
- 安全防护:用户认证、权限控制、防刷
- 缓存策略:商品信息缓存、用户信息缓存
- 消息队列:订单异步处理、库存异步更新
Q: 微服务架构中常见的问题如何排查?
A: 微服务架构问题排查方法:
- 服务调用失败:检查服务注册状态、网络连通性、服务健康状态
- 性能问题:使用APM工具分析调用链、数据库性能、JVM性能
- 数据不一致:检查分布式事务、消息队列、缓存一致性
- 服务熔断:检查熔断器配置、服务依赖、超时设置
- 配置问题:检查配置中心、配置刷新、配置版本
- 网络问题:检查网络延迟、丢包、防火墙设置
- 资源不足:检查CPU、内存、磁盘、网络带宽
- 日志分析:分析应用日志、系统日志、错误日志
🚀 Spring Cloud学习建议:
- 基础阶段:掌握Spring Boot、微服务架构概念
- 组件学习:学习Eureka、Gateway、Ribbon等核心组件
- 高级特性:深入理解熔断降级、配置管理、链路追踪
- Alibaba生态:学习Nacos、Sentinel、Seata等组件
- 架构设计:掌握微服务拆分、服务治理、高可用设计
- 实战应用:通过项目实践巩固理论知识
- 运维监控:学习监控、日志、部署等运维知识
通过本章的全面学习,你应该已经掌握了Spring Cloud和Spring Cloud Alibaba的核心概念、组件使用、架构设计和最佳实践。这些知识将帮助你构建高可用、可扩展、易维护的微服务应用。记住,微服务架构不仅仅是技术选型,更是一种架构思维和设计理念。
评论