穿越微服务迷雾:揭秘一次微服务设计实战

你每天都在用Docker,但你可能从未听说过它的“秘密武器”:Moby Moby 项目,作为 Docker 引擎的基石和整个容器生态系统的“积木工厂”,其重要性不言而喻。它将复杂的容器技术解耦为一系列独立的、可组装的组件,为我们提供了前所未有的灵活性和控制力。通过本文的深入探索,我们不仅揭开了 Docker 引擎的神秘面纱,更详细剖析了runccontainerdBuildKitNotary等核心组件的工作原理与实践意义。我们看到了如何手动操作底层运行时,如何利用新一代构建工具提升效率,以及如何通过内容信任增强容器安全。 阅读详情

前言

最近学校课程要求做一个简单的微服务系统,正好借此机会拆解一下微服务系统的架构设计。

系统要求如下:

该基础业务平台应包含以下功能:

  1. 基于RBAC的系统权限管理功能,支持用户、角色和权限的可配置功能。在此基础上,实现基本的用户登录、注册等用户管理方面的功能。
  2. 提供统一的系统安全、缓存、日志、异常处理等功能接口。
  3. 提供统一的后台管理功能,可以对系统中的数据表进行后台管理。
  4. 在基础框架上,设计一个简单的业务场景(应至少涉及两个不同的角色、两个不同的业务部门),实现基本的业务功能。

平台的非功能方面的要求:

  1. 采用微服务架构:提供统一的服务网关、服务注册发现和服务间通信接口以及其他的服务管理方案。
  2. 采用前后端完全分离的架构。
  3. 兼容性要求:支持主流的浏览器,包括Chrome、Edge、Firefox和Safari。
  4. 安全性要求:系统达到等级保护二级要求,能够通过相应的安全性测试。
  5. 性能要求:系统应支持100并发,给出相应的测试结果。

单体架构

我们都知道单体项目的主流架构是分层架构,大概分为controller、service、dao、entity等层级,每个板块下可能会有多个业务类。但是单体项目中一个项目只有一个模块,所有的“包”都直接放在这个大模块中即可。

  • Controller层:
    • 作用: 负责接收用户的请求,调用相应的业务逻辑处理,并返回结果给用户。
    • 实现: 包含处理HTTP请求的逻辑,解析请求参数,调用Service层的业务逻辑,最后将结果返回给用户。
  • Service层:
    • 作用: 执行业务逻辑,处理业务规则和流程,对数据进行处理和组织。
    • 实现: 包含具体的业务逻辑,调用Dao层进行数据的读写,确保业务的正确执行。
  • Dao(Data Access Object)层:
    • 作用: 负责与数据库进行交互,执行数据的持久化操作。
    • 实现: 包含数据库操作的具体实现,例如SQL语句的增删改查等。
  • Entity层:
    • 作用: 表示业务领域中的实体,通常与数据库中的表结构相关。
    • 实现: 包含数据的定义,通常是一个与数据库表结构对应的Java类,类中的属性对应表中的字段。

首先我们来看看该项目的单体架构图,每层中的user、auth、business1、business2都是业务类

单体架构

分模块+分层架构

然而该项目要求用微服务架构,微服务项目中通常需要按业务拆分出多个模块,那么项目架构是怎样的呢?

所以首先我们需要将该项目按业务分模块,那么就变为了分模块+分层架构。在微服务中还有两个要求:

  • gateway作为服务网关统一管理请求
  • 每个服务需要能调用其他服务模块,所以每个服务模块中还需要加上client这一层
  • 每个服务需要能提供服务模块给其他模块调用,所以每个服务模块中还需要加上api这一层
api层、client层、controller层各代表什么意思?
  • **api层:**提供给内部服务调用的一系列接口,属于被调用者
  • **client层:**主要负责发送HTTP请求需要调用的模块,可以理解为一个发送HTTP请求的封装层,属于调用者
  • **controller层:**提供给外部服务调用的一系 列接口,属于被调用者
api层与controller层的异同
  • **相同点:**都是提供HTTP接口给外部服务调用
  • **不同点:**controller层提供给外部服务(例如前端调用),而api层提供给内部服务调用,比如架构图中的其他服务
关系还是有点乱的,直接一图解千愁吧!

client调用图

那么据此得来的架构图如下

分模块架构

这样是否就可行了呢?能用但问题大了,强烈不推荐:

极度高耦合:(1)A、B服务调用C服务时都需要写相同的client层(假设叫Cclient类),那么Cclient类需要复制两份分别在A、B服务中。(2)且Cclient类的方法返回值一定是C服务中的实体类(例如C服务是User服务那么可能是UserDO的数据库实体类),那么还需要将涉及到的所有实体类一并复制两份给A、B服务。

