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

电商项目_微服务_架构

微服务拆分的通用原则

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.dtcms.com/a/342771.html

相关文章:

  • Shader开发(十六)UV 坐标介绍
  • 【python】windows下使用pyenv+uv进行python版本及环境变量管理
  • K 均值聚类(K-Means)演示,通过生成笑脸和爱心两种形状的模拟数据,展示了无监督学习中聚类算法的效果。以下是详细讲解:
  • 微服务02-Spring Cloud入门:构建微服务生态系统
  • 灵活使用UE5 Modeling中的UV编辑功能
  • RabbitMQ死信队列、延时队列分别是什么
  • 常德二院全栈国产化信创项目:开启医疗新质生产力的“头雁”之旅
  • 【STM32】HAL库中的实现(九):SPI(串行外设接口)
  • 如何在阿里云OSS之间进行数据迁移呢?
  • Pytorch安装详细步骤
  • Navicat16.3.9 连接 MongoDB 数据库异常及解决
  • 【CSP初赛】程序阅读15
  • 【C++】类和对象——默认成员函数(中)(附思维导图)
  • 算力魔方迷你主机的“八爪鱼”模式
  • 扣子Coze教程:自动化拆解小红书对标账号,输出完整分析报告(附MCP配置)
  • 亚马逊意大利保证金新政深度解析:合规挑战与跨境运营策略重构
  • MySql 特殊函数
  • Redisson相关知识
  • 数据结构青铜到王者第一话---数据结构基本常识(1)
  • 零基础从头教学Linux(Day 17)
  • 在职老D渗透日记day23:sqli-labs靶场通关(第29关-31关)http参数过滤
  • [软件开发技术栈]从MVVM到MVC
  • 大模型提示词工程背后的原理:深入理解Prompt Learning(提示学习)
  • 【Dify(v1.x) 核心源码深入解析】prompt 模块
  • 单智能体篇:Prompt工程艺术
  • 【运维进阶】Shell 函数的知识与实践
  • CTFSHOW | 其他篇题解(一)web396-web416
  • 学习日志39 python
  • 华为iVS1800接入SVMSPro平台
  • Web3 的发展挑战:技术、监管与生态的多重困境