Java 微服务架构:从单体到分布式的演进之路
Java 微服务架构从单体到分布式的演进之路先讲个故事为什么要拆分系统想象你开了一家餐厅最开始只有一个厨师负责洗菜、切菜、炒菜、装盘、收银、打扫——一个人包揽所有事情。生意不错时这个厨师忙不过来你有两个选择克隆厨师再雇一个全能厨师两人干一模一样的活传统的scale up专业分工雇一个专门切菜的一个专门炒菜的一个专门收银的各司其职微服务架构就是第二种思路。把一个庞大的系统拆成多个小服务每个服务只做一件事独立部署、独立扩展。在 Java 开发中这个转变尤其明显因为传统 Java 企业应用最爱造巨无霸——一个 war 包动辄几百 MB启动要几分钟改一行代码要重新部署整个应用。微服务就是来解决这些痛点的。什么是微服务架构定义微服务架构Microservices Architecture是一种将单一应用程序拆分为一组小型服务的架构风格每个服务独立进程运行在自己的进程中通常是独立的 JVM独立部署可以单独发布、升级、回滚单一职责只负责一个业务领域如用户管理、订单处理轻量通信通过 HTTP REST、gRPC、消息队列等方式互相调用去中心化每个服务可以用不同的技术栈、数据库对比单体架构 vs 微服务架构维度单体架构微服务架构部署单位一个 war/jar 包多个独立服务技术栈统一如全是 Spring MVC可混合订单用 Java推荐用 Python扩展方式整体复制按需扩展单个服务故障影响一处崩溃全局瘫痪故障隔离开发团队全员改同一个代码库按服务分团队上线速度改一行代码要部署全量只部署改动的服务Java 微服务技术栈全景图Java 生态的微服务工具链已经非常成熟这里按职责分类1. 服务框架写服务的基础Spring Boot是事实标准提供开箱即用的配置SpringBootApplicationRestControllerpublicclassOrderServiceApplication{GetMapping(/orders/{id})publicOrdergetOrder(PathVariableLongid){// 查询订单逻辑returnorderRepository.findById(id);}publicstaticvoidmain(String[]args){SpringApplication.run(OrderServiceApplication.class,args);}}一个最小的微服务只需要这几行代码。spring-boot-starter-web自动配置了 Tomcat、Jackson、日志等。Quarkus和Micronaut是新生代框架启动速度更快、内存占用更小适合云原生和 Serverless。2. 服务注册与发现微服务之间要互相调用但 IP 地址是动态的容器环境下每次重启 IP 都变。需要一个电话簿让服务找到彼此。常用方案EurekaNetflix 开源Spring Cloud 默认ConsulHashiCorp 出品支持健康检查Nacos阿里巴巴国内用得多// 服务提供者把自己注册到 EurekaEnableEurekaClientSpringBootApplicationpublicclassUserService{}// 服务消费者通过服务名调用不用写死 IPAutowiredprivateRestTemplaterestTemplate;publicOrdergetOrder(Longid){// order-service 是注册的服务名Eureka 自动解析成 IPreturnrestTemplate.getForObject(http://order-service/orders/id,Order.class);}3. 负载均衡当order-service部署了 5 个实例时如何分配流量Ribbon客户端负载均衡已经进入维护模式现在推荐Spring Cloud LoadBalancerSpring Cloud 新默认Kubernetes Service容器环境下用 K8s 原生能力BeanLoadBalanced// 这一行启用负载均衡publicRestTemplaterestTemplate(){returnnewRestTemplate();}4. 服务网关API Gateway用户不应该直接访问几十个微服务的地址需要一个统一入口处理路由/api/users/*转发到 user-service鉴权检查 JWT token限流防止某个服务被打垮跨域处理浏览器 CORS 请求常用网关Spring Cloud GatewayWebFlux 异步性能好Zuul1.x 是 Servlet 同步2.x 异步但项目停滞Kong基于 Nginx可用 Lua 插件SpringBootApplicationpublicclassGatewayApplication{BeanpublicRouteLocatorroutes(RouteLocatorBuilderbuilder){returnbuilder.routes().route(user-service,r-r.path(/api/users/**).filters(f-f.stripPrefix(1))// 去掉 /api 前缀.uri(lb://user-service))// lb 表示负载均衡.build();}}5. 配置中心微服务数量多了配置文件散落在各处很难管理。需要集中存储、动态刷新。方案Spring Cloud Config基于 Git 仓库Apollo携程开源UI 友好Nacos既做注册中心又做配置中心# application.yml 指向配置中心spring:cloud:config:uri:http://config-server:8888name:order-serviceprofile:prod改配置后不用重启服务发个刷新请求即可RefreshScope// 支持动态刷新RestControllerpublicclassOrderController{Value(${order.max-items})privateintmaxItems;// 这个值会自动更新}6. 熔断与限流防止雪崩场景订单服务调用库存服务库存服务挂了订单服务的线程全部阻塞等待最后自己也挂了——这叫雪崩效应。解决方案熔断器Circuit Breaker检测到下游故障时快速失败返回降级结果不再傻等限流超过阈值直接拒绝请求Resilience4j是目前主流选择Hystrix 已停更RestControllerpublicclassOrderController{GetMapping(/orders/{id})CircuitBreaker(nameinventory,fallbackMethodgetOrderFallback)publicOrdergetOrder(PathVariableLongid){// 调用库存服务InventoryinvinventoryClient.getInventory(id);returnbuildOrder(inv);}// 降级方法库存服务挂了时返回缓存数据publicOrdergetOrderFallback(Longid,Exceptione){returnOrder.builder().id(id).status(库存服务暂时不可用请稍后再试).build();}}7. 链路追踪排查问题一个用户请求可能经过 10 个微服务如何知道是哪一环出了问题分布式追踪系统给每个请求分配一个Trace ID在各服务间传递用户请求 [trace-id: abc123] → Gateway [耗时 5ms] → User Service [耗时 20ms] → Order Service [耗时 200ms] ← 发现瓶颈在这 → DB 查询 [耗时 180ms]常用工具Spring Cloud Sleuth自动注入 Trace IDZipkin可视化追踪链路JaegerUber 开源CNCF 项目SkyWalking国产支持中文功能全面配置非常简单dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-sleuth/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-sleuth-zipkin/artifactId/dependency日志自动带上 Trace ID2024-01-15 10:23:45 [order-service,abc123,def456] INFO 查询订单 #123458. 消息队列异步解耦不是所有调用都要同步等待结果比如下单后发邮件// 同步调用用户等邮件发完才能看到下单成功慢orderService.createOrder(order);emailService.sendConfirmation(order);// 如果邮件服务挂了订单也创建不了returnsuccess;// 异步消息订单创建完就返回邮件慢慢发快且解耦orderService.createOrder(order);messageQueue.send(order-created,order);// 发到队列就不管了returnsuccess;Java 常用消息队列RabbitMQErlang 实现支持复杂路由Kafka高吞吐适合日志、大数据场景RocketMQ阿里开源支持事务消息Spring Boot 集成示例ComponentpublicclassOrderEventPublisher{AutowiredprivateRabbitTemplaterabbitTemplate;publicvoidpublishOrderCreated(Orderorder){rabbitTemplate.convertAndSend(order.exchange,order.created,order);}}ComponentpublicclassEmailListener{RabbitListener(queuesemail.queue)publicvoidhandleOrderCreated(Orderorder){// 发邮件emailService.send(order.getUserEmail(),订单已创建);}}9. 分布式事务经典难题用户下单时要同时扣减库存、扣减余额、创建订单记录这三个操作分别在三个微服务里。如何保证要么全成功要么全失败方案对比方案一致性性能复杂度适用场景2PC/XA强一致差阻塞低金融核心系统TCC强一致好高要写 Try/Confirm/Cancel对账系统Saga最终一致好中写补偿逻辑电商订单本地消息表最终一致好低通用Seata是阿里开源的分布式事务框架支持多种模式GlobalTransactional// 开启分布式事务publicvoidcreateOrder(Orderorder){// 1. 创建订单orderRepository.save(order);// 2. 扣减库存调用库存服务inventoryService.deduct(order.getProductId(),order.getQuantity());// 3. 扣减余额调用账户服务accountService.deduct(order.getUserId(),order.getAmount());// 如果任意一步失败Seata 自动回滚所有操作}一个完整的电商微服务架构示例用户请求 ↓ ┌──────────────────┐ │ Spring Cloud │ │ Gateway │ 统一网关路由、鉴权、限流 └──────────────────┘ ↓ ┌─────────────────┼─────────────────┐ ↓ ↓ ↓ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ User │ │ Order │ │ Product │ 业务服务 │ Service │ │ Service │ │ Service │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └────────┬────────┴────────┬────────┘ ↓ ↓ ┌────────────┐ ┌────────────┐ │ Eureka │ │ RabbitMQ │ 基础设施 │ (注册中心) │ │ (消息队列) │ └────────────┘ └────────────┘ ↓ ┌────────────┐ │ Zipkin │ 监控追踪 └────────────┘技术选型网关Spring Cloud Gateway注册中心Eureka Server配置中心Spring Cloud Config熔断Resilience4j追踪Sleuth Zipkin消息RabbitMQ数据库每个服务独立 MySQL用户库、订单库、商品库项目结构ecommerce-microservices/ ├── gateway/ # 网关服务 ├── eureka-server/ # 注册中心 ├── config-server/ # 配置中心 ├── user-service/ # 用户服务 │ ├── src/main/java/ │ ├── pom.xml │ └── application.yml ├── order-service/ # 订单服务 ├── product-service/ # 商品服务 └── common/ # 公共依赖DTO、工具类微服务的代价与挑战微服务不是银弹拆分后会带来新的复杂度1. 分布式系统的固有问题网络不可靠服务间调用可能超时、丢包部分失败A 服务成功了B 服务失败了数据不一致时钟不同步各服务器时间可能有偏差2. 运维复杂度暴增部署从部署 1 个应用变成部署 20 个服务监控要盯着 20 个服务的 CPU、内存、日志排查故障一个请求跨 10 个服务定位问题像查案解决方案上容器化Docker 编排平台Kubernetes 可观测性日志、指标、追踪3. 数据一致性单体应用用数据库事务保证一致性微服务拆分后每个服务独立数据库强一致性很难做到只能接受最终一致性。4. 接口变更的连锁反应用户服务改了接口订单服务、商品服务都要跟着改。需要严格的接口版本管理和契约测试。什么时候该用微服务不要为了微服务而微服务。以下情况考虑拆分✅团队规模大了超过 20 人单体代码库合并冲突频繁✅业务复杂了不同模块发版频率差异大核心交易每周发版推荐算法每天发版✅性能瓶颈明确只有个别模块需要扩容不想为了扩展搜索功能就复制整个应用✅技术栈需要异构主系统 Java推荐引擎 Python实时计算 Scala❌不该用的场景创业公司初期团队 10 人业务不稳定需求天天变团队没有分布式系统经验运维能力跟不上连 Docker 都没用过建议先做好单体架构的模块化按业务领域拆包接口清晰需要时再平滑演进到微服务。Martin Fowler 说得好“Monolith First”——除非你有充分理由否则先从单体开始。快速上手用 Spring Cloud 搭建第一个微服务1. 创建注册中心Eureka Server!-- pom.xml --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependencyEnableEurekaServerSpringBootApplicationpublicclassEurekaServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EurekaServerApplication.class,args);}}# application.ymlserver:port:8761eureka:client:register-with-eureka:false# 自己不注册fetch-registry:false访问http://localhost:8761看到 Eureka 控制台。2. 创建服务提供者User ServicedependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependencyRestControllerSpringBootApplicationpublicclassUserServiceApplication{GetMapping(/users/{id})publicUsergetUser(PathVariableLongid){returnnewUser(id,张三,zhangsanexample.com);}publicstaticvoidmain(String[]args){SpringApplication.run(UserServiceApplication.class,args);}}spring:application:name:user-serviceeureka:client:service-url:defaultZone:http://localhost:8761/eureka/server:port:80813. 创建服务消费者Order ServiceRestControllerSpringBootApplicationpublicclassOrderServiceApplication{BeanLoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}AutowiredprivateRestTemplaterestTemplate;GetMapping(/orders/{id})publicStringgetOrder(PathVariableLongid){// 通过服务名调用 user-serviceUseruserrestTemplate.getForObject(http://user-service/users/1,User.class);return订单 #id 属于用户user.getName();}publicstaticvoidmain(String[]args){SpringApplication.run(OrderServiceApplication.class,args);}}启动三个服务访问http://localhost:8082/orders/123看到跨服务调用成功。未来趋势云原生与 Service MeshKubernetes 成为新基础设施传统微服务用 Eureka 做注册中心现在越来越多公司直接用Kubernetes服务发现K8s Service 自动负载均衡配置管理ConfigMap / Secret扩缩容HPA根据 CPU 自动扩容Java 应用只需要做成 Docker 镜像其他交给 K8s。Service Mesh服务网格问题微服务框架的治理逻辑负载均衡、熔断、追踪都耦合在业务代码里换个语言要重新实现一遍。Service Mesh把这些逻辑下沉到基础设施层每个服务旁边部署一个Sidecar 代理如 Envoy流量都经过代理处理Order Service → Envoy (sidecar) → 网络 → Envoy (sidecar) → User ServiceIstio是最流行的 Service Mesh业务代码完全不用管治理逻辑# 用配置文件定义熔断规则不写 Java 代码apiVersion:networking.istio.io/v1kind:DestinationRulemetadata:name:user-servicespec:host:user-servicetrafficPolicy:connectionPool:tcp:maxConnections:100outlierDetection:consecutive5xxErrors:5interval:30s总结微服务架构是一种组织策略不仅仅是技术选型。它让大团队能并行开发、快速迭代代价是分布式系统的复杂性。Java 生态的微服务工具链已经非常成熟Spring Cloud提供全家桶式解决方案KubernetesIstio代表云原生方向国产方案Dubbo、Nacos、Seata在国内企业广泛使用给新手的建议先学好 Spring Boot 单体应用理解分布式系统的 CAP 理论、BASE 理论用 Docker Compose 在本地跑一套完整的微服务环境读 Martin Fowler 的《Microservices》原文到中大型公司实习看真实的微服务是怎么治理的不要盲目追新合适的架构取决于你的团队规模、业务复杂度和技术储备。很多时候一个设计良好的单体应用比拆得乱七八糟的微服务要健康得多。后记2026年8月10日于上海在claude opus 4.8辅助下完成。

相关新闻

从“量程够用”到系统误差:新能源电流传感器怎么选?

从“量程够用”到系统误差:新能源电流传感器怎么选?

以前选一颗电流传感器,工程师通常先看三个参数:量程够不够、精度是多少、封装能不能装下。只要这几个条件满足,基本就可以进入选型表。但现在,这套方法正在变得不够用了。储能PCS的电流越来越大,光伏逆变器和充电设备的…

2026/8/11 8:23:57 阅读更多 →
Python自动化实战:2026年我仍在用的那些项目与场景

Python自动化实战:2026年我仍在用的那些项目与场景

写在前面搞Python自动化这些年,我有一个感受:工具不在多,在于你真正用过、踩过坑、还愿意继续用的。网上不缺"Python自动化十大库"这类清单文,但大多数读完就忘——因为它们只告诉你"有什么",不告…

2026/8/11 8:22:57 阅读更多 →
NCMconverter:解锁加密音乐的万能钥匙,让音乐跨越格式障碍自由播放

NCMconverter:解锁加密音乐的万能钥匙,让音乐跨越格式障碍自由播放

NCMconverter:解锁加密音乐的万能钥匙,让音乐跨越格式障碍自由播放 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 你是否曾经遇到过这样的烦恼&#xff…

2026/8/11 8:22:57 阅读更多 →

最新新闻

Script编译器深度剖析:从源代码到生成JS的完整过程

Script编译器深度剖析:从源代码到生成JS的完整过程

Script#编译器深度剖析:从源代码到生成JS的完整过程 【免费下载链接】scriptsharp Script# Project - a C# to JavaScript compiler, to power your HTML5 and Node.js web development. 项目地址: https://gitcode.com/gh_mirrors/sc/scriptsharp Script#是…

2026/8/11 17:05:37 阅读更多 →
android多进程问题-信鸽-GooglePlay(firebase)

android多进程问题-信鸽-GooglePlay(firebase)

当多进程process运行时,会重新走一遍Application的onCreate()方法,此时要加上判断主进程,不然会重新初始化一遍val processName getProcessName(this, android.os.Process.myPid()); if (processName ! null) {val de…

2026/8/11 17:05:37 阅读更多 →
金额小数点保留两位,并对小数位进行四舍五入

金额小数点保留两位,并对小数位进行四舍五入

通常我们对于小数位的数据进行保留两位,都是使用.toFixed(2),但是实际上会存在精度问题,例如:587.545, toFixed之后的结果是587.54而不是我们想要的587.55,所以为了精度准确,用了以下方法处理&a…

2026/8/11 17:05:37 阅读更多 →
DevOps必备:Awesome MinIO与CI/CD工具集成的5个实用技巧

DevOps必备:Awesome MinIO与CI/CD工具集成的5个实用技巧

DevOps必备:Awesome MinIO与CI/CD工具集成的5个实用技巧 【免费下载链接】awesome-minio A curated list of Awesome MinIO community projects. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-minio MinIO作为一款高性能的对象存储服务,…

2026/8/11 17:05:37 阅读更多 →
生成式AI工业质检:产线在线质检新范式

生成式AI工业质检:产线在线质检新范式

制造业传统质检长期存在两大痛点:人工肉眼检测漏检误判多、海量图片视频靠人工填写报告效率极低。生成式AI的落地,不只是单纯增加图像识别能力,而是打通“产线采集—缺陷识别—智能报告—持续迭代”全链路,形成标准化质检数字化闭…

2026/8/11 17:05:37 阅读更多 →
渗透测试必备!ThunderSearch多引擎联动技巧,3步定位目标资产

渗透测试必备!ThunderSearch多引擎联动技巧,3步定位目标资产

渗透测试必备!ThunderSearch多引擎联动技巧,3步定位目标资产 【免费下载链接】ThunderSearch macOS上的小而美【Fofa、Shodan、Hunter、Zoomeye、Quake网络空间搜索引擎】闪电搜索器;GUI图形化(Mac/Windows)渗透测试信息搜集工具;…

2026/8/11 17:04:37 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →