当前位置: 首页 > ds >正文

电商项目_微服务_架构

微服务拆分的通用原则

1. 闭包原则(CCP): 当改变一个微服务时,所有依赖这个微服务的组件的其他服务,都不需要修改。

2. 服务自治、接口隔离:尽量消除对其他服务的依赖。

3. 持续演进:一边做产品功能迭代,一边完成服务拆分。

4. 服务接口的定义要具备可扩展性:比如定义接口参数,最好将参数封装成类。

5. 避免环形依赖与双向依赖:这种情况说明功能边界没有划分清楚, 或者通用的能力没有下沉。

6. 阶段性合并:

7. 自动化驱动:部署和运维成本会随着服务的增多呈现指数级增长,应该构建自动化的工具及环境,管理服务的部署、监控、日志分析等运维工作

微服务拆分策略

功能维度拆分

大的原则是基于业务复杂度拆分服务:

  • 业务复杂度足够高,应该基于领域驱动拆分服务
  • 业务复杂度较低,选择基于数据驱动拆分服务

1. 基于领域驱动拆分服务: 自上而下的架构设计方法,通过和领域专家建立统一的语言,不断交流,确定关键业务场景,逐步确定边界上下文。

2. 基于数据驱动拆分服务: 自下而上的架构设计方法,通过分析需求,确定整体数据结构,根据表之间的关系拆分服务。

非功能维度拆分

主要考虑六点包括扩展性、复用性、高性能、高可用、安全性、异构性。

  • 扩展性:将不变的部分拆分出来,作为共用的服务,将变的部分独立出来满足个性化扩展需要
  • 复用性:不同的业务里或服务里经常会出现重复的功能,拆成独立的服务。
  • 高性能:将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其它服务
  • 高可用:将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用
  • 安全性:把需要高度安全的服务拆分出来,进行区别部署
  • 异构性:以用不同的语言将其功能独立出来实现一个独立服务

微服务架构技术栈选型

Spring Cloud Alibaba 官网:Spring AI Alibaba 官网_快速构建 JAVA AI 应用

SpringCloud 的几大痛点:

  • SpringCloud 部分组件停止维护和更新,给开发带来不便;
  • SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
  • SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用

SpringCloud Alibaba 的优势:

        阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用成套的产品搭配完善的可视化界面给开发运维带来极大的便利搭建简单,学习曲线低。

        所以优先考虑 Spring Cloud Alibaba 提供的微服务组件。

服务注册发现(Nacos注册中心)

注册过程:

1. 引入nacos注册中心依赖

<!--nacos 注册中心-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 配置注册中心地址

spring:application:name: mall-order #微服务名cloud:nacos:discovery:server-addr: 192.168.65.103:8848 #注册中心地址namespace: 6cd8d896-4d19-4e33-9840-26e4bee9a618 #环境隔离

服务配置(Nacos配置中心)

配置用心用于配置的统一管理。

配置可以分为单个微服务独立的配置(比如数据库配置)、通用配置(比如Redis配置)

1. 引入依赖

<!-- nacos 配置中心-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2. bootstrap.yml(指定这个名字)中添加配置中心的配置信息

profiles.active :  dev表示是dev环境生效

file-extension:yml  表示是yml后缀名字, 会去配置中心找tulingmall-member-dev.yml文件,替换本地的配置文件

shared-config: 是通用配置,表示这个微服务也去加载这些配置。

微服务间的调用(openfeign)

使用openfeign作为服务间的调用组件。

1. 引入依赖

<!-- 服务远程调用-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. 编写调用接口 + @FeignClient注解, 指定要调用的微服务和接口

 @FeignClient(value = "tulingmall-coupons" , path ="/coupon")public interface CouponsFeignService {@RequestMapping(value ="/list" , method = RequestMethod.GET)@ResponseBodyCommonResult<List<SmsCouponHistory>> list(@RequestParam(value ="useStatus", required=false) Integer useStatus, @RequestHeader("memberId") Long memberId);}

3. 启动类添加@EnableFeignClients 注解,开启 openFeign 远程调用功能

@SpringBootApplication
@EnableFeignClients
public class TulingmallMemberApplication {public static void main(String[] args) {SpringApplication.run(TulingmallMemberApplication.class, args);}
}

4. 开启openfeign日志配置

@Configuration
public class FeignConfig {@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

如果日志不显示,可以在 yml 中通过 logging.level 设置日志级别

logging:level:com.test: debug

网关服务

1. 引入网关依赖

<!-- gateway 网关-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- nacos 服务注册与发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置中心-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

注意:会和 spring-webmvc 的依赖冲突,需要排除 spring-webmvc

服务发现:网关服务需要发现下游服务

2. 配置文件

gateway.routes.id : 下游微服务的id

gateway.routes.uri : lb表示负载均衡器

3. gateway配置 移植到配置中心,添加bootstrap.yml:

http://www.xdnf.cn/news/18533.html

相关文章:

  • 2025年国内AI大模型现状浅析
  • Shell 脚本条件测试
  • 一款更适合 SpringBoot 的API文档新选择(Spring Boot 应用 API 文档)
  • Rancher 管理的 K8S 集群中部署常见应用(MySQL、Redis、RabbitMQ)并支持扩缩容的操作
  • SpringBoot4发布!新特性解析
  • 2025.8.21总结
  • 【Bug】CentOS 7 使用vim命令报错vim: command not found
  • 37、需求预测与库存优化 (快消品) - /供应链管理组件/fmcg-inventory-optimization
  • AP状态管理中提到的两种“业务逻辑”
  • Java实现一个简单的LRU缓存对象
  • 50 C++ STL模板库-算法库 algorithm
  • python的校园研招网系统
  • RHCA10NUMA
  • Pytorch框架学习
  • Git 新手完全指南(一):从零开始掌握版本控制
  • 59. 螺旋矩阵 II|从“左闭右开”的圈层模拟入手(附图解与 C++ 实现)
  • 在 Linux 和 Docker 中部署 MinIO 对象存储
  • 使用Spring Retry组件优雅地实现重试
  • 【Python】利用heapq 模块实现一个按优先级排序的队列
  • 数字化图书管理系统设计实践(java)
  • CorrectNav——基于VLM构建带“自我纠正飞轮”的VLN:通过「视觉输入和语言指令」预测导航动作,且从动作和感知层面生成自我修正数据
  • 学习嵌入式的第二十二天——数据结构——双向链表
  • 永磁同步电机谐波抑制算法(13)——传统预测控制与传统谐波抑制的碰撞
  • week2-[二维数组]排队
  • MySQL 50 道经典练习题及答案
  • Java毕业设计选题推荐 |基于SpringBoot+Vue的知识产权管理系统设计与实现
  • Effective C++ 条款52:写了placement new也要写placement delete
  • ES常用查询命令
  • SQL详细语法教程(七)核心优化
  • ubuntu系统上的conda虚拟环境导出方便下次安装