标签归档:容器

如何针对 Nginx 为基础的服务进行容器优化

如何针对 Nginx 为基础的服务进行容器优化

曾经写过一篇使用 Docker 、Traefik 以及 Nginx 创建自动索引站点的文章,本篇内容将聊聊如何进行优化。

包含内容:剥离容器配置中的变量、如何对容器进行健康检查、如何限制容器日志尺寸等。

剥离环境变量

前文的 docker-compose.yml 中,许多内容是直接写死在文件中的,随着配置文件越来越“复杂”、同类的服务启动越来越多万发商务移动站hao123网站大全,我们需要将一些基础的配置剥离出来,以方便后续的维护。

nginx:
    image: nginx:1.15.7-alpine
    labels:
      - "traefik.frontend.rule=Host:demo.soulteary.com"
    extra_hosts:
      - "demo.soulteary.com:127.0.0.1"

比如“域名”、“镜像名称”等信息,我们可以从上面配置文件中进行剥离,剥离后的配置如下:

nginx:
    image: ${NGX_IMAGE}
    labels:
      - "traefik.frontend.rule=Host:${NGX_DOMAIN}"
    extra_hosts:
      - "${NGX_DOMAIN}:127.0.0.1"

为了让 docker-compose.yml 能够像之前一样正常工作,我们需要创建一个 .env 文件nginx后端服务器监控hao123网站大全,存放刚刚剥离的信息。

NGX_IMAGE=nginx:1.15.8-alpine
NGX_DOMAIN=demo.soulteary.com

后续这类信息多起来之后,可以通过配置系统接口获取,或者让CD系统自动生成。

支持 HTML 文件预览或直接下载

Nginx 默认配置中,HTML 类型文件将会被渲染成我们熟悉的网页,这显然不符合 auto index 的需求,如果能够像 TEXT 纯文本一样直接在浏览器中进行预览或许会更好。

修改 Nginx 使用的 mime.types 文件nginx后端服务器监控,将 HTML 类型文件进行修改如何针对 Nginx 为基础的服务进行容器优化hao123网站大全,原始文件如:

text/html                                       html htm shtml;

需要修改为:

text/plain                                       html htm shtml;

如果你需要用户在访问页面时,能够直接下载文件,那么可以将 text/plain 修改为 /octet-stream。

容器服务监控检查

为了容器中的应用运行结果更加可靠,我们需要让容器进行健康检查。

因为本例中的内容是动态生成的,虽然程序效率很高,但是还是建议让检查工具请求的内容尽可能更简单一些,为此我们定义一个新的路径 /health-checkhao123网站大全,并将它添加到 nginx.conf 配置中:

location = /health-check {
    access_log  off;
    default_type text/html;
    return      200 'alive';
}

当健康检查器或者用户访问这个地址时,将会得到“alive”的结果。

接着,在 docker-compose.yml 中定义检查器:

healthcheck:
  test: ["CMD-SHELL", "wget -q --spider --proxy off localhost/health-check || exit 1"]

当你执行 docker ps 时,终端输出的文本将会有一些不同。

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS                            PORTS                                                                              NAMES
d9903d19aae7        nginx:1.15.8-alpine                        "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds (health: starting)   80/tcp

当程序完全运行之后,Up 4 seconds (health: ) 将会变更为 Up 10 seconds (healthy) 。

未来在调试/查看容器服务状况时,辨别服务运行状态就又有了一个新的依据啦。

约束日志文件尺寸

搭建在公网上的应用,除了会被用户访问之外,还可能遭到扫描器问候、恶意攻击的海量请求。

这时,如果不约束日志文件尺寸,很容易将磁盘占满,造成其他麻烦。

除了使用 处理日志外,更简单的方案是在 docker-compose.yml 中对日志尺寸进行限制hao123网站大全,将下面的内容添加到配置文件中。

logging:
    driver: "json-file"
    options:
        max-size: "10m"

818114文章来源于互联网,本网转载出于传递更多信息和动漫学习之目的,并不意味着赞同其观点或证实其内容的真实性,如有侵权请通知我们立刻删除!

Tomcat容器如何设置时区

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器。因为Tomcat 技术先进、性能稳定,而且免费,因而深受JAVA 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。首先我们先看看如何使用Docker安装Tomcat服务呢。

#停止服务

docker stop tomcat

#删除服务

docker rm tomcat

#安装Tomcat容器

docker run -d -p 8080:8080 –restart=always –name tomcat tomcat

当Tomcat容器安装后,发现操作系统的时间和tomcat中的访问日志的时间与系统时间不一致,但是查看当前操作系统的时区也是CST时区(中国标准时区)。那如何解决该问题呢,请看下面的命令:

docker run -d -p 8080:8080 –restart=always –name -e TZ=“Asia/Shanghai” -v /etc/localtime:/etc/localtime tomcat

#参数-e TZ=”Asia/Shanghai”来指定时区

#-v /etc/localtime:/etc/localtime 将系统的时间文件挂载到容器中。

OK,Tomcat容器如何设置时区就分享到这里。谢谢!

web容器是如何解析http报文的

来源于公众号方丈的寺院 ,

作者cnstonefang

摘要

作为服务端,web容器是如何解析http报文的呢?本文以jetty和undertow容器为例,来解析web容器是如何处理http报文的。

http报文其实就是一定规则的字符串,那么解析它们,就是解析字符串,看看是否满足http协议约定的规则。

start-line: 起始行,描述请求或响应的基本信息
*( header-field CRLF ): 头
CRLF
[message-body]: 消息body,实际传输的数据

jetty

以下代码都是jetty9.4.12版本

如何解析这么长的字符串呢,jetty是通过状态机来实现的。具体可以看下 org.eclipse.jetty.http.HttpParse类

总共分成了21种状态,然后进行状态间的流转。在 parseNext方法中分别对起始行 -> header -> body content分别解析

整体流程

整体有三条路径

  1. 开始 -> start-line -> header -> 结束
  2. 开始 -> start-line -> header -> content -> 结束
  3. 开始 -> start-line -> header -> chunk-content -> 结束

起始行

start-line = request-line(请求起始行)/(响应起始行)status-line

  1. 请求报文解析状态迁移 请求行:START -> METHOD -> SPACE1 -> URI -> SPACE2 -> REQUEST_VERSION
  2. 响应报文解析状态迁移 响应行:START -> RESPONSE_VERSION -> SPACE1 -> STATUS -> SPACE2 -> REASON

header 头

HEADER 的状态只有一种了,在jetty的老版本中还区分了 HEADER_IN_NAM, HEADER_VALUE, HEADER_IN_VALUE等,9.4中都去除了。为了提高匹配效率,jetty使用了Trie树快速匹配header头。

content

请求体:

  1. CONTENT -> END,这种是普通的带Content-Length头的报文,HttpParser一直运行CONTENT状态,直到最后ContentLength达到了指定的数量,则进入END状态
  2. chunked分块传输的数据 CHUNKEDCONTENT -> CHUNKSIZE -> CHUNK -> CHUNK_END -> END

undertow

