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

《微服务架构设计模式》第一章

逃离单体地狱

FTGO单体架构

​​​​​​​作者用国外FTGO公司(一家做线餐饮外卖)的应用程序举例,阐述了单体架构的优缺点。FTGO应用架构如下:在这里插入图片描述

应用程序是单体应用,具有六边形架构,最内侧是业务逻辑,包含订单管理、配送管理、用户管理等。业务逻辑外边是实现用户界面的适配器和与外部系统对接的适配器。外部系统如:消息服务、邮件服务、支付服务、数据库。通过这些适配器,业务逻辑可以访问数据库,调用外部服务。

单体架构的好处

  1. 应用开发简单:只需要构建这一个应用就可以了。
  2. 易于大规模的更改:可以更改代码和数据库模式,然后构建和部署。
  3. 测试相对简单直观:只有这一个应用,测接口或者使用Selenium就行了,Selenium是一个可以控制浏览器的工具。
  4. 部署简单:部署时开发者唯一要做的把WAR文件复制到安装了tomcat服务器上。
  5. 横向扩展不费吹会之力:可以运行多个实例,有一个负载均衡器进行调度。这里提一下什么是横向扩展和纵向扩展:
    横向扩展和纵向扩展都是一种架构理念。
    横向扩展是向环境中添加机器或节点,如给服务新增一台机器/节点,给mysql新增个从库等,各个节点共同完成。众人拾柴火焰高
    纵向发展是提高单个节点的处理能力,如给mysql增加内存、提升机器cpu性能等。注重个人发展,个人能力顶呱呱

单体架构的坏处

  1. 过度复杂性吓退开发者:系统庞大复杂,开发者很难梳理出其中逻辑,更改或新增功能时,困难又耗时,这种情况随着每一次开发会越来越糟糕,有点像业内说的“堆shi山”,哈哈哈。
  2. 开发速度缓慢:系统太庞大,构建、启动、测试、部署花费的时间会越来越长,严重影响开发效率。
  3. 难以扩展:这里的扩展是指系统提供的功能越多,就需要越多的资源。如内存、cpu、gpu。一般的服务器满足不了,得需要高性能的服务器。
  4. 交付不可靠:一个模块出了问题,整个服务就可能故障或宕机。容易出问题的其中一个原因就是因为系统过于庞大而无法进行全面的测试。

拯救之道:微服务架构

微服务概念

Netfix著名架构师将微服务定义为面向服务的架构,由松耦合和具有边界上下文多的元素组成。作者描述了一个三维可扩展模型来更好的说明
在这里插入图片描述
X轴:复制实例,并实现负载均衡,提高吞吐量和可用性。没啥好说的。属于上边提到的横向扩展了。

Y轴:根据功能把应用拆分成服务。降低应用复杂性。
在这里插入图片描述

Z轴:根据请求的属性就行路由请求,每个实例负责数据的一部分子集。如查询用户信息,根据useId将请求路由到对应实例。


在这里插入图片描述
微服务的一个关键特性就是每个服务之间都是松耦合的,仅通过API进行通信,实现松耦合的方式之一就是每个服务都有自己的私有数据库

FTGO微服务架构

在这里插入图片描述
将单体应用拆成订单管理、配送管理、餐馆管理、用户管理等服务。每个服务和API都有着其清晰的定义,有着独立数据库,也可以独立开发、部署、扩展

微服务好处

  1. 大型的复杂应用程序可以持续交付和持续部署,是微服务最大好处
  2. 每个服务相对较小,易维护、可独立扩展、部署、容错性高,可实现团队自治。巴拉巴拉…

微服务弊端

微服务并不是一种银弹(类似一种特效武器),不是说用微服务就可以解决软件中所有问题了。

  1. 服务拆分和定义是一个挑战。如何拆分和定义确实需要考虑好。不然可能拆分成一组耦合度很高的微服务架构。
  2. 分布式系统带来的复杂性。一个服务变成了多个了,那么服务之间就需要通信了。这比一个服务调用本地方法要复杂,需要考虑远程服务不可用或高延迟情况,做故障处理。开发的时候要打开多个应用了,测试的时候之前要部署一个应用,现在可能要部署多个了。如果应用不属于同一个团队,部署钱要和其他团队沟通好。
  3. 什么阶段使用微服务?刚开始开发一个项目,需要快速迭代的时候,精心设计分布式架构会减缓开发速度。当问题复杂的时候,就需要将应用程序分解成一组服务了。但如何将重构复杂的应用程序,也是一个问题。

相关文章:

《微服务架构设计模式》第一章

逃离单体地狱 FTGO单体架构 ​​​​​​​作者用国外FTGO公司(一家做线餐饮外卖)的应用程序举例,阐述了单体架构的优缺点。FTGO应用架构如下: 应用程序是单体应用,具有六边形架构,最内侧是业务逻辑&…...

前端是如何打包的

前端项目的打包过程通常涉及将多个源文件(包括HTML、CSS、JavaScript等)合并、优化和压缩,以生成最终用于生产环境的静态资源。这个过程可以使用构建工具和打包工具来自动化完成。以下是前端项目的常见打包步骤: 1. **源代码编写…...

Qt 5.15编译(MinGW)及集成Crypto++ 8.7.0笔记

