云原生:容器与微服务

news2025/7/20 20:53:48

目录

一、虚拟化与容器

  1.1  虚拟机

  1.2  容器

  1.3  Docker

  1.4  Docker代码示例 

二、微服务

  2.1  微服务的概念

  2.2  微服务的特点

三、为什么使用微服务

    3.1  微服务的优缺点

  3.2  云原生的支持服务


云原生技术使组织能够在新式动态环境(如公有云、私有云和混合云)中构建和运行可缩放的应用程序。 容器、服务网格、微服务、不可变基础结构和声明性 API 便是此方法的范例。

这些技术实现了可复原、可管理且可观察的松散耦合系统。 它们与强大的自动化相结合,使工程师能够在尽量减少工作量的情况下,以可预测的方式频繁地进行具有重大影响力的更改。

一、虚拟化与容器

  1.1  虚拟机

        在容器技术之前,业界的“红人”是虚拟机。虚拟机技术的代表是VMware和OpenStack。在大学时,计算机操作系统的课程中经常学习使用VMware进行简单的编程学习。

        很多人都用过虚拟机,就是在操作系统里安装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。在“子电脑”里,可以和正常电脑一样运行程序,例如微信、Word。“子电脑”和“子电脑”之间,相互隔离互不影响。

        虚拟机虽然可以隔离出很多“子电脑”,但占用空间大,启动慢,虚拟机软件可能还要花钱(例如VMware)。而容器技术恰好没有这些缺点,它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”),启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。虚拟机和以Docker为代表的容器都是虚拟化技术,不过容器属于轻量级的虚拟化。

  1.2  容器

        容器是云原生概念的重要组成部分,一种计算单元,容器比虚拟化技术更轻量化、更小开销的方式运行,作为应用的包装形式,容器赋予应用独立和便携的能力。随着Docker、Kubernetes技术的成熟,容器也成为了时下最火的开发理念。并非所有的应用都适合选择容器,开发者可以根据自己应用的特点和需求选择最适合的计算单元。如果应用是高性能、互信的,且处于同一个管理区域,那么用线程或者进程就可以满足;但如果你的应用是多租户的,并且和其他应用运行在同一个空间,那么你就需要考虑如何将这些应用安全地隔离开,使得数据不会被泄露或性能受到影响,容器也许就是一个不错的选择。
        

         容器是「高度隔离的进程」:在一般进程的隔离基础上增加了新的隔离机制,这些隔离机制是使用Linux的内核提供的,它包括一些命名空间(Name Spaces)和CGroup。它保证了容器的网络是独立于其他容器网络的。每个容器自己看到的文件系统和其他容器的是不共享的,每个容器只能看到自己的进程ID,而进程编号也是连续的。

        容器是「应用的闭包」:应用不是单一的可执行文件,稍微复杂的应用包括:代码、可执行文件、配置依赖、外部依赖(动态链接库)等。所以在应用发行包装的时候,需要考虑目标操作系统的版本、系统架构以及它所依赖的模块等因素。容器本身包含了应用所有的依赖,这使得它可以再任意的基础设施上运行,不会因为系统版本、架构的问题,而导致各种意外。

  1.3  Docker

        我们再来看看Docker,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。虽然Docker 把容器技术推向了巅峰,但容器技术却不是Docker发明的。

         Docker本来是做PaaS的公司,原来叫做DotCloud,成立于2010年。但比起Pivotal、Red Hat等著名企业,DotCloud运营并不成功。眼看就要失败的时候,2013年DotCloud决定开源自己的容器项目Docker。但是短短几个月,Docker迅速崛起,吸引大量的开发者使用。随着Docker在开发者中越来越流行,2013年10月,DotCloud公司正式更名为Docker,2014年8月,Docker 宣布把PaaS业务出售,开始专心致志做Docker。

Docker一词意为码头工人,而它的logo则是一个托着许多集装箱的鲸鱼,非常形象:Docker是鲸鱼,而集装箱则是一个个的容器。在Docker的官网上,对于容器有一个一句话的解释“A standardized unit of software”,即“软件的一个标准化单元”。

Docker曾经有一句Slogan叫做“Build once,Run anywhere(搭建一次,随处可用)”。

  1.4  Docker代码示例 

        容器启动后会回显 "Hello world"

FROM ubuntu:latest 
CMD echo "Hello world"

        下面这段代码演示如何运行 Java 应用程序。从使用OpenJDK 8映像开始,将包含代码的.jar文件从系统复制到容器中,对此容器进行实例化后,它将运行该 Java 应用程序。

