应用部署初探:微服务的3大部署模式

news2024/11/25 22:35:44

在之前的文章中,我们已经充分了解了应用部署的4种常见模式(金丝雀部署、蓝绿部署、滚动部署及影子部署)。随着云原生技术逐步成熟,企业追求更为灵活和可扩展的系统,微服务架构大行其道。
 

微服务固然有诸多优点,但也给架构及运维工程师带来了新的挑战。在单体架构中,应用的设计、部署以及扩展都是作为一个单元进行,而当企业采用微服务时,可能有许多用不同语言和框架构建的相互连接的服务,从而导致部署变得更加复杂。
 

因此,企业需要采用不同的部署策略,使应用程序部署更丝滑且保证其完整性并拥有最佳性能。
 

部署模式

微服务架构可以采用不同类型的部署模式,并且每种设计都能为不同的功能和非功能需求提供解决方案。因此,服务可以用各种编程语言或框架编写。同样,它们也可以用同一编程语言或框架的不同版本来编写。
 

每个微服务都包含几个不同的服务实例,比如UI、数据库以及后端等。微服务必须独立部署和可扩展的。服务实例必须彼此隔离,并且每个服务都能够快速构建和部署,还可以合理分配计算资源。因此,部署环境必须是可靠的,服务必须被监控。
 

微服务部署模式

微服务部署模式包含若干种,但基本能分为以下三大类:

  • 每台主机的单个服务实例
  • 每台主机的多个服务实例
  • 无服务器部署

在下文中,我们将详细介绍每种服务部署模式。
 

每台主机的多个服务实例

当采取这一模式时,用户需要配置一个或多个实体/虚拟的主机并在每个主机上运行多个服务实例。这是一种传统的应用部署方法。每个服务实例在一个或多个主机上的端口运行。
 
下图展示了该模式的架构:
1.png

这一模式有几个变体。一个变体是每个服务实例可以是一个流程或者一个流程组。例如,可以将一个Java服务实例部署为 Apache Tomcat 服务器上的一个Web 应用程序。一个 Node.js 服务实例可能由一个父进程和一个或多个子进程组成。
 

该模式的其他变体还有在同一个进程或进程组内部运行多个服务实例。例如,你可以在相同的 Apache Tomcat 服务器上部署多个 Java Web 应用或者在相同的 OSGI 容器中运行多个 OSGI bundle。
 

每台主机运行多个服务器实例的模式有其优劣。最主要的优势之一是它的资源利用率较为高效。多个服务实例共享一台服务器及其操作系统。如果一个流程或一个流程组运行多个服务实例,这样的资源利用效率则更为高效。另外,我们还可以使用脚本,通过一些配置来自动启动和关闭进程。配置会有不同的部署相关信息,比如版本号。
 

每台主机的单个服务实例

在很多情况下,微服务需要它们自己的空间以及一个被清晰分隔开的部署环境。在此类状况下,它们不能与其他服务或服务实例共享部署环境。这可能会导致资源冲突或是资源紧张,还有存在版本之间互相冲突的语言和框架的情况。
 

在此类情况下,一个服务实例只能部署在它自己的主机上。该主机既可以是物理的也可以是虚拟机。那么,此时将不会与其他服务产生冲突,并且该服务完全保持隔离状态。所有VM的资源都可用于该服务的消耗,并且易于监控。
 

唯一的问题是这一部署模式会消耗更多资源。
 

每台VM的单个服务实例

微服务架构必须健壮且可以快速启动和停止。同样的,也需要快速扩容和缩容。因此不能与其他服务共享任何资源,也要避免与其他服务的冲突。在这一模式中,你将把每个微服务打包为VM的镜像,每个服务实例就是一个虚拟机,它可以使用VM镜像来启动。
 

以下图例展示了这一模式的架构:
2.png
开发人员可以通过增加服务实例的数量来轻松扩展服务。这一部署模式可以让服务实例单独扩容,允许每个服务尤其专属的资源,使得程序员可以基于应用程序的使用模式根据需要进行扩缩容。
 

每个服务实例的隔离是最重要的优势之一。此外,开发人员可以使用云基础设施的功能,包括负载均衡和自动伸缩。但这种模式最显著的缺点是,消耗了大量的资源,需要相当长的时间来构建和管理虚拟机。
 

每个容器的单个服务实例

这一部署模式拥有虚拟机模式的优势,同时还具备更轻量、更高效的优点。在这一模式下,微服务实例运行在它们自己的容器中。
 

