当前位置: 首页 > 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…...

NoSleep防休眠工具:让系统持续运行的轻量级解决方案

NoSleep防休眠工具&#xff1a;让系统持续运行的轻量级解决方案 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 在现代工作环境中&#xff0c;电脑意外休眠常常成为工作流程的…...

经典美剧《暗黑》1-3季4K中英字幕 网盘发送

对《暗黑》任何“烧脑”“神剧”“开挂”的标签都是极其肤浅的论断。 看懂“暗黑”&#xff0c;已然不只是对众多人物关系线的梳理&#xff0c;对单个人物本身时间线的捋顺&#xff0c;它已经站在了哲学或者说神学的山巅尽量地发出凡人能够接受的光波和光谱。 是爱因斯坦相对论…...

突破JSXBIN加密限制:Jsxer高效解码解决方案

突破JSXBIN加密限制&#xff1a;Jsxer高效解码解决方案 【免费下载链接】jsxer A fast and accurate JSXBIN decompiler. 项目地址: https://gitcode.com/gh_mirrors/js/jsxer 当创意设计师和开发人员面对Adobe ExtendScript的JSXBIN二进制文件时&#xff0c;往往陷入代…...

终极指南:3步解锁原神帧率限制,体验144Hz流畅游戏

终极指南&#xff1a;3步解锁原神帧率限制&#xff0c;体验144Hz流畅游戏 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock genshin-fps-unlock是一款专为《原神》PC玩家设计的帧率解锁工具…...

为什么你需要一个本地漫画图书馆?哔咔漫画下载器给你完整解决方案

为什么你需要一个本地漫画图书馆&#xff1f;哔咔漫画下载器给你完整解决方案 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器&#xff0c;带图形界面 带收藏夹&#xff0c;已打包exe 下载速度飞快 项目地址: https://gitc…...

SEO 优化与网站分析有什么关系

SEO优化与网站分析&#xff1a;不可分割的伙伴 在当今数字化时代&#xff0c;拥有一个成功的网站不仅仅是一个企业的门面&#xff0c;更是其吸引客户和拓展市场的重要途径。无论你是初创企业还是成熟的行业巨头&#xff0c;网站的流量和用户体验直接影响着你的商业成功。而在这…...

SEO 培训 PPT 中如何设计生动有趣的课件

SEO 培训 PPT 中如何设计生动有趣的课件 在现代教育和培训领域&#xff0c;PPT 作为一种重要的教学工具&#xff0c;已经成为无法被忽视的存在。特别是在 SEO 培训中&#xff0c;一个生动有趣的课件不仅能够提高学员的参与度&#xff0c;还能帮助他们更好地理解和掌握复杂的 S…...

RadarSimPy:Python雷达仿真的完整指南与实战教程

RadarSimPy&#xff1a;Python雷达仿真的完整指南与实战教程 【免费下载链接】radarsimpy Radar Simulator built with Python and C 项目地址: https://gitcode.com/gh_mirrors/ra/radarsimpy RadarSimPy是一个基于Python和C构建的强大雷达仿真工具&#xff0c;为雷达系…...

WordPress和VuePress双站点配置指南:如何在单台云服务器上同时运行(基于宝塔面板)

WordPress与VuePress双站点高效部署实战&#xff1a;基于宝塔面板的云服务器资源整合方案 当个人开发者或小型团队需要在有限预算下同时维护动态博客和静态文档站点时&#xff0c;单台云服务器的资源整合能力就显得尤为重要。本文将分享如何通过宝塔面板这一可视化运维工具&…...

Navicat试用期无限重置完全指南:4个创新方法解决14天限制

Navicat试用期无限重置完全指南&#xff1a;4个创新方法解决14天限制 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 作为数据…...