FROM openjdk:8
COPY /hello.jar /usr/src/hello.jar
CMD java -cp /usr/src/hello.jar
org.example.App

        下面这段代码是一个更为真实的 Dockerfile 示例,从 CentOS 7 映像开始,进入更新操作系统并安装 Apache的步骤,最后复制应用程序的 Shell 脚本并授予它可执行权限。

        实例化容器后,命令会运行该 Shell 脚本。

FROM centos:7

RUN yum -y update && yum -y install httpd

EXPOSE 80

ADD run-http.sh /run-http.sh
RUN chmod -v +x /run-http.sh

CMD ["/run-http.sh"]

二、微服务

  2.1  微服务的概念

        容器是微服务和云原生架构的最佳实现载体。微服务与容器几乎是完美的搭配。单体式架构(Monolithic)变成微服务架构(Microservices),相当于一个全能型变成N个专能型,每个专能型分配一个隔离的容器,赋予了最大程度的灵活。

         服务器势必会走上虚拟化的道路,因为虚拟化有太多的优势,例如前文所说的低成本、高利用率、充分灵活、动态调度等等。而采用容器之后,只需要一台服务器,创建十几个容器,用不同的容器,来分别运行不同用途的服务程序。这些容器,随时可以创建,也可以随时销毁。还能够在不停机的情况下,随意变大,随意变小,随意变强,随意变弱,在性能和功耗之间动态平衡。所以容器化是云计算的终极形态。

  2.2  微服务的特点

  1. 轻便。微服务架构通过对特定业务领域的分析与建模,将复杂的应用分解成小而专一、耦合度低并且高度自治的一组服务,每个服务都是很小的应用。
    耦合度
  2. 单一。对于每个服务而言,我们希望它处理的业务逻辑能够单一,在服务架构层面遵循单一职责原则。也就是说,微服务架构中的每个服务,都是具有业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,不同的服务通过「管道」的方式灵活组合,从而构建出庞大的系统。
  3. 轻量级通信。服务之间应通过轻量级的通信机制,实现彼此之间的互通互联,互相协作。所谓轻量级通信机制,通常指语言无关、平台无关的交互方式。        
  4. 在微服务架构中,每个服务都是一个独立的业务单元,当对某个服务进行改变时,对其他的服务不会产生影响。换句话说,服务和服务之间是独立的。对于每个服务,都有独立的代码库。当对当前服务的代码进行修改后,并不会影响其他服务。
    微服务的独立性演示
    ​​​​
  5. 在微服务架构中,应用程序由多个服务组成,每个服务都是一个具有高度自治的独立业务实体。通常情况下,每个服务都能运行在一个独立的操作系统进程中,这就意味着不同的服务能非常容易的被部署到不同的主机上。作为运行微服务的环境,我们希望它能够保持高度自治性和隔离型。

三、为什么使用微服务

        微服务提供敏捷性。

  • 每个微服务都有自治生命周期,可以独立发展并频繁部署。 不必等待每季度发布一次才能部署新功能或更新。 可以更新实时应用程序的小区域,降低中断整个系统的风险。 无需完全重新部署应用程序即可进行更新。

  • 每个微服务都可以独立缩放。 你可以仅横向扩展需要更多处理能力才能满足所需性能级别和服务级别协议的服务,而不是将整个应用程序作为单个单元进行缩放。 精细缩放可使你更好地控制系统,并且有助于降低总体成本,因为是缩放部分系统(而不是所有内容)。

    3.1  微服务的优缺点

对比点微服务架构单体架构结论
上手难度API接口调用数据库共享或者本地程序调用单体架构胜
开发效率早期设计和沟通的工作量加大,随着项目规模和时间的推移,效率变化不大早期工作量小,随着项目规模和时间的推移,效率大幅度下降对于简单项目单体架构胜,对于复杂项目微服务架构胜
系统设计(高内聚低耦合)每个业务单独包装成一个微服务,数据和代码都从物理上隔离开来,实现高内聚低耦合相对容易以包的形式对代码进行模块划分,控制得当即可实现高内聚。但最终都是在数据层面将整个系统耦合在一起微服务架构胜
系统设计(扩展性)独立开发新模块,通过 API 与现有模块交互在现有系统上修改,与现存业务逻辑高度耦合微服务架构胜
需求变更响应速度各个微服务组件独立变更,容易实施敏捷开发方法需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败微服务架构胜
系统升级效率各个微服务组件独立升级,上手和开发效率高,影响面小需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败微服务架构胜
运维效率大系统被拆分为多个小系统,部署和运维难度加大,但可以利用 DevOps 等方式将运维工作自动化简单直接单体架构胜
代码复用性微服务组件可以在新项目中直接复用,包括前端页面一般以共享库的形式复用后台代码微服务架构胜
硬件需求按需为不同业务模块伸缩资源节点,一个系统需部署多个微服务,需要启动多个运行容器整个系统只需要一个运行容器,为整个系统分配资源对于简单项目单体架构胜,对于复杂项目微服务架构胜
项目成本项目早期和后期,成本变化曲线平缓项目早期成本低,后期成本大对于简单系统单体架构胜,对于复杂系统微服务架构胜
非功能需求为单独的微服务按需调优,甚至更换实现方式和程序语言为整个系统调优,牵一发而动全身微服务架构胜
职责、成就感拥有明确的职责划分,主人翁意识和成就感加强,容易形成自组织型团队职责不明确,容易产生扯皮行为微服务架构胜
风险大系统被拆分为小系统,风险可被控制在小系统内,但也引入了各小系统之间的交互风险系统是一个整体,一荣俱荣,一损俱损微服务架构胜

        对于简单项目来说,单体架构 5 胜 8 败,优势主要体现在开发效率、上手难度、运维效率、硬件需求、项目成本;对于复杂项目来说,微服务架构 11 胜 2败,优势主要体现在硬件需求、项目成本、开发效率、系统设计时的高内聚低耦合和可扩展性、需求变更响应速度、系统升级效率、代码复用性、非功能需求、职责/成就感、风险的可控性。

  3.2  云原生的支持服务

        