容器对于微服务来说是十分理想的环境,因为它不需要占用太多内存和CPU。它使用 Docker 容器运行时并支持在一个容器内部部署微服务的多个实例。这可以让资源利用更高效,并且可以根据需要扩缩容,减少不必要的开支。
 

每个容器中运行微服务的其中一个实例是一种最简单、无缝的部署方式。这意味着每个容器都有自己的数据库,并在其进程中运行。
 

容器可以让应用快速启动和扩展并且比起虚拟机所需的资源更少。
 

该模式为简化可扩展性和部署提供支持,同时隔离服务实例。更进一步的是,用户可以快速构建容器镜像,并且也可以轻松地管理容器。当然,这种方法也有其缺陷:

  • 为了充分利用新版本的新特性和漏洞修复,程序员需要手动更新容器。如果你正在单个容器中运行微服务的多个实例,一次性更新它们会很耗时并且易出错

  • 部署更新有时会出现问题:如果在应用程序实时运行时应用更新,可能会对用户体验产生不利影响,比如停机或数据丢失

  • 尽管事实上容器技术在快速迭代发展,但是他们依旧不如虚拟机那样成熟和安全,因为容器们共享操作系统内核
     

无服务器(Serverless)部署

在某些情况下,微服务可能不需要了解底层部署基础设施,那么部署服务就会被承包给第三方供应商,他们通常是云服务提供商。企业对底层资源完全不在意,它所要做的就是在一个平台上运行微服务。它根据每次运行服务需要从平台上调用的资源来支付给服务提供商。服务提供商为每个请求挑选代码并执行。执行可能发生在任何执行沙盒中,如容器、虚拟机或其他,但它隐藏在服务本身之外。
 

服务提供商负责配置、扩展、负载均衡、打补丁和保障底层基础设施安全,目前最为常用的有:AWS Lambda、Google Functions等。
 

无服务器部署平台的基础设施是非常有弹性的,该平台会自动扩展服务以承受负载。进而花在管理低级别的基础设施上的时间会被节省下来。由于微服务提供者只需为每次调用所消耗的资源付费,因此支出也会降低。
 

总结

