黑马商城项目—SpringCloud微服务架构实战—从零搭建到功能落地的全流程解析

张开发
2026/4/19 19:30:30 15 分钟阅读

分享文章

黑马商城项目—SpringCloud微服务架构实战—从零搭建到功能落地的全流程解析
1. 从零认识SpringCloud微服务架构第一次接触SpringCloud微服务时我完全被各种组件名词搞晕了。Nacos、OpenFeign、Gateway...这些到底是什么直到真正用它们完成了黑马商城项目才恍然大悟原来微服务架构就像乐高积木每个组件各司其职组合起来却能构建出强大的电商系统。单体架构的痛点在开发黑马商城初期体现得特别明显。当商品搜索接口被大量请求时整个系统的响应速度都会变慢连用户登录功能都受影响。这就像早高峰的地铁站一个闸机故障会导致所有人滞留。而微服务架构将系统拆分为商品服务、购物车服务、订单服务等独立模块某个服务出现性能问题不会波及其他服务。SpringCloud的核心组件构成了一套完整的微服务解决方案Nacos相当于微服务的电话簿记录所有服务的联系方式OpenFeign服务间的快递员负责传递请求和数据Gateway系统的门卫统一处理所有进出请求Config配置管理员集中管理所有服务的设置2. 项目环境搭建与微服务拆分2.1 开发环境准备搭建开发环境就像准备厨房工具齐全才能做出好菜。我推荐使用以下配置JDK 11兼容性最好IntelliJ IDEA社区版就够用Docker运行MySQL和NacosPostman接口测试# 启动MySQL容器 docker run -d \ --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ mysql:5.72.2 微服务拆分实战拆分黑马商城时我踩过最大的坑就是服务边界划分不清。后来总结出几个原则按业务功能拆分比如用户服务、商品服务、订单服务数据库隔离每个服务使用独立数据库API明确定义服务间调用接口要清晰以商品服务为例创建hm-item模块时需要注意在pom.xml中只保留商品相关依赖application.yml配置独立端口(如8081)和数据库(hm-item)将商品相关的Controller、Service、Mapper完整迁移// 商品服务启动类示例 SpringBootApplication MapperScan(com.hmall.item.mapper) public class ItemApplication { public static void main(String[] args) { SpringApplication.run(ItemApplication.class, args); } }3. 服务注册与发现机制3.1 Nacos注册中心部署Nacos的安装比想象中简单用Docker一条命令就能搞定docker run -d \ --name nacos \ -p 8848:8848 \ -e MODEstandalone \ nacos/nacos-server:2.0.3启动后访问http://localhost:8848/nacos使用默认账号nacos/nacos登录。这里有个小技巧在测试环境可以开启临时实例模式服务下线会自动注销避免脏数据。3.2 服务注册与调用服务注册就像公司入职要在HR系统登记信息。在商品服务的application.yml中添加spring: cloud: nacos: discovery: server-addr: localhost:8848当启动多个商品服务实例时如8081和8083端口Nacos会自动进行负载均衡。我测试时发现一个有趣现象如果某个实例响应变慢Nacos会逐渐减少向其转发请求这比硬编码的负载均衡灵活多了。4. OpenFeign远程调用优化4.1 基础使用与问题最初我用RestTemplate实现服务调用代码像这样// 老式调用方式 ListItemDTO items restTemplate.exchange( http://item-service/items?ids{ids}, HttpMethod.GET, null, new ParameterizedTypeReferenceListItemDTO(){}, CollUtil.join(itemIds, ,) ).getBody();这种写法有三大痛点URL硬编码难以维护参数拼接容易出错响应处理繁琐4.2 Feign最佳实践改用OpenFeign后代码简洁得像本地调用// 在api模块定义接口 FeignClient(item-service) public interface ItemClient { GetMapping(/items/{id}) ItemDTO getItemById(PathVariable(id) Long id); } // 业务代码直接使用 RequiredArgsConstructor Service public class CartServiceImpl implements ICartService { private final ItemClient itemClient; public CartVO queryCart() { ItemDTO item itemClient.getItemById(itemId); // ... } }性能优化技巧启用OKHttp连接池feign: okhttp: enabled: true配置合理的超时时间启用GZIP压缩减小传输体积5. 网关统一入口设计5.1 网关基础配置网关就像公司的前台所有访客都要先登记。黑马商城的网关配置如下spring: cloud: gateway: routes: - id: item-service uri: lb://item-service predicates: - Path/items/**我特别喜欢Gateway的过滤器机制比如添加统一请求头default-filters: - AddRequestHeaderTruth, gateway-request5.2 登录校验实现JWT校验是网关的核心功能之一。我的实现方案定义GlobalFilter检查Authorization头使用AntPathMatcher匹配白名单路径校验通过后将用户ID存入请求头public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 1. 获取请求路径 String path exchange.getRequest().getPath().toString(); // 2. 白名单放行 if (pathMatcher.match(/login, path)) { return chain.filter(exchange); } // 3. 校验Token String token exchange.getRequest().getHeaders().getFirst(Authorization); Long userId jwtTool.parseToken(token); // 4. 传递用户信息 ServerHttpRequest request exchange.getRequest().mutate() .header(user-info, userId.toString()) .build(); return chain.filter(exchange.mutate().request(request).build()); }6. 配置中心实战技巧6.1 共享配置管理把重复配置提取到Nacos后各服务的application.yml清爽多了。我的共享配置包含数据库连接池参数MyBatis-Plus配置日志级别设置Swagger文档配置bootstrap.yml的配置很关键spring: application: name: cart-service profiles: active: local cloud: nacos: config: server-addr: localhost:8848 file-extension: yaml shared-configs: ->hm: cart: max-items: 10Java代码使用ConfigurationPropertiesData ConfigurationProperties(prefix hm.cart) public class CartProperties { private Integer maxItems; }业务代码直接注入使用if (cartItems.size() cartProperties.getMaxItems()) { throw new BadRequestException(购物车已满); }修改Nacos配置后控制台会打印类似日志Refresh keys changed: [hm.cart.max-items]7. 项目部署与排错经验7.1 多环境部署我总结的部署 checklist确保Nacos集群模式运行网关配置动态路由各服务开启健康检查配置合理的JVM参数动态路由配置示例{ routes: [{ id: item-route, predicates: [{ name: Path, args: {_genkey_0:/items/**} }], uri: lb://item-service }] }7.2 常见问题解决问题1Feign调用返回404检查FeignClient的name与服务名一致确认接口路径与生产者一致查看Nacos服务列表是否健康问题2配置不生效检查bootstrap.yml的active profile确认Nacos配置的Data ID格式正确查看日志是否有配置加载记录问题3网关跨域问题spring: cloud: gateway: globalcors: cors-configurations: [/**]: allowedOrigins: * allowedMethods: - GET - POST经过完整的黑马商城项目实战最大的体会是微服务架构就像城市规划既要模块清晰又要互联互通。当看到各个服务完美协作订单从创建到支付流畅完成时那种成就感是单体架构无法比拟的。

更多文章