微服务拆分的通用原则
-
闭包原则(CCP): 当改变一个微服务时,所有依赖这个微服务的组件的其他服务,都不需要修改。
-
服务自治、接口隔离:尽量消除对其他服务的依赖。
-
持续演进:一边做产品功能迭代,一边完成服务拆分。
-
服务接口的定义要具备可扩展性:比如定义接口参数,最好将参数封装成类。
-
避免环形依赖与双向依赖:这种情况说明功能边界没有划分清楚, 或者通用的能力没有下沉。
-
阶段性合并:
-
自动化驱动:部署和运维成本会随着服务的增多呈现指数级增长,应该构建自动化的工具及环境,管理服务的部署、监控、日志分析等运维工作
微服务拆分策略
功能维度拆分
大的原则是基于业务复杂度拆分服务:
- 业务复杂度足够高,应该基于领域驱动拆分服务
- 业务复杂度较低,选择基于数据驱动拆分服务
-
基于领域驱动拆分服务: 自上而下的架构设计方法,通过和领域专家建立统一的语言,不断交流,确定关键业务场景,逐步确定边界上下文。
-
基于数据驱动拆分服务: 自下而上的架构设计方法,通过分析需求,确定整体数据结构,根据表之间的关系拆分服务。
非功能维度拆分
主要考虑六点包括扩展性、复用性、高性能、高可用、安全性、异构性。
- 扩展性:将不变的部分拆分出来,作为共用的服务,将变的部分独立出来满足个性化扩展需要
- 复用性:不同的业务里或服务里经常会出现重复的功能,拆成独立的服务。
- 高性能:将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其它服务
- 高可用:将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用
- 安全性:把需要高度安全的服务拆分出来,进行区别部署
- 异构性:以用不同的语言将其功能独立出来实现一个独立服务
微服务架构技术栈选型
Spring Cloud Alibaba 官网:Spring AI Alibaba 官网_快速构建 JAVA AI 应用
SpringCloud 的几大痛点:
- SpringCloud 部分组件停止维护和更新,给开发带来不便;
- SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
- SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba 的优势:
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用成套的产品搭配完善的可视化界面给开发运维带来极大的便利搭建简单,学习曲线低。
所以优先考虑 Spring Cloud Alibaba 提供的微服务组件。
服务注册发现(Nacos注册中心)

注册过程:
-
引入nacos注册中心依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> -
配置注册中心地址
spring:
application:
name: mall-order #微服务名
cloud:
nacos:
discovery:
server-addr: 192.168.65.103:8848 #注册中心地址
namespace: 6cd8d896-4d19-4e33-9840-26e4bee9a618 #环境隔离
服务配置(Nacos配置中心)
配置用心用于配置的统一管理。
配置可以分为单个微服务独立的配置(比如数据库配置)、通用配置(比如Redis配置)

-
引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> -
bootstrap.yml(指定这个名字)中添加配置中心的配置信息



profiles.active : dev表示是dev环境生效
file-extension:yml 表示是yml后缀名字, 会去配置中心找tulingmall-member-dev.yml文件,替换本地的配置文件。
shared-config: 是通用配置,表示这个微服务也去加载这些配置。
微服务间的调用(openfeign)
使用openfeign作为服务间的调用组件。
-
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> -
编写调用接口 + @FeignClient注解, 指定要调用的微服务和接口
java
@FeignClient(value = "tulingmall-coupons" , path ="/coupon")
public interface CouponsFeignService {
@RequestMapping(value ="/list" , method = RequestMethod.GET)
@ResponseBody
CommonResult<List<SmsCouponHistory>> list(
@RequestParam(value ="useStatus", required=false) Integer useStatus,
@RequestHeader("memberId") Long memberId);
}
- 启动类添加@EnableFeignClients 注解,开启 openFeign 远程调用功能
java
@SpringBootApplication
@EnableFeignClients
public class TulingmallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(TulingmallMemberApplication.class, args);
}
}
- 开启openfeign日志配置
java
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
如果日志不显示,可以在 yml 中通过 logging.level 设置日志级别
java
logging:
level:
com.test: debug
网关服务
- 引入网关依赖
java
<!-- 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
服务发现:网关服务需要发现下游服务
- 配置文件

gateway.routes.id : 下游微服务的id
gateway.routes.uri : lb表示负载均衡器
- gateway配置 移植到配置中心,添加bootstrap.yml:

