Springcloud
快来分享你的内容吧~
- 02-09 02:27·Java后端OpenFeign 服务调用 4.1 OpenFeign 概述 OpenFeign 是声明式的 Web Service 客户端,它使得编写 Web Service 客户端变得更加简单。使用 Feign 创建接口加上对应的注解,就可以调用远程服务。 Feign 核心特性: 声明式调用:通过接口定义远程调用 集成 Ribbon:内置负载均衡 支持多种注解:Spring MVC、Feign 原生注解查看全文加油鸭:这份微服务核心技术文档结构清晰、图文并茂,覆盖OpenFeign、Sentinel、Gateway、Seata四大组件,原理与实践结合紧密,是难得的高质量学习笔记!432分享
- Spring Cloud + Nacos + Dubbo 整合失败Bug 描述Spring Cloud + Nacos + Dubbo 启动错误;我自己来看,nacos配置中心的配置是读取到了,但是不知道是我配置的问题还是什么,dubbo启动失败环境期望结果启动 provider 及 consumer 并完成调用错误信息部分错误信息,网上找了没找到解决方案2024-08-02T22:12:28.816+08:00 INFO 13492 --- [provide...查看全文编程导航小智:根据错误信息,可以看出dubbo启动失败的原因是找不到名为"dubbo"的扩展点"org.apache.dubbo.registry.RegistryFactory"。这个错误通常是由于dubbo的SPI(Service Provider Interface)扩展没有正确配置而导致的。首先,我建议确保以下几点:1. 检查项目依赖是否正确引入了dubbo的相关依赖。可以查看项目的pom.xml文件,
- 2022-10-29Hystrix配置正确,但是监控服务器,出现访问监视页面报 Unable to connect to command Metric Stream .但是直接访问监视端口,发现有数据?查看全文编程导航:大概率是版本问题需要在监视项目端口的 application.yml 中添加如下配置: hystrix: dashboard: proxy - stream - alow - list: "*"
110分享
Day31 Spring Cloud 2
## . OpenFeign 服务调用 ### 4.1 OpenFeign 概述 OpenFeign 是声明式的 Web Service 客户端,它使得编写 Web Service 客户端变得更加简单。使用 Feign 创建接口加上对应的注解,就可以调用远程服务。 **Feign 核心特性:** - **声明式调用**:通过接口定义远程调用 - **集成 Ribbon**:内置负载均衡 - **支持多种注解**:Spring MVC、Feign 原生注解 - **可插拔编码器**:支持多种序列化方式 - **请求拦截器**:统一处理请求头等 ### 4.2 OpenFeign 工作原理 ```mermaid graph TD A[Controller] --> B[Feign Client] B --> C[动态代理] C --> D[InvocationHandler] D --> E[RequestTemplate] E --> F[Encoder] F --> G[LoadBalancer] G --> H[Service Instance] H --> I[HTTP 调用] I --> J[Decoder] J --> K[返回结果] ``` **Feign 调用流程:** 1. **接口定义**:定义 Feign Client 接口 2. **动态代理**:JDK 动态代理生成代理对象 3. **请求构建**:根据注解构建 HTTP 请求 4. **负载均衡**:选择目标服务实例 5. **HTTP 调用**:发送 HTTP 请求 6. **响应解析**:解析响应为对象 ### 4.3 依赖配置 ```xml <dependencies> <!-- OpenFeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- LoadBalancer (Spring Cloud 2020+) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> </dependencies> ``` ### 4.4 Feign Client 定义 ```java /** * 声明式 Feign 客户端 */ @FeignClient( name = "stock-service", // 服务名称 path = "/stock", // 路径前缀 fallbackFactory = StockFeignFallback.class // 降级工厂 ) public interface StockFeignClient { /** * 扣减库存 */ @PostMapping("/deduct") Result deductStock(@RequestBody StockDeductDTO dto); /** * 查询库存 */ @GetMapping("/query/{productId}") Result<StockVO> queryStock(@PathVariable("productId") Long productId); /** * 批量查询库存 */ @GetMapping("/batch") Result<List<StockVO>> batchQuery(@RequestParam("productIds") List<Long> productIds); } ``` **@FeignClient 参数说明:** | 参数 | 说明 | | --- | --- | | name/value | 服务名称 | | path | 路径前缀 | | url | 直接指定 URL(不使用服务发现) | | decode404 | 是否解码 404 | | configuration | 自定义配置类 | | fallback | 降级实现类 | | fallbackFactory | 降级工厂类 | ### 4.5 启用 Feign ```java @SpringBootApplication @EnableFeignClients // 启用 Feign 客户端 @EnableDiscoveryClient public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } } ``` ### 4.6 负载均衡策略 **Spring Cloud LoadBalancer 支持的负载均衡策略:** | 策略 | 说明 | | --- | --- | | RoundRobinLoadBalancer | 轮询 | | RandomLoadBalancer | 随机 | **自定义负载均衡:** ```java public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer { @Override public Mono<Response<ServiceInstance>> choose(Request request) { // 自定义负载均衡逻辑 return Mono.just(Response.withServiceInstance(serviceInstance)); } } ``` ### 4.7 请求拦截器 ```java /** * Feign 请求拦截器 - 添加认证信息 */ @Configuration public class FeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { // 添加认证 Token String token = getToken(); template.header("Authorization", "Bearer " + token); // 添加请求 ID template.header("X-Request-Id", UUID.randomUUID().toString()); // 添加调用链追踪 template.header("X-Trace-Id", MDC.get("traceId")); } private String getToken() { // 从上下文获取 Token return SecurityContextHolder.getContext().getToken(); } } ``` ### 4.8 服务降级 ```java /** * Feign 降级工厂 */ @Component public class StockFeignFallback implements FallbackFactory<StockFeignClient> { @Override public StockFeignClient create(Throwable cause) { return new StockFeignClient() { @Override public Result deductStock(StockDeductDTO dto) { log.error("库存服务调用失败: {}", cause.getMessage()); return Result.fail("库存服务暂时不可用"); } @Override public Result<StockVO> queryStock(Long productId) { log.error("库存查询失败: {}", cause.getMessage()); return Result.fail("库存服务暂时不可用"); } @Override public Result<List<StockVO>> batchQuery(List<Long> productIds) { log.error("批量查询库存失败: {}", cause.getMessage()); return Result.fail("库存服务暂时不可用"); } }; } } ``` ### 4.9 Feign 调用流程 ```mermaid sequenceDiagram participant C as Controller participant F as Feign Client participant L as LoadBalancer participant S as Stock Service C->>F: 调用 Feign 接口方法 F->>L: 获取服务实例 L-->>F: 返回实例地址 F->>S: 发送 HTTP 请求 S-->>F: 返回响应 F-->>C: 返回结果 alt 调用失败 F->>F: 触发降级逻辑 F-->>C: 返回降级结果 end ``` --- ## 5. Sentinel 流量防护 ### 5.1 Sentinel 概述 Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性。 **Sentinel 核心特性:** | 特性 | 说明 | | --- | --- | | 流量控制 | 限制 QPS、并发线程数 | | 熔断降级 | 自动降级不稳定的调用 | | 系统负载保护 | CPU 使用率、平均 RT 保护 | | 热点限流 | 针对热点参数限流 | | 实时监控 | 实时监控接口运行情况 | ### 5.2 Sentinel 架构 ```mermaid graph TB A[应用服务] --> B[Sentinel Dashboard] A --> C[FlowSlot 流控] A --> D[DegradeSlot 降级] A --> E[AuthoritySlot 授权] A --> F[SystemSlot 系统保护] subgraph 规则管理 G[流控规则] H[熔断降级规则] I[热点参数规则] J[系统规则] end B --> G B --> H B --> I B --> J ``` ### 5.3 核心概念 | 概念 | 说明 | | --- | --- | | 资源 | Sentinel 要保护的目标,可以是代码中的任意方法 | | 规则 | 围绕资源的实时状态设定的策略 | | 检测结果 | 根据规则判断是放行还是拒绝 | ### 5.4 流控规则 **流控模式:** | 模式 | 说明 | | --- | --- | | 直接拒绝 | 超过阈值直接拒绝 | | 关联 | 关联资源达到阈值时限流 | | 链路 | 针对从入口资源进入的流量进行统计 | **流控效果:** | 效果 | 说明 | | --- | --- | | 快速失败 | 直接抛出 FlowException | | Warm Up | 预热,缓慢增加阈值 | | 排队等待 | 匀速排队,阈值设为排队时间 | ### 5.5 熔断降级 **熔断策略:** | 策略 | 说明 | | --- | --- | | 慢调用比例 | 慢调用比例超过阈值触发熔断 | | 异常比例 | 异常比例超过阈值触发熔断 | | 异常数 | 异常数超过阈值触发熔断 | ### 5.6 Sentinel 熔断机制 ```mermaid stateDiagram-v2 [*] --> Closed: 正常状态 Closed --> Open: 慢调用/异常比例达到阈值 Open --> HalfOpen: 熔断时长结束,进入探活 HalfOpen --> Closed: 探活成功,恢复闭合 HalfOpen --> Open: 探活失败,重新熔断 note right of Closed 正常通过请求 统计慢调用和异常 end note note right of Open 直接拒绝所有请求 持续 timeWindow 时长 end note note right of HalfOpen 放行部分请求 成功则恢复 失败则继续熔断 end note ``` **熔断状态说明:** | 状态 | 说明 | | --- | --- | | **Closed** | 正常状态,请求正常通过 | | **Open** | 熔断状态,直接拒绝所有请求 | | **HalfOpen** | 探活状态,放行部分请求进行试探 | ### 5.7 配置示例 ```java @RestController @RequestMapping("/order") public class OrderController { /** * 注解方式定义资源 + 流控 */ @GetMapping("/create") @SentinelResource( value = "createOrder", blockHandler = "createOrderBlockHandler", fallback = "createOrderFallback" ) public Result createOrder(@RequestBody CreateOrderDTO dto) { // 业务逻辑 Order order = orderService.create(dto); return Result.success(order); } /** * 流控处理方法 */ public Result createOrderBlockHandler(CreateOrderDTO dto, BlockException ex) { log.warn("订单创建被限流: {}", ex.getMessage()); return Result.fail("系统繁忙,请稍后重试"); } /** * 降级处理方法 */ public Result createOrderFallback(CreateOrderDTO dto, Throwable ex) { log.error("订单创建失败: {}", ex.getMessage()); return Result.fail("订单创建失败,请稍后重试"); } } ``` --- ## 6. Gateway 网关 ### 6.1 Gateway 概述 Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代网关框架,基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技术开发,旨在为微服务架构提供一种简单有效的、统一的 API 路由管理方式。 **Gateway 核心特性:** | 特性 | 说明 | | --- | --- | | 动态路由 | 根据请求匹配路由 | | 负载均衡 | 内置负载均衡 | | 限流 | 支持多种限流策略 | | 熔断降级 | 集成 Resilience4j | | 监控 | 集成 Actuator | | 安全 | 集成 Security | ### 6.2 Gateway 工作原理 ```mermaid graph TD A[客户端请求] --> B[Handler Mapping] B --> C[Web Handler] C --> D[Filter Chain 前置处理] D --> E[微服务] E --> F[Filter Chain 后置处理] F --> G[返回客户端] subgraph 过滤器链 D1[全局过滤器] D2[网关过滤器] D3[自定义过滤器] end D --> D1 D1 --> D2 D2 --> D3 ``` ### 6.3 核心概念 | 概念 | 说明 | | --- | --- | | Route | 路由,网关的基本构建块,由 ID、目标 URI、断言和过滤器组成 | | Predicate | 断言,Java 8 的 Predicate,用于匹配 HTTP 请求 | | Filter | 过滤器,在请求被发送到下游服务之前或之后修改请求和响应 | ### 6.4 断言工厂 | 断言 | 说明 | | --- | --- | | After | 在指定时间之后 | | Before | 在指定时间之前 | | Between | 在两个时间之间 | | Cookie | 基于 Cookie 匹配 | | Header | 基于 Header 匹配 | | Host | 基于 Host 匹配 | | Method | 基于 HTTP 方法匹配 | | Path | 基于路径匹配 | | Query | 基于查询参数匹配 | | RemoteAddr | 基于远程地址匹配 | ### 6.5 配置示例 ```yaml spring: application: name: gateway-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848 gateway: discovery: locator: enabled:true lower-case-service-id:true routes: # 订单服务路由 -id: order-service uri: lb://order-service predicates: - Path=/api/order/** - Method=POST,GET - Header=X-Request-Id, \d+ filters: - StripPrefix=1 - AddRequestHeader=X-Gateway, gateway-service ``` ### 6.6 自定义过滤器 ```java /** * 自定义全局过滤器 */ @Component @Slf4j public class LogFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String path = request.getPath().value(); String method = request.getMethod().name(); log.info("请求: {} {}", method, path); return chain.filter(exchange).then(Mono.fromRunnable(() -> { log.info("响应: {} {}", method, path); })); } @Override public int getOrder() { return -100; } } ``` --- ## 7. Seata 分布式事务 ### 7.1 分布式事务场景 ```mermaid sequenceDiagram participant U as 用户 participant O as 订单服务 participant S as 库存服务 participant P as 支付服务 participant DB1 as 订单库 participant DB2 as 库存库 participant DB3 as 支付库 U->>O: 创建订单 O->>DB1: 创建订单(本地事务) O->>S: 扣减库存 S->>DB2: 扣减库存(本地事务) S-->>O: 扣减成功 O->>P: 扣减余额 P->>DB3: 扣减余额(本地事务) P->>P: 异常!余额不足 P-->>O: 扣减失败 O->>O: 回滚订单 O->>S: 恢复库存 Note over S,DB2: 需要跨库事务回滚! ``` ### 7.2 Seata 架构 ```mermaid graph TB TC[Seata TC 事务协调器] --> TM1[TM 事务管理器] TC --> TM2 TC --> TM3 TM1 --> RM1[RM 资源管理器] TM2 --> RM2 TM3 --> RM3 RM1 --> DB1[数据库1] RM2 --> DB2[数据库2] RM3 --> DB3[数据库3] subgraph 订单服务 TM1 RM1 end subgraph 库存服务 TM2 RM2 end subgraph 支付服务 TM3 RM3 end ``` **Seata 核心角色:** | 角色 | 说明 | | --- | --- | | **TC** | 事务协调器,维护全局事务和分支事务的状态 | | **TM** | 事务管理器,定义全局事务的范围 | | **RM** | 资源管理器,管理分支事务 | ### 7.3 Seata 三种模式 | 模式 | 特点 | 适用场景 | | --- | --- | --- | | **AT** | 无侵入,自动回滚 | 大多数业务场景 | | **TCC** | 需编写三个接口,强一致性 | 核心业务、资金类 | | **Saga** | 长事务、状态机 | 复杂业务流程 | ### 7.4 AT 模式原理 **AT 模式特点:** - 无侵入:业务代码无需修改 - 自动回滚:基于 Undo Log 自动回滚 - 两阶段提交:第一阶段提交本地事务,第二阶段提交或回滚 **AT 模式工作流程:** ```mermaid sequenceDiagram participant TM as TM(事务管理器) participant TC as TC(事务协调器) participant RM1 as RM1(资源管理器) participant RM2 as RM2(资源管理器) participant DB1 as 数据库1 participant DB2 as 数据库2 Note over TM,DB2: 一阶段:提交本地事务 TM->>TC: 开启全局事务 TC-->>TM: 返回 XID TM->>RM1: 分支注册,携带 XID RM1->>DB1: 执行业务SQL RM1->>DB1: 查询前镜像 RM1->>DB1: 执行更新 RM1->>DB1: 查询后镜像 RM1->>RM1: 生成Undo Log RM1->>DB1: 提交本地事务 RM1-->>TM: 提交成功 TM->>RM2: 分支注册 RM2->>DB2: 执行业务SQL RM2->>RM2: 生成Undo Log RM2->>DB2: 提交本地事务 RM2-->>TM: 提交成功 Note over TM,DB2: 二阶段:提交/回滚 alt 提交 TM->>TC: 全局提交 TC->>RM1: 分支提交 TC->>RM2: 分支提交 RM1->>DB1: 删除Undo Log RM2->>DB2: 删除Undo Log else 回滚 TM->>TC: 全局回滚 TC->>RM1: 分支回滚 TC->>RM2: 分支回滚 RM1->>RM1: 解析Undo Log RM1->>DB1: 执行反向SQL RM2->>RM2: 解析Undo Log RM2->>DB2: 执行反向SQL end ``` ### 7.5 配置示例 ```yaml seata: enabled:true application-id: order-service tx-service-group: my_tx_group service: vgroup-mapping: my_tx_group: default grouplist: default: 127.0.0.1:8091 registry: type: nacos nacos: server-addr: 127.0.0.1:8848 namespace: seata group: SEATA_GROUP config: type: nacos nacos: server-addr: 127.0.0.1:8848 namespace: seata group: SEATA_GROUP ``` ### 7.6 全局事务使用 ```java @Service public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Autowired private StockFeignClient stockFeignClient; /** * 使用 @GlobalTransactional 开启全局事务 */ @Override @GlobalTransactional( name = "create-order-tx", rollbackFor = Exception.class ) public void createOrder(OrderDTO dto) { // 1. 创建订单 Order order = new Order(); order.setOrderNo(generateOrderNo()); order.setProductId(dto.getProductId()); order.setQuantity(dto.getQuantity()); orderMapper.insert(order); // 2. 扣减库存(调用其他服务) StockDeductDTO stockDTO = new StockDeductDTO(); stockDTO.setProductId(dto.getProductId()); stockDTO.setQuantity(dto.getQuantity()); stockFeignClient.deductStock(stockDTO); // 3. 如果发生异常,Seata 会自动回滚所有操作 } } ``` ### 7.7 TCC 模式 **TCC 模式特点:** - 强一致性:保证数据强一致性 - 高侵入:需要编写三个接口 - 适用于核心业务 **TCC 三个阶段:** | 阶段 | 说明 | | --- | --- | | Try | 资源预留,检查并冻结资源 | | Confirm | 确认提交,使用预留资源 | | Cancel | 取消回滚,释放预留资源 | --- ## 8. 最佳实践 ### 8.1 服务治理建议 | 方面 | 建议 | | --- | --- | | 服务拆分 | 按业务领域拆分,避免循环依赖 | | 服务发现 | 使用 Nacos 命名空间隔离环境 | | 配置管理 | 敏感配置使用加密存储 | | 限流熔断 | 核心接口设置降级策略 | ### 8.2 分布式事务选择 | 场景 | 推荐模式 | | --- | --- | | 一般业务 | AT 模式 | | 高并发核心业务 | TCC 模式 | | 长流程业务 | Saga 模式 | ### 8.3 监控告警 ```mermaid graph LR A[应用监控] --> B[Prometheus] C[链路追踪] --> D[Jaeger/Skywalking] E[日志收集] --> F[ELK/Loki] G[业务指标] --> H[Grafana] B --> H D --> H F --> H ```
Day30 Spring Cloud
# 1. 分布式基础 ### 1.1 什么是分布式系统 分布式系统是由多个独立计算机节点组成的系统,这些节点通过网络通信,共同完成特定的任务。分布式系统是为了解决单机系统在性能、可用性、可扩展性方面的限制而出现的。 **分布式系统的特征:** - **分布性**:节点分布在不同的物理位置 - **并发性**:多个节点可以并发执行任务 - **无全局时钟**:节点间没有统一的时间基准 - **异步通信**:节点间通过消息传递进行通信 - **故障独立性**:单个节点故障不会导致整个系统崩溃 ### 1.2 分布式系统的核心问题 | 问题 | 描述 | 解决方案 | | --- | --- | --- | | 通信 | 节点间如何高效、可靠地通信 | RPC、消息队列 | | 一致性 | 多节点数据如何保持一致 | 分布式事务、一致性协议 | | 可用性 | 系统在部分故障时是否可用 | 副本、故障转移 | | 分区容错 | 网络分区时系统如何应对 | CAP、BASE 理论 | ### 1.3 CAP 理论 ```mermaid graph TB A[CAP 理论] --> B[Consistency 一致性] A --> C[Availability 可用性] A --> D[Partition Tolerance 分区容错] B --> E[所有节点数据同一时间完全一致] C --> F[每次请求都能获取到响应] D --> G[系统在网络分区时仍能运行] H[分布式系统] --> I[AP: 可用性 + 分区容错] H --> J[CP: 一致性 + 分区容错] H --> K[CA: 一致性 + 可用性] ``` **CAP 三要素详解:** | 要素 | 说明 | 示例 | | --- | --- | --- | | **一致性** | 所有节点在同一时间看到的数据相同 | 主从复制同步 | | **可用性** | 每次请求都能获取到响应(不保证数据是最新的) | 缓存系统 | | **分区容错** | 系统在网络分区时仍能运行 | 分布式数据库 | > **CAP 不可能三角**:分布式系统最多只能同时满足其中两个特性,必须在一致性和可用性之间做权衡。 > **CAP 组合选择:** | 组合 | 特点 | 适用场景 | | --- | --- | --- | | **CP** | 保证一致性,牺牲可用性 | 金融系统、支付系统 | | **AP** | 保证可用性,牺牲一致性 | 社交网络、内容分发 | | **CA** | 不考虑分区容错(单机系统) | 传统关系型数据库 | ### 1.4 BASE 理论 BASE 是对 CAP 中 AP 策略的延伸,强调的是最终一致性。 | 要素 | 说明 | | --- | --- | | **Basically Available** | 基本可用,允许部分失败 | | **Soft state** | 软状态,状态可以随时间变化 | | **Eventually consistent** | 最终一致,经过一段时间后数据达到一致 | **CAP vs BASE:** | 理论 | 一致性要求 | 适用场景 | | --- | --- | --- | | CAP | 强一致性 | CP:强一致性AP:弱一致性 | | BASE | 最终一致性 | 对一致性要求不高的场景 | ### 1.5 分布式事务解决方案 ```mermaid graph LR A[分布式事务] --> B[2PC 两阶段提交] A --> C[3PC 三阶段提交] A --> D[TCC Try-Confirm-Cancel] A --> E[本地消息表] A --> F[事务消息] A --> G[Saga 模式] ``` **分布式事务解决方案对比:** | 方案 | 一致性 | 复杂度 | 性能 | 适用场景 | | --- | --- | --- | --- | --- | | 2PC | 强一致性 | 中 | 低 | 传统数据库 | | TCC | 强一致性 | 高 | 中 | 金融业务 | | 本地消息表 | 最终一致性 | 中 | 高 | 异步场景 | | 事务消息 | 最终一致性 | 低 | 高 | 高并发场景 | | Saga | 最终一致性 | 高 | 中 | 长流程业务 | --- ## 2. Demo 搭建 ### 2.1 版本选择 | 组件 | 版本 | | --- | --- | | Spring Boot | 2.7.18 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Cloud | 2021.0.8 | | Nacos | 2.2.3 | | Sentinel | 1.8.6 | **版本兼容性说明:** Spring Cloud Alibaba 版本与 Spring Boot 版本有严格的对应关系,选择不匹配的版本会导致启动失败。官方提供了详细的版本对应表。 ### 2.2 父工程 pom.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>spring-cloud-alibaba-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>order-service</module> <module>stock-service</module> <module>gateway-service</module> </modules> <properties> <java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version> <spring-cloud.version>2021.0.8</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project> ``` ### 2.3 微服务架构流程 ```mermaid graph TD A[客户端] --> B[Gateway 网关] B --> C[路由转发] C --> D[订单服务] C --> E[库存服务] C --> F[用户服务] D --> G[Nacos 注册中心] E --> G F --> G G --> H[Nacos 配置中心] ``` **微服务架构说明:** 1. **网关层**:统一入口,负责路由、限流、认证 2. **服务层**:业务服务,按领域拆分 3. **注册中心**:服务注册与发现 4. **配置中心**:统一配置管理 --- ## 3. Nacos 服务注册与配置中心 ### 3.1 Nacos 概述 Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 **Nacos 核心功能:** - **服务注册与发现**:支持 DNS 和 RPC 服务发现 - **动态配置服务**:支持配置的热更新 - **动态 DNS 服务**:支持权重路由 - **服务及其元数据管理**:管理服务的元数据 ### 3.2 Nacos 架构 ```mermaid graph TB A[客户端应用] --> B[Nacos Server] A --> C[获取配置/监听配置] B --> D[服务注册表] B --> E[配置存储] F[Nacos Console] --> B subgraph Nacos 集群 B1[Node 1] B2[Node 2] B3[Node 3] end B1 <--> B2 B2 <--> B3 B3 <--> B1 subgraph 存储层 G[Derby 默认存储] H[MySQL 生产存储] end E --> G E --> H ``` **Nacos 架构分层:** | 层级 | 组件 | 说明 | | --- | --- | --- | | 接入层 | SDK | 客户端 SDK | | 服务层 | Core | 核心功能实现 | | 数据层 | Storage | 数据持久化 | ### 3.3 服务注册与发现 ### 服务注册流程 ```mermaid sequenceDiagram participant App as 应用启动 participant Nacos as Nacos Server participant DB as 数据存储 App->>Nacos: 发起服务注册 Nacos->>DB: 保存服务实例信息 DB-->>Nacos: 保存成功 Nacos-->>App: 返回注册成功 loop 心跳检测 App->>Nacos: 发送心跳(5秒间隔) Nacos-->>App: 心跳响应 end Note over Nacos,DB: 超过15秒未收到心跳<br/>实例不健康 Note over Nacos,DB: 超过30秒未收到心跳<br/>实例被剔除 ``` **服务注册关键参数:** | 参数 | 说明 | 默认值 | | --- | --- | --- | | 服务名 | 服务标识 | spring.application.name | | IP | 实例 IP | 自动获取 | | 端口 | 实例端口 | server.port | | 健康检查 | 健康检查 URL | /actuator/health | | 命名空间 | 环境隔离 | public | | 分组 | 服务分组 | DEFAULT_GROUP | ### 服务发现示例 ```java @RestController @RequestMapping("/order") public class OrderController { @Autowired private DiscoveryClient discoveryClient; @Autowired private LoadBalancerClient loadBalancerClient; /** * 获取所有服务列表 */ @GetMapping("/services") public List<String> getServices() { return discoveryClient.getServices(); } /** * 获取指定服务的实例 */ @GetMapping("/instances/{serviceName}") public List<ServiceInstance> getInstances(@PathVariable String serviceName) { return discoveryClient.getInstances(serviceName); } /** * 使用负载均衡器获取服务地址 */ @GetMapping("/stock-url") public String getStockUrl() { ServiceInstance instance = loadBalancerClient.choose("stock-service"); return instance.getHost() + ":" + instance.getPort(); } } ``` ### 3.4 配置中心 ### 配置中心特性 | 特性 | 说明 | | --- | --- | | 热更新 | 配置变更实时推送 | | 版本管理 | 配置版本历史记录 | | 灰度发布 | 按比例发布配置 | | 配置监听 | 支持配置变更监听 | | 配置加密 | 敏感配置加密存储 | ### 配置中心使用示例 ```java @RestController @RefreshScope // 支持配置动态刷新 public class ConfigController { @Value("${order.timeout:3000}") private Integer timeout; @Value("${order.maxRetry:3}") private Integer maxRetry; @Autowired private ConfigurableApplicationContext applicationContext; @GetMapping("/config") public Map<String, Object> getConfig() { Map<String, Object> config = new HashMap<>(); config.put("timeout", timeout); config.put("maxRetry", maxRetry); config.put("environment", applicationContext.getEnvironment()); return config; } } ``` ### 3.5 Nacos 配置 ```yaml spring: application: name: order-service cloud: nacos: server-addr: 127.0.0.1:8848 discovery: namespace: dev group: DEFAULT_GROUP enabled:true # 心跳配置 heart-beat-interval:5000 # 心跳间隔 heart-beat-timeout:15000 # 心跳超时 ip-delete-timeout:30000 # 实例删除超时 config: namespace: dev group: DEFAULT_GROUP file-extension: yaml # 配置刷新 refresh-enabled:true # 共享配置 shared-configs: -dataId: common.yaml group: DEFAULT_GROUP refresh:true ``` ### 3.6 命名空间和分组 **命名空间:** 用于隔离不同环境或租户的配置和服务。 | 类型 | 说明 | 适用场景 | | --- | --- | --- | | public | 默认命名空间 | 开发测试 | | 自定义 | 自定义命名空间 | 生产环境隔离 | **分组:** 在命名空间下进一步分组,通常用于区分不同业务线或应用组。 ``` dev 命名空间 ├── DEFAULT_GROUP ├── ORDER_GROUP └── USER_GROUP ``` ---
Spring Cloud和SpringBoot版本对应关系
Spring Cloud 和 Spring Boot 的版本对应关系非常重要,因为它们之间存在依赖关系。以下是一些常见的 Spring Cloud 和 Spring Boot 版本的对应关系: Spring Cloud 2020.0.0 (Ilford) Spring Boot: 2.4.x Spring Cloud 2021.0.0 (Sao Paulo) Spring Boot: 2.5.x Spring Cloud 2022.0.0 (Gateway) Spring Boot: 2.6.x Spring Cloud Hoxton Spring Boot: 2.2.x, 2.3.x Spring Cloud Greenwich Spring Boot: 2.1.x Spring Cloud Finchley Spring Boot: 2.0.x Spring Cloud Edgware Spring Boot: 1.5.x Spring Cloud Dalston Spring Boot: 1.5.x Spring Cloud Camden Spring Boot: 1.4.x Spring Cloud Brixton Spring Boot: 1.3.x 注意事项 兼容性:确保你使用的 Spring Cloud 版本与 Spring Boot 版本兼容,否则可能会遇到各种依赖问题。 更新频率:Spring Cloud 和 Spring Boot 都有较高的更新频率,建议定期检查官方文档以获取最新的版本信息。 官方文档:官方文档是获取版本对应关系的最佳来源,可以参考 Spring Cloud 官方文档 和 Spring Boot 官方文档。
Spring Cloud + Nacos + Dubbo 整合失败
### Bug 描述 Spring Cloud + Nacos + Dubbo 启动错误; 我自己来看,nacos配置中心的配置是读取到了,但是不知道是我配置的问题还是什么,dubbo启动失败 ### 环境 <img src="https://pic.code-nav.cn/post_picture/1667372122378350594/DsktMj4v-image.png" alt="image.png" width="100%" /> <img src="https://pic.code-nav.cn/post_picture/1667372122378350594/0VklQiLc-image.webp" alt="image.png" width="100%" /> ### 期望结果 启动 provider 及 consumer 并完成调用 ### 错误信息 部分错误信息,网上找了没找到解决方案 ``` 2024-08-02T22:12:28.816+08:00 INFO 13492 --- [provider] [ main] org.apache.dubbo.config.ServiceConfig : [DUBBO] Register dubbo service cn.cutepikachu.demo.ExampleService url dubbo://26.26.26.1:20880/cn.cutepikachu.demo.ExampleService?anyhost=true&application=provider&background=false&bind.ip=26.26.26.1&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=cn.cutepikachu.demo.ExampleService&methods=sayHello&pid=13492&prefer.serialization=fastjson2,hessian2&release=3.2.14&service-name-mapping=true&side=provider×tamp=1722607948062 to registry 127.0.0.1:8848, dubbo version: 3.2.14, current host: 26.26.26.1 2024-08-02T22:12:28.817+08:00 ERROR 13492 --- [provider] [ main] o.a.d.c.deploy.DefaultModuleDeployer : [DUBBO] Model start failed: Dubbo Module[1.1.1] start failed: java.lang.IllegalStateException: No such extension org.apache.dubbo.registry.RegistryFactory by name dubbo, no related exception was found, please check whether related SPI module is missing., dubbo version: 3.2.14, current host: 26.26.26.1, error code: 5-14. This may be caused by , go to https://dubbo.apache.org/faq/5/14 to find instructions. java.lang.IllegalStateException: No such extension org.apache.dubbo.registry.RegistryFactory by name dubbo, no related exception was found, please check whether related SPI module is missing. 2024-08-02T22:12:28.821+08:00 WARN 13492 --- [provider] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: java.lang.IllegalStateException: No such extension org.apache.dubbo.registry.RegistryFactory by name dubbo, no related exception was found, please check whether related SPI module is missing. ``` ### 自己的思路和解决方案 详细列举自己的思路、排查过程,以及尝试过的所有解决方法。 比如是否搜索过?搜索的关键词是什么?阅读过哪些文档? ### 相关资料 Interface 模块 ```java public interface ExampleService { String sayHello(String name); } ``` Provider 模块 ```yml # bootstrap.yml server: port: 6001 spring: application: name: @artifactId@ cloud: nacos: config: server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_PORT:8848} file-extension: yml namespace: @nacos.namespace@ shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} username: nacos password: nacos discovery: server-addr: ${spring.cloud.nacos.config.server-addr} username: ${spring.cloud.nacos.config.username} password: ${spring.cloud.nacos.config.password} profiles: active: @profiles.active@ ``` ```java @DubboService public class ExampleServiceImpl implements ExampleService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` ```java @EnableDubbo @EnableDiscoveryClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } ``` Consumer 模块 ```yml # bootstrap.yml server: port: 6002 spring: application: name: @artifactId@ cloud: nacos: config: server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_PORT:8848} file-extension: yml namespace: @nacos.namespace@ shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} username: nacos password: nacos discovery: server-addr: ${spring.cloud.nacos.config.server-addr} username: ${spring.cloud.nacos.config.username} password: ${spring.cloud.nacos.config.password} profiles: active: @profiles.active@ ``` ```java @RestController("/example") public class ExampleController { @DubboReference private ExampleService exampleService; @GetMapping("/hello") public String hello(@RequestParam String name) { return exampleService.sayHello(name); } } ``` ```java @EnableDubbo @EnableDiscoveryClient @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } ``` nacos 配置中心远程配置 <img src="https://pic.code-nav.cn/post_picture/1667372122378350594/GGr8VX2z-image.png" alt="image.png" width="100%" /> ```yml spring: profiles: active: dev dubbo: protocol: name: dubbo port: -1 registry: address: ${spring.cloud.nacos.config.server-addr} # username: ${spring.cloud.nacos.config.username} # password: ${spring.cloud.nacos.config.password} ```
Hystrix的Unable to connect to command Metric Stream问题
Hystrix配置正确,但是监控服务器,出现访问监视页面报 Unable to connect to command Metric Stream .但是直接访问监视端口,发现有数据?
