ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Spring Cloud Alibaba 全家桶实战:Nacos + Sentinel + Seata 微服务治理配置骨架与验证

Spring Cloud Alibaba 全家桶实战:Nacos + Sentinel + Seata 微服务治理配置骨架与验证 1. 为什么你的微服务总在“治理”这一步翻车Spring Cloud Alibaba 全家桶实战说白了就是把 Nacos、Sentinel、Seata 这三件套串成一条能跑通的治理链路。Nacos 负责服务注册发现和配置中心Sentinel 负责流控降级熔断Seata 负责分布式事务一致性。适合谁适合已经写过几个 Spring Boot 服务、但一上微服务就被 IP 硬编码、配置改一次重启一圈、流量一冲就雪崩、跨服务下单数据对不上这些问题折磨过的后端同学。我自己第一次搭这套的时候踩的坑不是组件不会用而是“各自都能跑合起来就报错”。Nacos 注册上了但配置不生效Sentinel 规则重启就丢Seata 的 tx-service-group 和 Nacos 里的映射对不上启动直接No provider available。所以这篇不打算把每个组件从零讲一遍而是给一套可复制的配置骨架让你一次性把治理链路跑通再告诉你每一步验证什么、错了去哪查。整条链路的目标很明确服务启动后自动注册到 Nacos配置从 Nacos 拉取且支持动态刷新Sentinel 规则持久化到 Nacos 而不是内存Seata 用 Nacos 做注册和配置中心最后所有请求经过 Gateway 统一入口。下面按这个顺序来。2. TaoToken 前置统一 Key 与 API 通道怎么接在写业务配置之前先把模型调用这条线理清楚。微服务里经常会有一些 AI 能力比如订单备注智能分类、客服工单摘要如果每个服务各自维护一套 Key 和调用地址后面换模型、限流、对账都会很乱。我的做法是统一走一个 API 通道所有服务共用一套 Key。TaoToken 这边你需要先拿到 API Key。进入控制台后创建密钥地址是 https://taotoken.net/api-keys 创建完复制保存后面配置里会用到。如果你还没注册从官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进去注册即可。拿到 Key 之后接入地址统一用 https://taotoken.net/api 不要带任何多余路径。我习惯把它写进 Nacos 的公共配置里这样所有服务共享一份改一次全生效。下面这段就是放到 Nacos 配置中心的公共片段Data ID 用common-ai.propertiesGroup 用DEFAULT_GROUPai.base-urlhttps://taotoken.net/api ai.api-keysk-你的实际Key ai.modelclaude-sonnet-4-20250514 ai.timeout30000然后在业务服务的bootstrap.yml里引入这个公共配置spring: application: name: order-service cloud: nacos: config: server-addr: localhost:8848 file-extension: properties shared-configs: ->docker run -d \ --name nacos \ -p 8848:8848 -p 9848:9848 \ -e MODEstandalone \ -e NACOS_AUTH_ENABLEtrue \ nacos/nacos-server:v2.3.0访问 http://localhost:8848/nacos 默认账号密码都是 nacos。注意 9848 端口是 gRPC 端口2.x 版本必须映射否则客户端连不上。服务注册的依赖和配置dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId version2022.0.0.0/version /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId version2022.0.0.0/version /dependencyapplication.yml里注册和配置分开写spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 namespace: public config: server-addr: localhost:8848 file-extension: yaml refresh-enabled: true启动类加EnableDiscoveryClient配置类加RefreshScope才能动态刷新。这里有个坑RefreshScope加在 Controller 上Value注入的字段才会跟着 Nacos 改。如果加在 Service 上但字段是构造器注入的刷新不生效。3.2 Sentinel 流控降级与规则持久化Sentinel 默认规则存内存重启就丢这是生产环境大忌。正确做法是把规则持久化到 Nacos。依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency dependency groupIdcom.alibaba.csp/groupId artifactIdsentinel-datasource-nacos/artifactId /dependency配置里绑定 Nacos 数据源spring: cloud: sentinel: transport: dashboard: localhost:8088 port: 8719 datasource: flow: nacos: server-addr: localhost:8848 >[ { resource: createOrder, limitApp: default, grade: 1, count: 100, strategy: 0, controlBehavior: 0 } ]grade为 1 表示 QPS 限流count是阈值。降级规则类似grade为 0 表示慢调用比例为 1 表示异常比例。这样规则改完 Nacos 里一保存Sentinel 客户端秒级生效不用重启。3.3 Seata 分布式事务接入Seata 的配置最容易出错的是tx-service-group和vgroup-mapping的对应关系。依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-seata/artifactId /dependencyapplication.ymlseata: enabled: true application-id: ${spring.application.name} tx-service-group: my_test_tx_group service: vgroup-mapping: my_test_tx_group: default registry: type: nacos nacos: server-addr: localhost:8848 application: seata-server group: SEATA_GROUP config: type: nacos nacos: server-addr: localhost:8848 group: SEATA_GROUP业务方法上加GlobalTransactionalService public class OrderService { GlobalTransactional(name place-order, rollbackFor Exception.class) public void placeOrder() { orderMapper.insert(); inventoryClient.decrease(); accountClient.debit(); } }vgroup-mapping里的default必须和 Seata Server 注册到 Nacos 时的集群名一致否则就是No provider available。Seata Server 启动时用-e SEATA_IP你的IP指定注册地址别让它自动猜。4. 启动验证怎么确认治理链路真的通了配置写完不算完得一步步验证。我按顺序列出来你照着做。第一步看 Nacos 服务列表。启动 order-service 后进 Nacos 控制台 → 服务管理 → 服务列表应该能看到order-service实例数是 1健康状态为 true。如果看不到检查server-addr和 namespace 是否一致。第二步验证配置动态刷新。在 Nacos 里改order-service.yaml的某个值比如order.timeout8000然后调接口curl http://localhost:8081/timeout返回 8000 就说明刷新生效。如果还是旧值检查RefreshScope有没有加以及refresh-enabled是否为 true。第三步验证 Sentinel 规则。用压测工具打createOrder接口超过 QPS 阈值后应该返回 blockHandler 里的提示。同时 Sentinel Dashboard 的实时监控里能看到 QPS 曲线。如果规则没生效去 Nacos 看order-service-flow-rules的 JSON 格式对不对resource名和SentinelResource的 value 必须完全一致。第四步验证 Seata 事务。故意让accountClient.debit()抛异常看订单表有没有回滚。如果订单插入了但没回滚检查GlobalTransactional是否加在入口方法上以及 Seata Server 的日志里有没有收到全局事务开启记录。第五步验证模型通道。写个简单的调用测试curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:claude-sonnet-4-20250514,messages:[{role:user,content:ping}]}返回正常内容说明通道没问题。如果 401检查 Key 是否复制完整如果超时检查网络和ai.timeout配置。5. 本篇常见错排查报错一Nacos 配置不生效Data ID 写错。默认规则是${spring.application.name}.${file-extension}比如order-service.yaml。如果你自定义了nameData ID 就变成自定义名.yaml。排查时先去 Nacos 配置列表确认 Data ID 拼写。报错二Sentinel 规则重启丢失。说明还在用内存存储。检查spring.cloud.sentinel.datasource是否配置了 nacos以及rule-type是否写对flow/degrade/param-flow 等。报错三Seata 启动报No provider available。九成是tx-service-group和vgroup-mapping不匹配或者 Seata Server 没注册到 Nacos。去 Nacos 服务列表搜seata-server看它在哪个 group然后让registry.nacos.group和它一致。报错四Gateway 路由 404。如果用了lb://order-service必须加spring-cloud-starter-loadbalancer依赖否则负载均衡不生效路由找不到实例。报错五模型调用 401 或 403。检查 Key 是否带了多余空格以及ai.base-url是否写成了https://taotoken.net/api/带尾斜杠。尾斜杠会导致路径拼接错误。报错六动态刷新不生效。除了RefreshScope还要确认 Nacos 配置的refresh属性。如果是shared-configs要显式写refresh: true。6. 把治理链路和模型通道串起来到这里Nacos 管注册配置、Sentinel 管流控降级、Seata 管分布式事务、TaoToken 管模型通道四条线各自跑通并且能互相配合。我的经验是先把 Nacos 单独跑通再加 Sentinel最后加 Seata每加一个就验证一次别一次性全堆上去不然报错都不知道是谁的锅。如果你在接入过程中卡在 Key 或者通道配置上直接去 API Keys 页面重新生成一个对比测试地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有各语言的调用示例。想先验证模型通不通可以用模型对话页面直接试地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。长期做编码和 Agent 的话Coding Plan 更合适地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后留一个我踩过的坑Seata 的GlobalTransactional方法里如果调用了异步线程事务上下文不会自动传递需要手动处理。这个在订单库存账户这种链路里特别容易忽略回滚会失效。
返回列表