undertow是另一种web容器,它的处理方式与jetty有什么不同呢 状态机种类不一样了, io.undertow.util.HttpString.ParseState

具体处理流程在 HttpRequestParser抽象类中

与jetty不同的是对content的处理,在header处理完以后,将数据放到 io.undertow.server.HttpServerExchange,然后根据类型,有不同的content读取方式,比如处理固定长度的, FixedLengthStreamSourceConduit。

容器和虚拟机的异同

容器被誉为是将应用程序部署到服务器上的非常有效的手段。容器(例如基于docker开源标准的容器)比虚拟机消耗更少的资源,并且容器的设计更容易,且实例化和提供更快。,然而,与虚拟机不同,容器并不是100%与底层主机操作系统(通常是Linux或Window Server)或服务器上的驱动程序或其他应用程序隔离的。,虚拟机是一个完整的虚拟化服务器,通过被称为虚拟机管理程序的软件分配磁盘空间、处理器周期和I/O资源。在虚拟机中可以找到真实服务器上的所有内容:操作系统、设备驱动程序、应用程序、配置文件和网络连接。,,换句话说,从底层起,是裸机、服务器的主机操作系统、管理程序,然后是一个或多个虚拟机,每个虚拟机都有自己的操作系统、驱动程序和应用程序。,相比之下,容器中的所有内容都共享底层主机操作系统、设备驱动程序和一些配置文件。例如Docker,它提供一个或多个容器,而不是管理程序。每个容器只保存应用程序。这些应用程序依赖于主机操作系统和驱动程序,它也与在同一台服务器上运行的其他容器共享。,容器的好处是:开销更小,如果在Linux服务器上有20台Linux虚拟机,则需要使用内存和CPU资源运行21个Linux实例,其中20个是虚拟机,另一个运行主机。启动所有这些Linux实例需要一定的时间,并且开销很大。,另一方面,所有这些Linux虚拟机都是相互隔离的,事实上,它们甚至可能是不同版本的Linux.在VM模型中,这完全没问题。,相反,如果在Linux服务器上有20个容器,则只需要一个Linux副本运行。启动一个容器非常快,并且消耗的资源要少得多,只有一个Linux内核和一组共享库。,但是,一个容器中的出现安全问题可能会泄漏并影响其他容器或其应用程序。,虚拟机的好处:更强的隔离,现代微处理器、主机操作系统(Linux和Windows)以及虚拟机管理程序(VMware ESX,Citrix XenServer和Microsoft Hyper-V)中的技术可在每个虚拟机之间提供基于硬件的隔离。这种保护是同心环:每个环都受到较高编号的环的保护,其中0环位于中心,与应用隔离。,在虚拟机系统中,主机操作系统的内核在0环中运行,这意味着什么都无法达到。管理程序在环1中运行。而单个虚拟机在环2中运行,因此无法访问环1内的管理程序或操作系统。,更重要的是,管理程序可以使用它的环1权限来执行规则,防止一个VM访问另一个VM的内存、应用程序或资源。,由于Docker Daemon不是环1管理程序,而是简单的环2应用程序,所以在容器中事物并不是同样安全的。因此,硬件中没有任何东西可以完全阻止一个容器对底层服务器进行更改,或者访问其他容器的内存、存储或设置。虽然有软件保护,但它们并非难以穿透。,如何保护容器,基于容器的服务器的安全性应视为适合“friends and family”:我们应该了解并信任在该服务器上运行的所有应用程序。,但是我们不需要知道或信任在服务器上运行的其他虚拟机上的应用程序,这就是为什么云托管公司使用虚拟机而不是容器来隔离客户的软件和数据的原因。,保护容器不易受到伤害,可以归结为以下几种常见方法。首先,最小化容器化软件的攻击面,以便在受到攻击时,将数据泄漏的危险性降到最小。,另一个是严格控制对容器的访问,并且如果有必要,需要在自己的服务器上隔离特别敏感的容器。,容器是将应用程序部署到云中的最快、最有效的方式,并且比虚拟机的资源效率更高。目前的问题是容器不像虚拟机那样安全。但只要在使用容器的时候考虑到这一点,你将能够得到更好的体验,声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话: ; 。本站原创内容未经允许不得转载,或转载时需注明出处::西部数码资讯门户 » 容器和虚拟机的异同,

部署网络防火墙,保护容器安全

在部署任何基于容器的应用程序之前,首先通过确保docker、Kubernetes或其他容器防火墙来保护容器的安全至关重要。有两种方式来实现容器防火墙:手动或通过使用商业解决方案。但是,不建议对基于Kubernetes的容器部署进行手动防火墙部署。无论如何,无论采取哪种策略,创建一套网络防火墙规则来保护容器部署至关重要,这可以防止容器敏感系统和数据被访问。,用防火墙来保障容器安全(Docker/Kubernetes) ,新漏洞的不但出现加强了容器安全的必要性,Apache Struts背后的黑客的创造力,Linux堆栈冲突以及cow exploits,所有这些都是因重大数据泄露和勒索软件攻击臭名昭著,企业永远不知道接下来会发生什么。此外,这些攻击具有相当的复杂性,不仅需要漏洞扫描和修补来应对威胁。,攻击通常是一系列的事件(或称为kill chain),攻击者将进入一个易受攻击的系统,然后升级他的访问权限并扫描其他系统,最终违反数据并造成损害。主动式容器防火墙策略可以帮助检测多个阶段的kill chain,并减少此类攻击,即便在涉及零漏洞的情况下也是如此。,部署防火墙来保护容器并不简单,就本质而言,容器部署根据需要动态扩展、更新并迁移主机和云,以优化环境。编排工具管理Pod和容器的IP地址,使得攻击者难以了解网络流量。每个容器都包含容器的虚拟化网络接口,无论是Docker、Kubernetes还是其他程序,环境的编排工具都会自动部署。由于这种高度动态的特性,对传统防火墙规则和iptables来说,检查流量并防止容器受到不必要的访问是一个巨大的挑战。,容器防火墙保护,可用于容器防火墙部署的选择与传统防火墙的选择相同,包括以下内容:,手动配置docker容器防火墙,对于那些对自己的Linux网络功能充满信心的用户而言,手动配置Dcoker容器防火墙是一种有效的选择。,完成此操作的基本步骤如下:,遵循这些步骤将能够通过基本的网络通信进行控制,通过进一步的规则更新或商用Docker容器解决方案来实现这些功能的自动化,可以实现对容器与其他容器进行通信的更细致的命令。实际上,在高度动态的环境中手动更新容器与容器之间的规则是不可取的。,云原生方式,尽管云原生Docker容器防火墙与下一代防火墙或WAF相似,但它们在云和托管安全功能方面有巨大差异。通过在云原生容器环境中提供保护,这些防火墙不仅能够保护外部南北向流量,还能够保护内部东西向流量,同时隔离并保护工作负载、应用程序对战和动态容器环境。,通过行为学习来启用自动策略创建,容器防火墙可能了解容器环境中每个基于容器服务的正常行为,通过收集尽可能多的行为数据,防火墙就可以系统地理解应用程序的意图,管理安全策略以自动支持此意图,识别并禁止与此意图不符合的行为。,深度包检测(DPI),深度包检测(DPI)技术是容器防火墙可以提供的另一个重要安全需求。所有漏洞都使用可预测的攻击媒介:恶意HTTP请求可能包含格式错误的头文件,或者在可扩展标记语言(XML)对象中包含可执行的shell命令。有效的检测部署可以查找和识别这些方式,DPI为此过程增加了一个必要的确定性,允许容器防火墙实时审查每个容器连接,并判断是否允许数据包继续传输。,无论是手动部署容器防火墙还是使用商用防火墙,对于用户的解决方案能够检测主机和容器中的特权升级和可疑进程,扫描这些漏洞以及监控其活动和行为的任何容器环境的安全性至关重要。商用的容器网络安全选择通常提供终端安全和审计功能以及强大的防火墙功能。安全审计和一致性测试工具,如Docker Bench for Security或CIS Kubernetes基准测试工具,将用户的容器环境纳入测试并指出安全改进的特定需求。,声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话: ; 。本站原创内容未经允许不得转载,或转载时需注明出处::西部数码资讯门户 » 部署网络防火墙,保护容器安全,

  • 3/4层过滤:容器安全性可以基于IP地址和端口实现。还可以使用Kubernetes网络策略和其他Kubernetes工具以动态方式更新规则,在部署更改和扩展容器时加以保护。需要指出的是,这些工具没有配备实现实时流量监控和可视化。
  • Web应用攻击检测:运行Web应用程序的面向Internet的容器可以通过检测常见攻击的方式进行保护,这符合Web应用程序防火墙(WAF)的功能。需要注意的是,仅限于常见的外部攻击,保护内部容器到容器之间的流量所需的多协议过滤超出了此方法的范畴。
  • 7层Docker防火墙:通过具有7层过滤功能的容器防火墙和容器间流量的深度包检测,可以使用网络应用程序协议来保护容器。与此同时,这类防火墙还集成了容器运行时引擎和Kubernetes等云容器编排工具,自动创建策略,基于白名单的保护以及支持云和主机安全的应用程序威胁保护。
  • 将iptables设置为false以确保Docker不会覆盖您的规则
  • 检查您创建的规则并保存
  • 添加允许/转发的规则(I/O接口,ICMP,Docker)
  • 为输入和输出流量以及流量路由添加防火墙规则,确保容器仍然能够根据需要访问互联网
  • 加载防火墙规则
  • 允许或限制icc设置为等于true的主机到主机容器通信

