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

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...