好家伙,一旦Capi相关的实体类有任何改动,那么Capi需要更改,调用C服务的Cclient代码中相关的实体类自然也全都需要修改,简直是灾难啊!

如何解决?
  1. 首先解决Cclient类需要复制两份的问题

    一个经典解法就是抽取模块,功能复用。将client层的代码给抽取出来写一个统一的HTTP请求服务工具,那么client层的代码就只需要引入工具调用即可,实现功能复用。不过还好,这个问题@FeignClient注解帮我们完成了,详情看这篇文章《Java远程调用神器:@FeignClient揭秘,轻松搞定微服务通信!》

  2. 然后解决实体类需要复制两份的问题

    其实从这篇文章《Java远程调用神器:@FeignClient揭秘,轻松搞定微服务通信!》中已经可以看出解决方法了,聪明如你,应该发现了client和api两个类几乎代码都一样。所以我们就可以想方法复用,将client继承api,然后client加上了@FeignClient注解即可,这就引出了微服务架构了

微服务架构

经过上面的分析,我们将上面提到的api以及相应的实体类抽取出来形成单独的模块,作为interface模块,那么另一个对应的就是service模块,即每一个业务对应的服务模块再分成interface和service模块,架构图及依赖关系如下

在这里插入图片描述

依赖关系使用Maven即可实现

	<!-- cloud-user-service的pom依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.cloud.auth</groupId>
            <artifactId>cloud-auth-interface</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        ......
        <dependency>
            <groupId>com.cloud.common</groupId>
            <artifactId>cloud-common-web</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

结束了吗?到这里系统基本可用,没有大问题,但还是不太推荐,因为实体类全部放到interface模块中不太优雅。

在《阿里巴巴Java开发手册》中写到,实体类还分为DO、DTO、VO等等类型。

  • **DO:**与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。

  • **DTO:**数据传输对象,Service 或 Manager 向外传输的对象。

  • **VO:**显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

《阿里巴巴Java开发手册》可在公众号免费获取资源

一般常用到上面三种领域模型,这三种领域模型全放到interface模块中合适吗?

答案显然是否定的,DO类是与数据库一一映射的,只有dao层才会请求数据库返回DO类对象。而interface模块的目的是暴露出api给其他服务调用,那么api层更应该返回一个DTO对象而不会返回DO对象。那么也就是说interface模块一定不会需要用到DO类,于是我们得出结论:DO类应该在service模块中,而除了DO类的其他领域对象留在interface模块中,于是我们终于得到最终的架构图了!

在这里插入图片描述

如果您觉得该文章有用,欢迎点赞、留言并分享给更多人。感谢您的支持!

从零构建AI数字人:揭秘交互式智能体工程化实战 在人工智能和交互式内容领域,智能体(AI Agent)与数字人技术正成为连接虚拟与现实的关键桥梁。其核心原理在于构建一个由感知输入、决策引擎、输出执行、上下文管理及通信编排组成的模块化系统架构。这种架构的价值在于将前沿的AI能力工程化为稳定、可扩展的应用,从而在虚拟客服、游戏NPC、交互式艺术装置等场景中实现自然、连贯的人机对话。本文以Python和FastAPI为核心技术栈,通过WebSocket实现实时通信,并集成大语言模型(LLM)或规则引擎作为决策大脑,手把手演示如何搭建一个具备完整“感知-决策-输 阅读详情

相关推荐

verilog常用模块1——按键消抖模块详解

按键消抖模块key_filter 1. 原理介绍 如图,按键未按下时keys信号为高电平,按下则为低电平;通过检测keys信号电平,就可以判断按键状态。 但反作用弹簧会导致抖动现象,电平信号出现一段不确定波形 一般情况下,抖动的电平信号为1的持续时间不会超过20ms,只要通过对抖动波形的发生时长计时(计数),当为1的时长超过20ms,则可判定 进入了发生了按键按下/释放动作,并确定按键状态...

coin的博客 1万+

APS .Net MVC 之APIController与Controller的区别

APIController Controller 开发模式 WebAPI MVC 命名空间 System.Web.Http System.Web.Mvc 返回方式 json/text或者xml/text html/text action的默认请求方式 post post与get 路由的映射格式 api/{controlName}/ {controlName}/{actionName} APIController...

乌里随记的博客 1782

Tessent实战:网表扫描链插入全流程解析

本文详细解析了使用Tessent工具为网表插入扫描链(Scan Chain)的全流程。从前期环境配置、网表检查,到扫描链数量、时钟域等核心配置,再到执行扫描单元替换与连接,最后进行结果验证与文件输出。文章提供了关键命令与实用技巧,帮助工程师高效完成DFT设计,确保芯片可测试性。