容器 vs. 虚拟机

当人们讨论云计算时,经常会提及两个术语:虚拟机和容器。在多云时代尤其如此,因为组织的跨平台战略至关重要。虚拟机和容器这两种技术也有共同点:都是软件技术,都在虚拟化环境中运行。但它们在操作、大小、管理、用例和其他因素上有所不同。,以下对虚拟机和容器进行一下比较。,,虚拟机:一个独立的实例,虚拟机是操作系统的整个实例,通常是Windows或Linux,位于服务器内存的独立部分与系统的其余部分相隔离。,容器:只用于移动所需的东西,容器加载的内核和运行时代码足以在容器中运行应用程序,而不是像虚拟机那样加载完整的Windows或Linux实例。这种更轻的框架使它们足够灵活,可以在操作环境之间轻松移动。,虚拟机与容器:关键区别,虚拟机的优缺点,1、虚拟机提供更多资源:虚拟机使用的是完整的操作系统,而不是自定义的削减版本,所以组织可以充分利用操作系统。这意味着所有操作系统资源都可用,并且拥有一整套管理和安全工具。简而言之,组织拥有完整的操作系统,无论是Windows、Red Hat、Ubuntu,还是其他版本的Linux。,2、虚拟机需要更长的启动时间:当然,虚拟机的缺点之一是规模大。在资源受限的服务器上,这将是限制性的因素。由于具有大小差异,虚拟机可能需要几分钟才能启动,而容器化应用程序几乎可以立即启动。这意味着容器可以在需要时加载,然后在不再需要时关闭,从而释放主机上的资源。,3、虚拟机的安全挑战:理论上,安全性可能是公共云上的问题,因为组织与其他客户共存,并且不知道他们是谁,或不知道管理云平台的员工是谁。人们一直担心他人会在虚拟机中窥探,会从那里提取信息或数据。但安全的主要风险更可能是事故。例如,组织可以在AWS上启动具有完全加密或其他安全保护的虚拟机。但是由于进程过载,组织的虚拟机将被移动到另一个服务器,甚至另一个物理位置,并且不会保证安全。这可以通过进行适当和重复的安全检查来缓解。,另一个潜在的安全问题是虚拟机的无序扩展,这是一种常见的现象。在这种情况下,用户会关闭许多虚拟机,而不会关闭原来打开的虚拟机。然后,组织会面临打开过多虚拟机的风险,而这些虚拟机其实是可以有效管理的。也许并不是所有的安全补丁都被应用。这是一个管理问题,而不是技术问题,所以这取决于组织来防止这个问题,而不是云计算提供商。,容器的优缺点,1、容器和通信控制:对于容器来说,在某些情况下,所有容器都可以默认相互通信。这意味着如果恶意用户或程序控制了一个容器,它就可以控制所有容器。开发人员应该只允许绝对需要它的容器之间的相互通信,并限制它们允许的通信类型。,2、容器与工作负载:由于组织在容器中创建自己的操作环境,所以需要执行内核级修补,并将所有更新应用于操作环境,这会增加组织的工作负载。需要为容器制定某种修补策略并加以实施。,2、容器和Linux子系统:由于容器不包含完整的操作系统,因此它们可以访问许多Linux内核子系统。docker使用libcontainers作为其容器技术,并访问容器外的重要命名空间。因此,在容器中拥有完全权限的任何人都可以访问底层操作系统,因此,开始在容器外部进行探索,也许可以窥探其他容器。解决此问题的方法是对容器进行非常仔细和彻底的配置,以确保它们被锁定。,虚拟机和容器用例,尽管它们有相似之处,但容器和虚拟机之间存在根本的使用差异。虚拟机适用于虚拟环境,而容器不需要虚拟机管理程序并使用它们运行的底层操作系统。,1、虚拟化环境:在虚拟化环境中,组织在管理程序上运行多个操作系统,该管理程序在一台计算机上管理I/O。在容器化环境中,它不是虚拟化的,也不使用管理程序。这并不是说组织不能在虚拟机中运行容器。但这不是最有效的方法。因此,尽管容器运行在单个操作系统实例上,也就像小型虚拟化一样,因为组织可以在一个物理系统上运行数十个或数百个容器。它是没有虚拟机管理程序的虚拟化,这可能是一件好事。这是因为管理程序受到性能限制,并且还可能阻止访问服务器中的某些组件,例如网络控制器。,2、DevOps:这是DevOps环境更喜欢容器进行开发测试构建的主要原因之一。它们的容器比虚拟机执行速度快,并且可以更好地访问系统资源。容器的主要优点是体积小,能够在服务器上运行数百甚至数千个,而不是几十个虚拟机。这取决于容器的另一个优势:它们在虚拟机上的模块化程度更高。应用程序可以在一个称为微服务的技术中分成多个容器。显然,容器和微服务可以很好地协同工作。这种组合有助于隔离问题和任何潜在的崩溃或瓶颈。如果问题是一个大型的单一的应用程序,那么解决本地化问题要容易得多。,3、更安全的环境:虚拟机是更安全环境的理想选择,因为虚拟机中包含所有内容。容器经常必须与底层操作系统或其他容器通信,这可能带来安全风险。在虚拟机中,一切都在同一个孤岛中。因此,如果组织需要一个完全孤立的、隔离的操作环境,那么采用虚拟机就是解决问题的方法。,4、老旧系统:虚拟机还允许托管旧版本的操作系统。例如,多年前为旧操作系统编写的应用程序可能无法在新一代操作系统中运行,并且组织可能没有使其资源实现现代化。因此,在虚拟机中运行旧操作系统,让应用程序保持不变。,未来,容器在技术上需要更多的工作才能达到成熟,尽管技术正在快速发展。而虚拟机更加成熟,并且由于其性质,将会更安全且更易于管理。容器技术(特别是其安全性)仍在不断发展。它还需要在负载平衡、可信连接以及在完整的操作系统中成熟的其他领域进行改进。这是当组织使用操作系统并将其减少到几兆字节时会发生的情况。,展望未来,预计Docker和谷歌公司的容器产品将会更加成熟,而虚拟机将继续专注于跨服务器的性能和可迁移性。无论如何,这两种技术将继续在云计算中发挥关键作用。,容器与虚拟机概览,,声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话: ; 。本站原创内容未经允许不得转载,或转载时需注明出处::西部数码资讯门户 » 容器 vs. 虚拟机,

  • 整合任务:虚拟机利用CPU中的高内存容量和多个核心处理器将许多应用程序和任务整合到一个物理硬件上。当虚拟化在十年前首次应用时,这就是它的主要用途。
  • 安全运营的未来:当时,数据中心运营商将应用程序和任务从10个或更多单实例服务器移动到一个虚拟化物理服务器上的情况并不少见。这是效率的一大进步。
  • 成熟的技术:所有主要的虚拟机管理程序供应商都提供自己的虚拟机品牌。该技术非常成熟。例如,如果物理服务器发生故障,管理程序将自动将其上运行的虚拟机移动到另一个物理服务器,而无需任何人工干预。十年前,工作人员必须人工完成这项工作。虚拟机还提供硬件抽象层(HAL),因此开发人员可以编写应用程序,而无需担心与底层硬件的兼容性。
  • 主要采用Linux:容器只包含一个应用程序和足够的操作系统来执行该应用程序,因此需要对核心操作系统进行一些额外的削减,以适应容器较小的占用空间。因此,容器主要是一种Linux现象,因为它是开放源代码和可修改的。
  • 编排平台:由于容器结构小巧,结构简单,因此需要对容器进行管理。这是通过所谓的编排平台完成的。容器编排管理容器的生命周期,因为它们经常比虚拟机更频繁地启动和关闭。编排可以(但不限于)提供和部署容器、可用性和故障转移、扩展或删除容器、在发生崩溃或重载时将容器移动到新主机,以及其他资源分配。
  • 大小:虚拟机和容器之间的主要区别在于大小。一个容器可以小到10MB,而虚拟机可以大到几GB。显然这会影响内存,而相同的物理服务器可以容纳比虚拟机更多的容器。
  • 结构:这两种技术的结构存在显着差异。虚拟机完全具有操作系统的所有部分,并在硬件支持下运行。容器需要一个底层操作系统,它使用虚拟内存支持进行隔离,为所有容器化应用程序提供基本服务。所以组织需要一个完整的操作系统,无论运行虚拟机或容器,它只是一个结构。当操作系统在虚拟机中时,将在容器层下运行。
  • 它们一起工作:由于它们的性质不同,容器和虚拟机并不会相互竞争,并且可能互相配合。组织可以在复杂的企业中使用它们,将虚拟机用于更大、更复杂的应用程序,以及用于小型、简单、单一用途应用程序的容器。