云原生常见的支持服务

         在云原生搭建的过程中,你可以自己承载自己的服务,缺点是后续的维护更新都需要自己来搞定。可以在一定程度上锻炼自己的动手能力,美滴很。

        现在,很多的云服务提供商提供了许多的云产品供开发者选择。云提供商大规模地运营资源,并负责性能、安全性和维护。与自己维护相比较,云服务稍微有点费钱。但是会节省大量的体力。

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

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

相关文章

攻防世界-pwnCTFM-Off_By_one漏洞与Tcachebin绕过

攻防世界-pwnCTFM-Off_By_one漏洞与Tcachebin绕过 保护机制 healerhealer-virtual-machine:~/Desktop/pwnCTFM/attachments$ checksec pwn [*] /home/healer/Desktop/pwnCTFM/attachments/pwnArch: amd64-64-littleRELRO: Full RELROStack: Canary foundNX: …

线性判别分析(机器学习)

目录 线性判别分析的原理 LDA的降维过程如下 线性判别分析(LDA) 是一种有监督的线性降维算法。 与PCA不同,LDA是为了使降维后的数据点尽可能地容易被区分 线性判别分析的原理 线性判别分析是对于给定的训练集,设法将样本投影到…

基于HTML+CSS+JavaScript+Bootstarp响应式健身网站(web前端期末大作业)

网站题目> 🏀校园篮球网页设计、⚽足球体育运动、🤽体育游泳运动、🏓兵乓球 、🎾网球、等网站的设计与制作。 二、✍️网站描述> 🏷️ 大学生校园运动静态HTML网页设计作品,采用DIV CSS布局制作&am…

数据结构体进阶链表【带头双向循环链表,单向链表的优化,从根部解决了顺序表的缺点】一文带你深入理解链表

前言: 对于链表,上一篇的单链表解决了顺序表的一部分缺陷,但并没有彻底的解决顺序表的问题,比如在进行单链表尾插尾删的时候还是需要进行遍历找尾,并没有达到全部的O(1),并且在头插的时候还要分情况来考虑&…

【ASM】字节码操作 工具类与常用类 AdviceAdapter 介绍 打印方法进入 和 方法退出 的参数

文章目录 1.概述2. AdviceAdapter类2.1 class info2.2 fields2.3 constructors2. 4 methods2.案例2.1 打印方法参数3.总结1.概述 在上一篇文章:【ASM】字节码操作 工具类与常用类 Printer、ASMifier、Textifier 介绍 我们简单的介绍了 Printer、ASMifier、Textifier 三个类的…

idea2021版本创建一个javaweb项目(含额外知识--添加tomcat相关jar包)

前言: 建立一个javaweb项目需要用到JDK、idea、Tomcat 1. JDK是11版本的 2.IDEA是2021版本的 3.Tomcat是8.5版本的 这些下载在我的其他文章里面也有讲到下载和应用,大致都是殊途同归的 一、打开ided,按照以下步骤点击创建一个工程项目…

X11 Xlib截屏代码所遇问题及初步分析

综合了两篇博客中的例程并做一定修改&#xff0c;得到了基于X11 Xlib的截屏代码。 两篇博客链接分别如下&#xff1a; X11 截图与鼠标事件-SkyMei777-ChinaUnix博客 xlib实现截图报错-编程语言-CSDN问答 C代码如下&#xff1a; #include <stdio.h> #include <std…

[附源码]SSM计算机毕业设计自治小区物业设备维护管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