hhh00的博客 747

SpringBoot-11:买家订单---Controller层与API的实现

Controller层的实现 Controller层主要实现四个方法: 创建订单,订单列表,订单详情,查询订单 @Slf4j @RestController @RequestMapping("/buyer/order") public class BuyerOrderController { @Autowired private OrderService orderService...

你今天真好看呀 2448

RADIOML 2018.01A调制信号数据集介绍及处理

RadioML 2018.01A 由 DeepSig 发布,是专门针对自动调制识别(Automatic Modulation Recognition, AMR)和无线信号分类研究设计的基准数据集。它在原有 RadioML 2016.10a 的基础上,扩展并精细化了信道仿真模型,使得信号更接近真实无线环境下的表现。该数据集广泛用于机器学习模型的训练与评估,为各类深度学习算法提供了统一、可重复的实验条件。

weixin_56527269的博客 1896

Pyside6实战:3种.ui文件加载方式对比(附完整代码示例)

本文深入解析Pyside6中3种.ui文件加载方式的优劣与性能优化策略,包括动态加载QUiLoader、预编译方案及混合策略。通过实测数据和完整代码示例,帮助开发者根据项目需求选择最优解,提升界面加载效率与内存管理。

weixin_30897233的博客 90

构建强大的RESTful API:@RestController与@Controller的对比与应用

构建强大的RESTful API:@RestController与@Controller的对比与应用

todoitbo的博客 1万+

基于MATLAB的语音声强度和响度分析及处理

综上所述,本文介绍了如何使用MATLAB进行语音信号的声强度和响度分析,并提供了相应的源代码。通过这些工具和方法,可以更好地理解和处理语音信号的声强度和响度特性,为语音信号处理和音频应用提供支持。声强度(Intensity)和响度(Loudness)是语音信号中常用的两个重要参数,用于描述声音的强度和感知响度。响度均衡化:可以通过对语音信号施加不同的加权滤波器,调整信号的频谱分布,从而改变声音的响度。除了分析语音信号的声强度和响度,MATLAB还提供了丰富的工具和函数,用于处理语音信号的声强度和响度。

COWizard的博客 617

从零开始构建operator(二)添加API和controller

添加新API和controller 说明 这里需要说明一下,新API和controller之间的关系,本质上说他们没有直接关系。 CRD 在kubernetes中添加新API的方法叫CRD(另外一种叫做聚合层,不是本文关注的重点,感兴趣的同学可以自行参考官网),是一种在不改变原有API Server接口的情况动态扩展API方法。在本文档中如无特殊说明扩展API等同于CRD。每个CRD对应着一种资源类型,用户创建了新的CRD之后,就可以通过新的API创建该CRD描述的资源,比如名称为ZnbaseCluster

fayeestone的博客 1192

uniapp - 实现免费OCR文字识别方案,用户上传图片后进行扫描识别获取图片上的文字,uniApp纯前端做图片OCR识别——无需服务器进行OCR识别插件(不需要依赖任何SDK或第三方API服务)

uniapp实现orc识别免费的插件识别不花钱,无需第三方OCR文字识别API,uniApp拍照或者选择图片免费识别,纯前端不需要服务器,Uniapp提取图片上的文字,本地ocr识别技术,uni-app图片OCR识别文本,uniapp有没有免费的ocr识别组件,uniapp前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)跨端无SDK方案:Uniapp实现OCR文字,离线OCR识别,uniapp tesseract.js实现文字识别,uniapp文字识别无需依赖sdk

🏆 前端领域优质创作者 4251

Python爬虫实战:模拟登录知乎 – 通过加密参数和验证码实现自动登录

通过本篇博客的讲解,我们学习了如何通过 POST请求 和 验证码识别,模拟登录知乎并爬取用户信息、问题数据。随着爬虫技术的发展,面对更复杂的反爬虫机制,我们可以不断调整策略,以绕过这些防护,实现数据的自动化抓取。

2201_76125261的博客 731

RESTful API

SpringBoot实现restful API Controller的请求和URL的重构 Controller的响应重构 前后端分离后的用户认证和鉴权 Restful API请求设计规范(最佳实践) URI使用名词,尽量使用复数,如/order URI使用嵌套表示关联关系,如/users/1/orders/3 使用正确的HTTP方法,如GET、POST、PUT、PATCH、DELETE等 不符合CRUD的方法,使用POST+动词、查询字符串中带action字段或设计子资源三种方式中某种形式 Cont

ningmeng666_c的博客 287

C# 实现 Modbus 通信全教程(支持 TCP 和 RTU,含完整错误处理)