大数据生态系统迭代:容器要革“虚拟化”的命?

大数据时代面临着生态系统的不断更新迭代。程序猿和攻城狮们绞尽脑汁地想要降低硬件成本、开发出能保罗万象的系统。,,先是系统分身——虚拟机的出现,宿主系统和虚拟镜像灵活切换,十分酷炫!随着GO语言这位最强王者的出现,又有“神猿”编写出了docker这个貌似鲸鱼的可爱工具。服务器的资源共享进入了容器时代。如今很多头部的IT公司基于docker不断拓展新业务。随着微服务架构的横空出世,docker迅速与之组成战队,就更加飘飘然了。,这几年,容器将取代“虚拟化”的言论甚嚣尘上。事实上,没有绝对的技术,大数据的生态系统是鲜活的,不断更新且多向兼容。虚拟化和容器必将经历短期共存的过程,最终的生死存亡只能交给“生态圈”自主筛选。,就目前而言,容器比虚拟机更敏捷迅速,且容器支持混合和多云的采用。最重要的一点是容器具有很强的适应性:它可以轻松地集成于现有的IT实践当中。同时,容器化应用程序因其灵活共享的特性,大大提高了VM的CPU利用率,降低了硬件成本。但另一方面,每一个虚拟机都有自己的操作系统,驱动程序和应用程序,具有更强的隔离性。,VMs,二十年前,一家名为VMware的创业公司通过提供创建非物理机器虚拟化平台(如Linux,Windows等)来引入业务。,随着服务器处理能力的提高,基本应用程序无法最大限度地利用所有丰富的新资源。而虚拟机(VM)的出现,可以在物理服务器上运行软件,并模拟特定的硬件系统。其中管理程序是可以创建和运行虚拟机的软件或硬件。,使用不同操作系统的虚拟机可以在同一服务器上运行。例如,一个Unix虚拟机可以同时在能够运行Linux虚拟机的服务器上运行。每个虚拟机都有自己的应用程序、二进制文件和库。因此,企业可以保留旧计算机,添加新软件,无需重新购买能够运行Unix软件的新计算机。对于组织不断变化的需求而言,这是一个更简单、更便宜的解决方案。,服务器虚拟化是在虚拟化软件的帮助下,将物理服务器划分为若干个小型虚拟服务器的技术。在这个系统中,每个虚拟服务器将同时运行多个操作。Wikibon的首席分析师James Kobielus在最近的一次Dataversity采访中说:,服务器虚拟化的巨大优势在于可以更好地利用所投资的硬件资源。其面临的问题是:在不同平台的不同虚拟机中,管理不同的机器映像相当复杂,这可能会造成相应的管理负担。,容器(Containers),即使有可用的工具,虚拟机技术也很难被使用。例如,在虚拟世界中很难分离特定的、消耗资源的应用程序。微服务和容器化提供了一个更简单的选择。一个特定的应用程序代码(例如查询处理器和数据库索引逻辑中的后端数据)可以通过微服务的容器来分割不同的工作负载。,容器类似于虚拟机,来自其他系统的软件也可以在不同的服务器上运行。容器还允许应用程序与库和依赖项一起运行。也就是说,当虚拟机模拟硬件系统时,容器能够以核心操作系统为基础来运输自己的软件系统。,相较于虚拟机而言,容器占用空间更少。“虚拟机可能需要大量的资源开销,例如网络输入、输出、内存和磁盘。因为单个虚拟机运行自己的操作系统,而容器则不运行。”Kobielus说道。容器共享称为操作系统(OS)内核的东西,它访问操作系统核心。另外,支持容器的操作系统可以更小,并且具有比虚拟机的操作系统更少的特征。容器启动速度更快,仅使用启动整个操作系统所用内存的一小部分。显然,容器是下一个进化的步骤。Kobielus评论说:,容器化在过去五年里开始流行。这是一种做微服务、分发与平台无关的虚拟化服务器环境的方法,并且此方法有效。容器不仅可以在服务器中运行,还可以在客户机设备等上运行。容器化实际上是通常所谓的云计算的核心。,容器化技术长期以来一直是Linux的一部分。Kobielus表示,目前Docker是最受欢迎的容器之一,其他容器化技术,都被插入到Linux中了。基本上,Linux是操作系统,Linux容器可以通过Docker、Mesos和其他各种方式实现。“可以在docker容器中运行应用程序逻辑,然后独立地扩展它们。”,Docker支持在大多数Linux平台上都可用,可以轻松运行这些容器及其应用程序。它们基本上可以在任何Linux平台以及其他非Linux平台上运行。通过使用容器,可以在操作系统和底层硬件平台之间灵活地移动微服务。,Kubernetes,Kubernetes是一个开源的容器编排系统,旨在自动扩展、部署和管理容器化应用程序。容器编排系统最初由Google开发,但现在由Cloud Native计算基金会保存和维护。NetApp现在使用Kubernetes发行版,该发行版嵌入在其环境中,并在整个分布式云架构中协调存储资源和存储容器化。,StackPointCloud开发了一个基于Kubernetes的控制平面,用于管理联合可信存储集群,并在公共云服务提供商之间同步持久性存储容器。之后,大型数据存储供应商NetApp采用该技术并将其转变为NetApp Kubernetes服务,该服务允许客户在仅仅三次点击的情况下启动Kubernetes集群或存储集群。,“它可以扩展到被数百个用户使用,客户能够部署可以从单个用户界面扩展的容器,”Kobielus评论道。这就是存储的容器化。容器化的大部分过程都集中发生在应用程序和中间设备功能上。,据Kobielus说:“Kubernetes或Docker以及Linux容器的一个传统弱点就是它们不适合存储或不具有持久性。但是,在利用kubernetes和容器、docker等工具在云环境中实现数据持久性方面,wikibon提供了大量关于存储空间的创新。”,目前已有多个将存储容器化的例子(存储有时被描述为大数据分析的核心)。NetApps称其新的Kubernetes服务可以在AWS,Google Compute平台和Microsoft Azure中运行StackPoint引擎。(它还支持DigitalOcean,Packetclouds等)此外,Cloud Native Computing Foundation还有Rook,它用于非结构化数据的存储容器化和底板的编排。,Hadoop存储,大数据分析平台正在形成一种趋势。这与被用于存储的Hadoop有关。它被用于数据存储、数据存档和数据转换。同时也被用于数据治理。Hadoop是一个开源核心平台,许多企业将其与大数据一起使用,以达到各种目的。因此,Hadoop分布式文件存储已经变得非常流行。Hadoop目前被用于内部云、公共云和混合云中。Hadoop生态系统现在正处于容器化过程中。Red Hat是Kubernetes云中的主要实施者之一。Kobielus说道:,创新者基本上将Hadoop生态系统的所有组成部分纳入他们的计划,然后对其进行容器化,以便后期独立部署、扩展和管理。然后使用Kubernetes将它们以各种组合形式进行编排。,如今,很多企业都在应用这些数据分析的开源平台技术。“他们正在以各种各样的方式将它们结合起来,很多独立开源项目的原始开发人员并没有完全预料到这一点。”Kobielus评论道。所有这些平台都得到了容器化,这种趋势将会持续,在短期内不会很快改变。,声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话: ; 。本站原创内容未经允许不得转载,或转载时需注明出处::西部数码资讯门户 » 大数据生态系统迭代:容器要革“虚拟化”的命?,