一、背景 为使用AES加密库(AES/CBC加解密),选用Crypto 库(官网)。   最新Crypto C库依次为:8.8.0版本(2023-6-25)、8.7.0(2022-8-7)和8.6.0(202…...

Qt 简单闹钟

//wiget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> //时间类 #include <QTimer> //定时器类 #include <QTextToSpeech> #include <QDebug> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPA…...

简单谈下Spring、Spring MVC和Spring Boot

Spring是一个开源的轻量级框架&#xff0c;用于构建Java应用程序。它提供了一种全面的编程和配置模型&#xff0c;可以帮助开发人员构建各种类型的应用程序&#xff0c;从简单的控制台应用程序到大型企业级应用程序。Spring框架的主要目标是提高应用程序的可维护性、可扩展性和…...

利用python进行视频下载并界面播放快速下载素材

工具&#xff1a;python designer&#xff08;python自带&#xff09;:UI界面设计工具 VLC&#xff1a;视频播放工具 需要的库如下&#xff1a; import os,platform os.environ[PYTHON_VLC_MODULE_PATH] "./vlc-3.0.14" import vlc from 脚本 import Player from …...

[C++][pcl]pcl安装后测试代码3

测试环境&#xff1a; vs2019 pcl1.12.1 代码&#xff1a; #include<iostream> #include <thread>#include <pcl/common/common_headers.h> #include <pcl/features/normal_3d.h> #include <pcl/io/pcd_io.h> #include <pcl/visualizatio…...

在WSL下使用makefile运行modelsim进行混合编译

modelsim的图像界面加载缓慢&#xff0c;实际上modelsim可以在纯命令行环境下仿真&#xff0c;使用-c参数:vsim -c。可以在WSL下用makefile运行Windows下的modelsim&#xff1a; HDL_CODE . HDL_CODE ../../rtl/ MODELSIM_ROOT : /mnt/e/exe/modeltech64_10.4/win…...

idea 常用插件和常用快捷键 - 记录

idea 常用插件 记得下载插件完成后&#xff0c;点击 Apply 和 OK Alibaba Java Coding Guidelines 作用&#xff1a;使用该插件可以&#xff0c;自动提示相关的语法格式问题&#xff0c;格式参考 阿里巴巴代码规范 详情链接&#xff1a; 代码规范之Alibaba Java Coding G…...

IDEA报错:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

问题&#xff1a; 使用IDEA新建spring boot项目&#xff0c;报错如下&#xff1a; Plugin org.springframework.boot:spring-boot-maven-plugin: not found解决办法&#xff1a; 1.在本地maven仓库中找到spring-boot-maven-plugin的版本号 2.在pom.xml文件中添加对应的版本…...

C++——Vector:push_back和emplace_back的区别,测试写入1GB大数据时的性能差距

什么是emplace_back emplace_back是C11引入的STL容器成员函数。emplace操作只执行构造而不执行拷贝构造。 如何理解上面这句话&#xff1f;先来看一个场景。 class test { public:test(){}test(int i){ std::cout << "test(int i)" << std::endl; }tes…...

C/C++/QT/Python/MATLAB获取文件行数的示例

1. C获取文件行数 #include <stdio.h>int main() {FILE *file fopen("path/to/your/file.txt", "r");if (file NULL) {printf("Failed to open the file!\n");return 0;}int lineCount 0;char ch;while ((ch fgetc(file)) ! EOF) {if…...

mysql的binlog參數詳解

mysql的binlog參數詳解 1. expire_logs_days expire_logs_days&#xff1a;這個參數用於設置binlog日誌文件的過期時間。默認情況下&#xff0c;binlog文件永不過期。如果將其設置為一個正整數值&#xff0c;則表示binlog文件在指定天數後會被自動刪除。 max_binlog_size m…...

【SpringSecurity】九、Base64与JWT

文章目录 1、base64编码2、Base64Url3、JWT的产生背景4、JWT介绍5、JWT组成5.1 Header5.2 Payload5.3 Signature 6、JWT的使用方式7、JWT的几个特点 1、base64编码 base64是一种编码方式&#xff0c;不是加密方式。 所谓Base64&#xff0c;就是说选出64个字符&#xff1a;小写…...

Python的io模块

io 模块提供了 Python 用于处理各种 I/O 类型的主要工具。三种主要的 I/O类型分别为: 文本 I/O, 二进制 I/O 和 原始 I/O。 io.open() 是内置的 open() 函数的别名. 语法&#xff1a; open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdTrue,openerN…...

CSS---flex布局

主要记录flex布局的要点以及实例 flex flex父标签的6个属性flex-direction: flex布局的方向flex-wrap: 是否可以换行flex-flow: flex-direction 和 flex-wrap 一起写justify-content&#xff1a;横向对齐方式align-items: 纵向对齐方式align-content: 有换行情况下的纵向对齐方…...

java线程和go协程

一、线程的实现 线程的实现方式主要有三种&#xff1a;内核线程实现、用户线程实现、用户线程加轻量级进程混合实现。因为自己只对java的线程比较熟悉一点&#xff0c;所以主要针对java线程和go的协程之间进行一个对比。 线程模型主要有三种&#xff1a;1、内核级别线程&#…...

JAVA 时间戳

时间戳&#xff08;Timestamp&#xff09;是一个表示特定时间点的数值&#xff0c;通常指的是自某个固定的起始时间&#xff08;如1970年1月1日00:00:00 UTC&#xff09;以来经过的秒数或毫秒数。 在 Java 中&#xff0c;可以使用 System.currentTimeMillis() 方法获取当前的时…...

层次分析法(matlab实现)

1.层次分析法&#xff08;AHP&#xff09; 在决策理论中&#xff0c;层次分析法是一种以数学和心理学为基础&#xff0c;组织和分析复杂决策的结构化技术&#xff0c;它代表了一种量化决策标准权重的准确方法&#xff0c;通过成对比较&#xff0c;利用个别专家的经验来估计因素…...

python selenium 自动化登录页面

去掉自动化标识&#xff0c;绕过js&#xff0c;绕过ip import time from selenium import webdriver from selenium.webdriver.chrome.options import Options# 去掉自动化标识&#xff0c;绕过js option Options() option.add_experimental_option(excludeSwitches, [enable…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...