微服务部署模式和产品在不断发展,未来有可能会有更多的部署模式跟进。上面提到的许多模式目前都非常流行,并且被大多数微服务提供者所使用,它们是非常成功和可靠的。但随着技术的演进,业界也在思考创新的解决方案。在之后的文章,我们还将介绍如何保障应用部署的安全,请保持关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算组合数Cnk即从n个不同数中选出k个不同数共有多少种方法math.comb(n,k)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算组合数Cnk 即从n个不同数中选出k个不同数共有多少种方法 math.comb(n,k) 以下python代码输出结果是? import math print("【执行】print(math.comb(3,1))") print(math.comb(…

一文了解kafka消息队列,实现kafka的生产者(Producer)和消费者(Consumer)的代码,消息的持久化和消息的同步发送和异步发送

文章目录1. kafka的介绍1.2 Kafka适合的应用场景1.2 Kafka的四个核心API2. 代码实现kafka的生产者和消费者2.1 引入加入jar包2.2 生产者代码2.3 消费者代码2.4 介绍kafka生产者和消费者模式3. 消息持久化4. 消息的同步和异步发送5. 参考文档1. kafka的介绍 最近在学习kafka相关…

Ubuntu20.04+cuda11.2+cudnn8.1+Anaconda3安装tensorflow-GPU环境,亲测可用

(1)安装nvidia显卡驱动注意Ubuntu20.04和Ubuntu16.04版本的安装方法不同,安装驱动前一定要更新软件列表和安装必要软件、依赖(必须)sudo apt-get update #更新软件列表sudo apt-get install gsudo apt-get install gccsudo apt-get install make查看GP…

4.5.1 泛型

文章目录1.概述2.泛型的具体表现形式3.泛型的作用4.泛型示例5.练习:泛型测试一6.练习:泛型测试二1.概述 泛型不是指一种具体的类型,而是说,这里有个类型需要设置,那么具体设置成什么类型,得看具体的使用; …

RabbitMQ-持久化

一、介绍如何保证RabbitMQ服务停掉以后生产者发送过来的消息不丢失。默认情况下RabbitMQ退出或由于某种原因崩溃时,他将忽视队列和消息,除非告知它不要这样做。确保消息不丢失需要做两件事情:将队列和消息都标记为持久化二、队列持久化再声明…

(1分钟速通面试) SLAM中的最小二乘问题

最小二乘拟合问题 求解超定方程首先写这篇博客之前说一个背景,这个最小二乘拟合问题是我在去年面试实习的时候被问到的,然后当时是非常的尴尬,没有回答上来里面的问题。Hhh 所以这篇博客来进行一个补充学习一下下。感觉这个最小二乘问题还是比…

根据报告20%的白领在一年内做过副业,你有做副业吗?

现在大部分人收入单一,收入都是来源于本职工作,当没有了工作就没有了收入的来源,而生活压力又很大,各种开支,各种消费。所以很多人想要增加收入来源,增加被动收入,同时通过副业提升自己的价值和…

LeetCode·每日一题·1223.掷骰子模拟·记忆化搜索

作者:小迅链接:https://leetcode.cn/problems/dice-roll-simulation/solutions/2103471/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-xlfcs/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权&#xff0…

libxlsxwriter中文报错问题

libxlsxwriter库在windows系统下VS中存在中文输入报错问题。这在小白关于libxlsxwriter的第一篇博客libxlsxwriter初体验里有所阐述。当时小白给出的解决方案是将文件编码修改成不带签名的utf-8。后来在使用中,小白发现这样并没有完全解决问题。有的中文可以正常写入…

VHDL语言基础-时序逻辑电路-触发器

目录 触发器: D触发器: 触发器的VHDL描述: 触发器的仿真波形如下:​编辑 时钟边沿检测的三种方法: 方法一: 方法二: 方法三: 带有Q非的D触发器: 带有Q非的D触发器的描述&am…

微信小程序 Springboot高校课堂教学管理系统-java

小程序端 学生在小程序端进行注册并且进行登录。 填写自己的个人信息进行注册 登录成功后可以看到有首页、课程资源、测试、互动论坛、我的功能模块。 课程资源学生可以点击想要查看的资源进行观看。 课程分类学生可以按照自己想要的分类进行搜索并且进行观看。 互动论坛可以查…

四种方式的MySQL安装过程 数据库(2)

目录 1. 仓库安装: 1.1 卸载数据库软件: 2. 本地安装: 2.1 卸载数据库软件: 3. 容器安装: 4. 源码安装: 4.1 使用systemctl命令启动进程 1. 仓库安装: (1)查看版本…

超级详细GitBook和GitLab集成步骤【linux环境】

介绍 本文主要是在 gitlab 上集成 gitbook 实现提交时 gitbook 自动刷新部署 ,以及在 linux 环境上搭建 gitlab gitbook,集成 GitLab CI 实现一个企业级或个人的 Wiki 系统 环境准备 1.一台 linux 服务器 2.安装 node 以及 npm 环境 (这里注意 node 环境不要过高 不…

CS反制之批量伪装上线

分析原理: 我们利用Wireshark抓包工具分析一下Cobalt Strike的上线过程是怎么样的 点击木马,主机上线并抓包 查看数据包 可以看到cookie是一串非对称RSA加密类型,需要一个私钥Private Key才能对其进行解密 我们对Cookie解密看看&#xff…

Django框架之系列二

为什么要搭建虚拟环境? 在开发过程中, 当需要使用python的某些工具包/框架时需要联网安装 比如联网安装Django框架django的1.11.11版本 sudo pip install django1.11.11提示:使用如上命令, 会将Django安装到/usr/local/lib/python2.7/dist-packages路径下问题&…

常见的10种网络安全攻击类型

1. DoS 和 DDoS 攻击DoS 是 Denial of Service 的简称,即拒绝服务。单一的 DoS 攻击一般是采用一对一方式的,通过制造并发送大流量无用数据,造成通往被攻击主机的网络拥塞,耗尽其服务资源,致使被攻击主机无法正常和外界…

57 长短期记忆网络(LSTM)【动手学深度学习v2】

57 长短期记忆网络(LSTM)【动手学深度学习v2】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV1JU4y1H7PC/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 长短期记忆网络(LSTM&#xff09…

Element UI框架学习篇(四)

Element UI框架学习篇(四) 1 准备工作 1.0 创建Emp表并插入相应数据的sql语句 /*MySQL数据库*/SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CRE…

为什么需要内存对齐

内存对齐 为什么需要内存对齐? 平台原因:不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐…

阻塞式队列-生产者消费者模型

1.阻塞队列是什么 阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则. 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队…