盘一盘重构IT基础架构的“七种武器”

重新构建企业IT基础架构不是一件小事,其通常是由一系列不断变化的关键业务驱动因素引发的。如今企业的处境正是如此。简而言之,目前已经主导企业IT近30年的平台再也无法处理推动业务发展所需的工作负载。,数字化转型的核心是数据,而数据已成为了商业活动中最有价值的东西。长期以来,由于格式不兼容、传统数据库的局限性以及无法灵活地合并来自多个来源的数据导致企业未能充分利用数据。如今新出现的技术有望改变这种局面。,改进软件部署模型是消除数据使用障碍的一个主要环节。更高的“数据敏捷性”需要更加灵活的数据库和更具扩展性的实时流平台。事实上,至少有七种基础技术可以为企业提供灵活的实时“数据结构”。与正在被取代的技术不同,这七项软件创新具有可扩展性,可满足众多用户和用例的需求。对于企业而言这些技术可让他们做出更快且更明智的决策,从而带来更好的客户体验。,,1、NoSQL数据库,RDBMS已经在数据库市场占据了近30年的主导地位。然而面对不断增长的数据量和越来越快的数据处理速度,传统的关系型数据库已经显得力不从心。得益于出色的处理速度和可扩展性,NoSQL数据库正在逐步占据主导地位。对于文档数据库,它们从软件工程角度提供了一个更为简单的模式。这种简单的开发模式不仅可加快产品上市速度,还可帮助企业更快地响应客户和内部用户的需求。,2、实时流平台,实时对客户做出响应对于客户体验来说至关重要。这也是为什么以消费者为导向的行业在过去十年中被全面颠覆的原因。它们与企业实时响应用户的能力密切相关。告之客户自己将在24小时内提供解决方案是一种非常糟糕的客户体验,因为客户已经在执行他们在23小时前做出的决定了。然而转向实时模式需要事件流。,虽然由消息驱动的应用程序已经出现了多年时间,但是今天的流平台与它们的前辈相比规模更大且成本更低。流处理技术近期取得的进步为许多新的业务优化方法奠定了坚实的基础。及时响应客户只是一个方面。通过为软件开发和测试团队提供实时反馈环路,事件流还可以帮助企业提高产品质量,以及更加迅速地开发出新的软件。,3、docker和容器,容器对开发人员和运维人员以及企业本身都有很大的好处。传统的基础设施隔离方法是静态分区,即为每个工作负载分配一个独立且固定的资源(无论是物理服务器还是虚拟机)。静态分区的好处是更容易排除故障,但是提供大量未被充分利用的硬件需要很高的成本。例如,Web服务器平均仅使用10%左右的总可用计算资源。,容器技术最大的优势是它们能够创建一种新型隔离方式。那些对容器不甚了解的人可能会认为他们可以通过Ansible、Puppet或Chef等工具获得同样的优势,但是事实上这些技术相互间具有高度的互补性。此外,无论如何尝试,这些自动化工具都无法为那些在不同的基础设施和硬件设置之间自由移动工作负载创建所需的隔离性。同一容器可在本地数据中心的裸机硬件上运行,也可以在无需任何更改的情况下在公有云上的虚拟机中运行,而这是才是真正的工作负载移动性。,4、容器仓库,容器仓库对敏捷性至关重要。如果没有用于创建容器镜像的devops进程和用于存储容器镜像的仓库,那么每台运行容器的机器上都必须创建相应的容器。通过容器仓库,容器镜像可以从任意一台配置为从该仓库读取的机器上启动。在处理多个数据中心时,情况会变得十分复杂。如果在某个数据中心上创建了容器镜像,那么如何将该镜像移动到另一个数据中心上呢?理想情况下,企业可以通过聚合数据平台在数据中心之间映射该容器仓库。,,其中的一个关键问题是,在本地部署和云端之间进行映射与在两个本地数据中心之间映射存在着很大的差异。不过,无论企业使用的是物理基础设施还是云基础设施,聚合数据平台提供的功能均可解决这一问题。,5、容器编排,与静态硬件分区不同的是,每个容器似乎都有自己专用的操作系统。而与虚拟机不同的是,容器不需要对计算和内存进行静态分区。这使得管理员可以在服务器上启动大量容器,而不必担心内存不足。在使用像Kubernetes这样的容器编排工具时,管理员可以非常容易地启动、关闭和移动容器,或是在环境中的某个地方重新启动容器。,在引入了新的基础设施组件,例如MapR-DB或MongoDB文档数据库、MapR-ES或Apache Kafka等事件流平台、Kubernetes等编排工具以及用于在docker容器中创建和部署软件的devops流程之后,我们必须要将重点转向另一个问题,即我们应当在这些容器中部署些什么东西。下面就让我们了解一下微服务。,6、微服务,从历史上看,微服务并不是一个新出现的概念。今天的微服务与以前的不同之处在于NoSQL数据库、事件流、容器编排等技术可随着数以千计的微服务的创建而不断扩展。如果没有这些新的数据存储、事件流和基础设施编排方式,那么大规模部署微服务是不可能的。管理海量数据、事件和容器实例所需的基础设施将无法扩展到需要的级别。,所有的微服务都是为了提供敏捷性。微观上,一项服务通常由单个功能或一组功能组成。微服务的功能越小越单一,那么创建、测试和部署起来就越容易。这些服务必须互不挂钩,否则企业将无法享受到微服务承诺的灵活性。微服务可以依赖于其他服务,但通常是通过负载平衡的REST API或事件流。事件流可让企业通过请求和响应主题轻松跟踪事件的历史记录。这种方法对于故障排除具有很大的好处,因为整个请求流和请求中的所有数据都可以在随意回放。,由于微服务仅有很小的工作单元,并且由于彼此分离,因此随着时间的推移更换或升级服务几乎不会遇到什么障碍。在老模式下,由于对RPC等严重依赖,因此在进行更换可升级时必须要关闭所有连接,然后再重新建立连接。此外,负载平衡也一个很大的问题,因为手动配置非常容易出错。,7、函数即服务,我们已经看到微服务正逐步在整个行业中占据一席之地,同样我们也看到了无服务器计算正在兴起,或许将无服务器计算称之为函数即服务(FaaS)更为准确些。FaaS可通过将代码打包在轻量级架构中,内置在容器内,(基于某些触发器)进行按需执行并自动进行负载平衡的方式创建微服务,这些要归功于轻量级架构。FaaS的魅力在于它们可让开发人员几乎完全专注于函数。因此FaaS可以被视为由微服务催生而来的东西。,触发事件是FaaS的关键组成部分。没有它们,函数就无法被调用,只有当工作需要时资源才会被使用。自动调用函数是FaaS真正的价值所在。想象一下,每次读取用户的配置文件时都会生成一个审计事件,这是一个必须运行以通知安全团队的函数。更具体地说,它们可能只会过滤掉某些类型的记录。用户还可以对它们进行选择,因此它们毕竟是一个可完全定制的业务函数。值得关注的是,通过FaaS部署模式正确配置工作流会变得非常简单。,8、进行整合,触发服务背后的东西实际上只不过是事件流中的事件。虽然某些类型的事件会比其他事件被更频繁地用作触发器,但是对于任何事件来说只要用户希望它们成为触发器,那么它们都可以被作为触发器使用。触发器事件可以是文档更新,或是在新文档上运行OCR进程,也可以是向NoSQL数据库添加OCR进程文本。我们可以设想一些更为有意思的方式,如每当上传图像时都可以通过机器学习框架对图像进行识别和评分。这方面没有什么限制。在定义了触发器事件后,一旦事件发生,那么函数就会被触发,随后函数将开始工作。,FaaS将成为微服务使用的下一个阶段。然而,用户在部署FaaS时必须考虑一个重要因素,那就是供应商锁定。FaaS隐藏了具体的存储机制、特定的硬件基础设施以及编排方式,而这些对开发人员来说都是非常重要的东西。这种抽象会导致托管的FaaS产品为整个行业制造出有史以来最大的供应商锁定机会。由于API未标准化,因此用户在不彻底放弃原来运行的东西之前想从公有云上的FaaS产品中迁移走几乎是不可能的。如果用户通过聚合数据平台中的事件以一种更为系统的方式使用FaaS,那么在云提供商之间迁移将会变得更加容易。,作者:Jim Scott  MapR Technologies公司企业战略与架构总监; 编译:陈琳华,声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话: ; 。本站原创内容未经允许不得转载,或转载时需注明出处::西部数码资讯门户 » 盘一盘重构IT基础架构的“七种武器”,