TK选品技巧 | 听说TikTok畅销品都是这样来的

9月16日消息&#xff0c;TikTok Shop发布东南亚99大促战报&#xff0c;此次战报数据包含了马来西亚、新加坡、菲律宾、越南和泰国五国销售数据&#xff0c;战报显示&#xff0c;此次东南亚99大促总GMV增幅达156%&#xff0c;总live GPM增幅达130%&#xff0c;订单量增幅达128%&…

基于springboot的社区疫情管理系统源码

1、项目介绍 基于springboot的社区疫情管理系统拥有三种角色&#xff1a;超级管理员、普通管理员、用户 超级管理员&#xff1a;管理员和用户管理、人员检测信息管理、外来人员报备管理、防疫须知管理、疫情用品类型管理、疫情用品管理、订单管理、评论管理、审核外来人员、新…

【ML-SVM案例学习】案例一:对鸢尾花数据进行SVM分类(附源码)

文章目录前言一、完整源码分步实现1.引入库2.读入数据3.编码数据4.数据分割5.数据SVM分类器构建6.计算模型的准确率/精度7.计算决策函数的结构值以及预测值8.画图总结前言 【ML-SVM案例学习】会有十种SVM案例&#xff0c;供大家用来学习。本章实现SVM鸢尾花数据的分类任务。 一…

PDF能编辑修改吗?教你必备的几种编辑方法

可以把PDF文件编辑修改吗&#xff1f;相信这是很多萌新在刚接触PDF文件时所产生的疑惑&#xff0c;因为在想要改动PDF文件的时候&#xff0c;发现无法直接编辑内容&#xff0c;就会有PDF文件可以编辑吗的疑问了&#xff0c;其实有这种想法非常正常&#xff0c;大家都是经历过的…

【设计模式】单例模式

单例模式属于创建型模式&#xff0c;是最简单的一种设计模式。当一个类在程序中只需要创建唯一全局对象时&#xff08;如网站计数类、日志管理类、线程池类……&#xff09;&#xff0c;就可以使用单例模式。单例模式规定一个类只能创建一个实例&#xff0c;之后不能再创建新的…

Verilog语法

Verilog语法 Verilog简介 Verilog是一种硬件描述语言&#xff0c;以文本形式来描述数字系统硬件的结构和行为的语言&#xff0c;用它可以表示逻辑电路图、逻辑表达式&#xff0c;还可以表示数字逻辑系统所完成的逻辑功能。 Verilog 和 C 的区别&#xff1a; Verilog是硬件描…

Linux篇【5】:Linux 进程概念(二)

目录 3.5、查看进程 3.6、通过系统调用接口获取时实进程的标识符 3.7、通过系统调用接口创建子进程 - fork 初识 3.5、查看进程 [HJMhjmlcc ~]$ clear [HJMhjmlcc ~]$ pwd /home/HJM [HJMhjmlcc ~]$ ls [HJMhjmlcc ~]$ touch mytest.c [HJMhjmlcc ~]$ ls mytest.c [HJMhjml…

G1D16-fraud-SVM

早上复习了一下昨天学的内容&#xff0c;发现这零碎时间用来复习&#xff0c;真的很不错。 但是遇到了一个问题&#xff1a;知识推理和知识挖掘有什么区别&#xff1f; 知识规则挖掘是对知识结构的挖掘&#xff0c;可以针对现有的知识体系&#xff0c; 利用部分规则&#xff0…

[附源码]java毕业设计冷链物流管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Redis数据类型之hash

文章目录hashⅠ. 增删查改Ⅱ. 加法操作Ⅲ. 业务场景1 - 购物车Ⅳ. 业务场景2 - 秒杀Ⅴ. 注意事项提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 hash ● 新的存储需求&#xff1a;对一系列存储的数据进行编组&#xff0c;方便管理&#xff0c;…

基于PHP的Laravel框架实现学生管理系统(1+X Web前端开发中级 例题)——初稿

文章目录 &#x1f4c4;题目要求 &#x1f9e9;说明 &#x1f9e9;效果图 &#x1f4bb;题目代码 &#x1f3af;实现效果 &#x1f4f0;完整答案 &#x1f4c4;题目要求 阅读下列说明、效果图和代码&#xff0c;补全代码&#xff08;1&#xff09;-&#xff08;10&…

如何“0基础”备考CISSP一次通过?

2019年进入网络安全行业的PM&#xff0c;苦恼于行业与业务认知存在较大的知识差距&#xff0c;恰好公司一系列政策鼓励员工学习网安等专业知识&#xff0c;和报考相关专业认证&#xff0c;通过了解&#xff0c;最终决定「挑战」CISSP&#xff01; 选择CISSP的原因 CISSP八个域…