环境准备:安装 NModbus4 库,明确设备参数(IP/串口、地址、数据类型);连接设备:TCP 用 TcpClient,RTU 用 SerialPort,注意超时和参数匹配;读写数据:根据数据类型调用对应方法(读保持寄存器用 ReadHoldingRegisters);错误处理:捕获连接、超时、协议等异常,针对性排查问题。掌握这些后,即可轻松实现与工业设备的 Modbus 通信,为上位机开发提供稳定的数据交互能力。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2068

【2026硬核安全】万字深潜:从协议底层到AI驱动,重构防火墙与IDS/IPS防御体系

提取TLS Client Hello中的SSL Version、Accepted Ciphers、Extensions List、Elliptic Curves、EC Point Formats,拼接后计算MD5哈希。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 350

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

书单&读书计划

2022年读书计划 SQL基础教程 SQL进阶教程 Spring实战(第5版)[Spring In Action] SpringBoot实战[Spring Boot in Action] Spring微服务实战[Spring Microservices in Action] Effective Java(第3版) 图解Java多线程设计模式 深入理解Java虚拟机(第3版) 计算机 正则表达式必知必会(修订版) 深入理解计算机系统(原书第2版) 计算机程序的构造和解释(原书第2版) 现代操作系统(原书

寒矛博客 462

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

2020Java个人学习计划+书籍

2020Java个人学习计划+书籍前言JavaLinux1. Mybatis2. Java WEB3. Spring4. Spring Boot5. 计算机基础6.分布式系统7. 数据结构和算法8.Sql9. Redis10.Maven11. Git12. 程序员个人修养总结 前言 为什么要写这个blog?这个blog相当于一个学习计划,制定定好学习计划和学习方法能够有一个更好的指导作用;为什么要读书呢?首先书籍的系统性和条理性都是比较完整的,相对于视频而言也不需要花费那么多的时间,你需要提升自己必须通过阅

非著名JAVA程序员的博客 1136

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

API 在微服务架构中的作用

API 在微服务架构中的作用;这里要记住的一个关键因素是,组织采用微服务的主要原因是它们在开发、测试、部署和扩展应用程序方面提供的敏捷性。这种情况不是将所有 API 的运行时托管在单个整体网关上,而是要求能够在单个微网关上部署每个单独的 API 或较小的 API 子集。例如,对产品目录执行读取的操作和执行更新的操作可以开发为单独的微服务,以满足不同的可伸缩性需求。轻松扩展以满足不断增长的需求的能力是微网关的一个至关重要的因素。

寒水馨 · 轻量级技术文档 · hanshuixin.org 785

万万没想到,Java开发 API 接口可以不用写 Controller了!

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 606

微服务间接口调用 feign

微服务间接口调用 feign

zlfjavahome的专栏 1495

API-标准controller接口

JSON 请求更适合现代系统,特别是前后端分离、结构化参数复杂的接口场景。

ChengHuanHuaning的博客 701

ASP.NET MVC中ApiController与Controller的区别

I've been playing around with ASP.NET MVC 4 beta and I see two types of controllers now: ApiControl

p15097962069的博客 4711

微服务环境搭建

微服务环境搭建,微服务之间采用Restful等轻量级http协议相互调用,订单微服务调用商品的微服务以及用户的微服务(跨项目调用功能)微服务架构是由单个单个的SpringBoot项目组合而成的,所有需要锁定版本依赖,微服务调用,

oyang的博客 1246

权限基本操作:api介绍和基本service与controller

package com.learn.system.controller; import com.learn.common.entity.PageResult; import com.learn.common.entity.Result; import com.learn.common.entity.ResultCode; import com.learn.domain.system.Permi...

Leon_Jinhai_Sun的博客 580

【六袆-SpringBoot】对SpringBoot中的API(Controller层)进行单元测试

你将收获:对API进行单元测试 1.Controller中的方法 /** * 查询全部列表 * @return */ @GetMapping(value = "/girls") public List<Girl> girlList() { logger.info("girlList"); System.out.println("gilrList..."); return ...

六祎的博客 1143

asp.net mvc 中的 controller和asp.net web api 的apicontroller有什么区别?(转)

本质上区别不大,一个返回html/text类型的response,一个返回json/text或者xml/text类型的response,对于api环境而言,apicontroller更智能一点,他可以根据request的类型来自动返回json或者xml两种数据结构,并且提供了model自动序列化的功能。你要用普通controller强行返回json格式的响应,也是可以的,但真的不如apicontr...

weixin_30873847的博客 910
上一篇: 靠着这个Java路线,我大二就去了大厂
下一篇: 面试官再提到synchronized时,用这篇文章彻底征服他!
荼锦AI编程
博客等级 码龄7年 198粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值