从虚拟主机时代说起,详述Kubernetes带来的变革

在过去的几年中,Kubernetes已经成为了数不多的,使自己成为所属领域的行业标准的新技术之一。为了理解Kubernetes带来如此变革的原因,我们需要沿着虚拟化内存之路回顾一番。为方便叙述,本文中会简化各种体系结构类型,突出其核心特征和演变。,一对一(One to One),在微型计算机之初,物理硬件主要使用一个且仅有一个操作系统,而且大多数应用程序(如数据库,Web服务器和网站)通常只有一个最终用户应用程序——至少在生产中。,这意味着当企业需要交付或host一个“pet.com”和“food.com”最终用户应用程序时,通用的生产体系结构就是为每个应用程序提供专用服务器。随着最终应用程序负载需求的增加,水平层在其自身的服务器中被拆分; 但总的来说,一对一的关系仍然存在。,,虽然这对于更大、更简单的三层体系结构应用程序来说效果相当好,但是低服务(即每个应用程序的专用服务器)使资源利用率不够优化,扩展速度慢且成本高,因为添加新资源往往需要数天时间,且过量配置硬件资源是缓解处理峰值需求的常见做法。简而言之,那段时间,构建互联网服务是非常昂贵的。,为了提高服务粒度,大多数基础架构应用程序(如Web服务器和数据库)都提供了一些排序应用程序划分功能,允许一个基础架构应用程序进程支持多个前端应用程序。在Web服务器领域,这称为虚拟主机,其中一个Web服务器可以基于域名服务多个网站。而在数据库领域,单个数据库服务器可以在同一服务器/端口上提供完全隔离的逻辑数据库实例。,这些应用程序虚拟化功能允许企业部署逻辑上隔离的应用程序,或者至少在利用相同的物理资源时提供隔离的错觉。,与之前的模型一样,当吞吐量要求增加时,每个水平层都在自己的服务器中拆分,同时仍然为多个应用程序提供服务。某些应用程序(如数据库)开始提供更高级的水平扩展及其群集功能,允许一个逻辑数据库跨越多个资源,从而实现进一步的硬件专业化和更优化的资源利用。,虽然这些技术提高了服务粒度并提高了资源利用率,但却是以软件架构和部署的复杂性为代价的。这增加了复杂性和相互依赖性,使得扩展服务更像是完成一件复杂的艺术品,而不是一个优秀的工程。虽然早期的托管公司确实设法提供网络托管作为服务,但仍没有避免这种复杂性。,换句话说,这断时间,是互联网复杂而脆弱的日子。,虚拟机(Virtual Machine),随着Linux在服务器上越来越受欢迎,操作系统虚拟化也越来越受欢迎,这使得单个硬件可以托管多个操作系统。使用这种新模型,每个系统或应用程序可以拥有自己的操作系统和环境,同时仍然共享相同的硬件资源。,注:从技术上讲,虚拟机技术是60年代由IBM开创的。但公平地说,Linux(以及Windows,某些情况下)普及了操作系统虚拟化的概念。,这个新模型通过消除系统间的依赖性,最大限度地提高了资源利用率并简化了应用程序架构,恢复了原始形式,但这些新功能带来的最具变革性的结果是由如AWS等驱动的新IT运营模式的形成,此类服务抽象了所有硬件配置和网络复杂性,从而将连接的互联网操作系统作为服务提供。通过这些新的托管或内部部署服务,软件企业可以专注于他们最熟悉的工作: 软件,让少数硬件和网络专家构建并扩展这些服务的主干。,然而,随着托管基础架构服务变得越来越复杂,应用程序开始从传统的三层单块体系结构转向多服务体系结构(如,微服务),以具有成本效益的方式进行设计、部署和管理可扩展的多服务的应用程序变得相对复杂且具有高度特定于云。,容器,业界使用相当古老的Linux功能解决了微服务体系结构的虚拟机模型限制,该功能允许将操作系统进程封装到单个操作系统上的操作系统资源子集中,因此,虚拟化的下一个“章节”,容器化,诞生了,而且主要是由现在几乎无处不在的docker容器格式占据主流。,有了容器化,应用程序现在可以根据其需求使用最优的服务集进行架构设计,同时相信技术将以最有效的方式划分这些服务。过去在旧的物理硬件中需要几天,在虚拟机中需要几分钟,现在只需要几秒钟,占用的内存非常少(即合理)。,虽然容器化显着改善了服务粒度(即资源利用率),优化了复杂应用程序体系结构并且在开发和生产的过程中规范化了服务运行时,但这些新部件的庞大数量增加了部署管理复杂性和配置挑战。扩展生产系统时,仍然需要特定于云的技术来扩展底层虚拟机,这增加了决定在何处以及何时创建新服务容器的复杂性。,总之,容器化是有帮助的,但它需要其他一些东西来实现真正的价值主张。,Kubernetes,这就是Kubernetes走上舞台并完成这副“拼图”的地方。基于容器,Kubernetes是一种服务(有时称为“引擎”),它提供了一种以标准和环境可移植的方式描述、管理和运行包含其所有部分(即微服务)、交互和伸缩规则的完整系统的方法。,,以前开发、分段和生产环境差别很大,而Kubernetes的新方法规范化并简化了如何描述、运行和扩展整个系统,从而大大降低了构建和管理多服务系统的成本。,重要的是要理解所有这些技术的里程碑,都是演进式和附加式的,并且通常彼此协同使用。从纯粹的技术角度来看,革命是在“进化”而不是在“颠覆”。容器通常在虚拟机上运行,虚拟机仍在物理服务器上的主操作系统(称为主机)上运行,并且许多基础架构应用程序(如数据库,Web服务器和高速缓存)仍提供有用的、且有时是非常关键的、特定于应用程序的群集和分区能力。,将以上所有里程碑式的变化放在一起,我们可以看到所有虚拟化技术是如何附加演进的。,虽然Kubernetes是进化而非颠覆的结果,但其商业价值仍具有变革性。以下是Kubernetes的主要商业价值:,· 将Dev规范化为Ops:由于Kubernetes是独立于基础设施的(即它可以在云上、本地部署,甚至在笔记本电脑上运行),它提供了一种非常强大而灵活的方式来规范化开发和运营环境,这可能是实现“高速开发”中最重要的一个方法。,· 消除多服务开销:就在几年前,许多企业开始从整体架构转向微服务架构,而架构迁移确实带来了重大的开发和运营设置阻力。Kubernetes的设计从一开始就致力于以详尽而相对简单的方式解决这些要求,并且只要正确使用,就完全消除了这些开销。,· 最大限度地提高云端的可移植性: Kubernetes最令人印象深刻的成就之一就是在短短几年内掀起了整个行业的风潮,让所有人——从主要的云提供商到混合云技术提供商,都争相在新标准中加入支持。这使得Kubernetes成为云端可移植性的基石,并允许大多数现代云应用可以表达其系统的80%到90%,并且能够以云可移植的方式进行可伸缩性拓扑。,· 简化和标准化可扩展性:云可移植性的部分价值在于对通用和自定义伸缩规则进行标准化,这些规则使多服务系统的伸缩按指数级简化,同时在需要时仍然能够进行定制化。,笔者通常会以非常谨慎的态度对待最新的技术,因为它们虽然感到兴奋,但往往是相对短暂的。不过,Kubernetes是少数几个被巩固为Linux、OS虚拟化和Git等基础技术的技术之一因为它确实能带来看得见的价值。简而言之,Kubernetes可能是对于当今任何云应用程序开发企业而言最安全的投资,如果运用得当,它可以显著提高开发和交付的速度和质量。,原文来源:Medium 作者:Jeremy Chone,声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话: ; 。本站原创内容未经允许不得转载,或转载时需注明出处::西部数码资讯门户 » 从虚拟主机时代说起,详述Kubernetes带来的变革,

