拆分微服务遇到的那些坑——黑马微服务作业

在完成黑马微服务作业拆分的过程中遇到了不少的坑,总结我们解决策略:

一. 拆分用户微服务模块

配置类未被Spring扫描到

解决措施

  • 在JwtProperties配置类中添加 @Component注解,注册成组件
  • 或者在启动类中添加@EnableConfigurationProperties(JwtProperties.class)注解
    • 虽然Spring Boot通常会自动扫描并注册带有@ConfigurationProperties注解的类,但如果您在一个非标准的包中放置了JwtProperties,或者由于某种原因Spring Boot没有自动检测到它,您可能需要在配置类上显式启用它。

二、拆分交易微服务模块

导类准则问题——冲突则以顶层api模块为准

我们基本上所有涉及到跨微服务的模块都会继承 hm-api模块。但是会出现这样一种问题:交易模块中导入了一个DTO对象,同时这个对象也被hm-api中相关的方法所导入了。这就导致冲突产生。具体的看下面的描述:

在交易微服务模块中

引入了OrderDetaDTO相关类

在实现类中导包导的是本微服务模块下的包

### 黑马商城微服务架构实现源码分析 #### 微服务架构的选择 在构建微服务架构时,技术栈的选择至关重要。如果公司采用多样化的技术栈并倾向于Spring家族,则Spring Cloud成为首选方案[^1]。Spring Cloud提供了一整套工具用于构建分布式系统,支持HTTP协议的服务间通信。 #### 使用Dubbo Spring Cloud扩展功能 为了增强Spring Cloud的功能,可以引入Dubbo Spring Cloud组件。该组件继承了Dubbo Spring Boot的外部化配置特性,并允许开发者通过`@DubboComponentScan`注解完成基准包扫描操作[^2]。这使得开发人员能够更加灵活地管理依赖和服务注册发现机制。 #### 单体应用向微服务转型案例——黑马商城 作为教学材料之一,“黑马商城”是一个典型的单体结构电子商务平台,在课程设计中被用来展示如何逐步将其重构为基于微服务的设计模式[^3]。以下是关于其具体实现的一些要点: 1. **项目初始化**: 初始版本通常以传统的三层架构形式存在(控制器层、业务逻辑层和数据访问层),所有模块紧密耦合在一起。 2. **拆分服务边界**: 随着需求增长和技术复杂度提升,原有单一应用程序难以满足高效运维的要求。此时需要重新审视各个子系统的职责范围并将它们分离出来形成独立部署单元。 3. **集成网关与负载均衡器**: 当多个小型服务上线运行之后,客户端请求可能面临路由混乱等问题;为此需设置统一入口API Gateway负责转发流量至对应后端实例上。同时借助Nginx或者Zuul等中间件实施动态分配策略提高整体性能表现。 4. **数据库迁移规划**: 对于共享型存储资源而言,直接沿用旧有表结构可能会带来一致性风险。所以建议针对不同领域模型创建专属Schema甚至完全隔离物理位置上的文件副本。 5. **监控报警体系完善**: 考虑到分布式的特殊性质容易引发连锁反应事故隐患,故而有必要建立健全日志记录设施以及实时告警推送渠道以便快速定位异常状况源头所在之处。 6. **代码片段示例** 下面给出一段简单的Java程序说明如何利用Feign Client发起远程调用: ```java // 定义接口声明目标地址路径参数等内容 @FeignClient(name="product-service", url="${service.url.product}") public interface ProductApi { @RequestMapping(method=RequestMethod.GET, value="/products/{id}") public ResponseEntity<Product> getProductById(@PathVariable("id") Long id); } // 控制类内部方法调用上述定义好的代理对象获取商品详情信息 @RestController @RequestMapping("/orders") public class OrderController { private final ProductApi productApi; public OrderController(ProductApi productApi){ this.productApi = productApi; } @GetMapping("/{orderId}/details") public String getOrderDetails(@PathVariable long orderId){ Optional<OrderEntity> orderOpt = repository.findById(orderId); if (orderOpt.isPresent()) { List<Long> productIdList = extractProductIdsFromOrder(orderOpt.get()); StringBuilder sb = new StringBuilder(); for(Long pid : productIdList){ try{ Response<Product> resp = productApi.getProductById(pid).execute(); sb.append(resp.body().getName()).append(","); }catch(Exception e){ log.error("Failed to fetch product info.",e); } } return sb.toString(); }else{ throw new ResourceNotFoundException("No such order."); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值