什么是微服务?关于轻量级软件开发的诠释

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话: ; 。本站原创内容未经允许不得转载,或转载时需注明出处::西部数码资讯门户 » 什么是微服务?关于轻量级软件开发的诠释,

使用微服务架构可以将大型应用程序分解为能横向扩展的轻量级应用程序。

创新需要敏捷和速度。那些从未担心过”千年虫”(Y2K)计算机系统漏洞的酷公司正在抛弃那些笨重老旧的软件,投资者们需要的是新一代重大创新。大批客户也在抛弃这些老旧软件。

解决方案是分解那些单体的大型应用程序,并且不再创建新的类似的应用程序。实现的方法是使用微服务架构,这种技术可以将大型应用程序分解为能横向扩展的轻量级应用程序。

 

微服务定义

微服务将功能分解为由RESTful API松散耦合的独立应用程序。例如,eBay在2006年开发的独立Java servlet应用程序,用于处理用户、项目、账户、反馈、交易和70多项其他要素,其中每一个逻辑功能应用程序都是一个微服务。

这些微服务都是独立的,并且不共享数据层,每一个都有自己的数据库和负载均衡器,隔离是微服务架构的关键要素。不同的微服务需要不同的扩展技术,例如,有些微服务可能使用关系型数据库,而其他的可能使用NoSQL数据库。

微服务的好处

微服务架构可以将内部架构非常复杂的大型单体应用程序,分解成小型的可独立扩展的应用程序。每个微服务都很小,开发、更新和部署也不太复杂。

在考虑微服务时,为什么首先要将这些功能都构建到单个应用程序中呢?至少在理论上,你可以想象为:它们可以存在于单独的应用程序和数据孤岛中,这不会有什么大问题。例如,如果在拍卖中收到两份投标,但只有四分之一的销售收到反馈,那么在一天中的任何时间里,投标服务的活跃程度至少是反馈应用程序的八倍。如果将这些组合到一个应用程序中,你最终运行并更新的代码将比经常需要的代码更多。在本质上,将不同的功能组分隔成不同的应用程序,自有其道理。

而且,围绕微服务架构进行开发可获得一些隐性优势,例如可与PaaS、docker和Linux容器等新技术紧密结合。

以微服务方式构建应用程序不仅可使应用程序更加灵活,更具可扩展性,它们还增加了构建应用程序的团队的可伸缩性。使用单一代码,你可以建立一支大型团队,虽然团队成员能够处理大段代码,但是他们始终彼此掣肘,随着代码整体数量的增长,开发速度会呈指数级下降。

不过,借助微服务架构,应用程序可由小型的、分散的开发团队进行构建,他们可以独立地工作和修改微服务。这样做的好处是升级服务和添加功能更加容易,软件和开发流程也将变得更加灵活。

微服务的挑战

但每种架构都有优点和缺点。虽然优点明显,但是微服务架构也带来了一系列难以解决的新问题–特别是记录、监控、测试和调试去中心化且松耦合的新应用程序。

如果有一个漏洞,那么哪个微服务应当对此负责呢?微服务之间的相互依存关系使得这个问题很难回答。微服务通常通过轻量级JSON REST API相互交换数据。与其前身XML-RPC和SOAP不同的地方是,REST接口的定义正变得越来越松散。虽然这些轻量级API更灵活,更容易扩展,但是它们增加了需要监控的新接口,这可能会产生中断或导致出现漏洞。

在单体应用程序中,你可以在代码中添加调试钩子,并在逻辑上逐步执行每个执行层,以发现问题区域。如果当数十个甚至数百个独立的微服务使用松散定义的API相互交换数据,那么在处理由这些微服务组成的网格时,你就不能再这么做了。

尽管如此,只要精心安排,这些困难是可以克服的。一些调试工具可以提供帮助,不过你可能需要根据其他部分的情况整合自己的解决方案。

微服务与容器和PaaS的关系

有一种常见的误解是,如果要使用微服务,那么你就需要使用PaaS或Linux容器。其实事实根本不是这么回事。你可以在没有微服务的情况下使用PaaS和Linux容器,也可以在没有PaaS或Linux容器的情况下使用微服务。它们彼此并不需要对方。

不过,它们之间确实能够很好地相互补充。无论是Heroku等公有云,还是Cloud Foundry或者OpenShift等私有云,PaaS环境都可以优化运行许多小型应用程序。像将330万行C ++应用程序移植到PaaS平台的事情永远都不会发生。

如果将应用程序分解为小的、可独立扩展的自足型应用程序,那么这些小型应用程序通常都非常适合在PaaS环境中运行。

同样,Linux容器更适合如微服务这样小型的无状态应用程序,而不是大型的单体应用程序。

毕竟,虚拟机和Linux容器之间最大和最明显的区别之一是缺少状态。虚拟机可通过配置保持其状态,而Linux容器的架构在本质上已经不再与基础映像有任何差异。你可以在Linux容器中安装状态文件夹,但是除非你提交更改,否则容器本身不会进行更改。

微服务架构的横向扩展理念促进了无共享、无状态应用程序的观念。它们不存储或修改底层文件系统。这就是为什么人们容易将微服务与Linux容器混为一谈,原因在于两者都不保留状态。

微服务与SOA的关系

微服务与SOA(面向服务的架构)关系密切,但又存在明显差异。从表面上看,SOA与SOAP和XML-RPC相关联,而微服务则与JSON相关联。但在某些方面,相关的API格式有着明显的外观差异。

同样,SOA使用企业服务总线,而微服务使用更轻量级的发布-订阅服务总线。尽管后者更为轻便,但原理是相似的。

微服务架构和SOA之间最大的区别在于微服务必须是可独立部署的,而SOA服务通常在部署整体中实现。

微服务是否适合你?

重要的是,你要记住,微服务是对”撞到看不见的天花板”的应对举措。在某些时候,传统的单体应用程序架构无法再进行扩展。几乎每个成功的软件项目都会遇到这些情况:数据库会变得异常庞大,或是代码行数多达数百万行,亦或是你再也无法快速添加功能。

如果你还没有”撞到看不见的天花板”。也就是说,如果传统的应用程序仍然运行良好,并且不需要太多改变。那么,只是为了部署微服务而部署,你将无法从中获得什么好处。

毕竟,微服务的开发过程不同于常规,并且具有难度。让所有这些新服务保持运行,有时会让人感觉像在空中将十几个球抛来抛去。部署Kubernetes等编排工具可以做一些调整,复杂的微服务架构有着自己的词典,它们能够涵盖你需要采用的所有新软件模式。

然而,微服务并不像SOA那样令人生畏。实际上,微服务实践甚至可以在最小的软件项目中实现,并且不需要抛弃所有旧代码重新开始。

如果你有一个大型应用程序失控了,但软件生命周期还有很长时间,创新速度也已经停滞不前,那么微服务可能正是你需要的东西。或者,如果你刚刚开始起步,那么从一开始就考虑构建基于微服务的应用程序是非常明智的。

eBay表示,微服务架构让他们具备了进行大规模扩展的能力,提高了代码的可扩展性和可维护性,促进了业务快速创新,创建了更快的产品交付模式,甚至连安全性也得到了增强。谷歌、亚马逊、推特、PayPal和Netflix都有类似的体验,为了更便捷地部署微服务,其中许多公司还开发了公共工具。

无论你是遇到了维护传统代码的问题并且一筹莫展,还是已经开始使用全新的应用程序,现在正是尝试用微服务方式进行应用程序开发的好时机。