技术解析:大型服务器高性能背后的价格因素探讨
一、引言
在信息技术迅猛发展的今天,大型服务器以其高性能、高可靠性、高扩展性等特点,成为了企业、政府机构乃至个人用户不可或缺的一部分。
这些高性能的大型服务器往往需要付出不菲的价格。
本文将从技术角度出发,深入解析大型服务器高性能背后的价格因素,并探讨其对用户的影响。
二、大型服务器高性能的技术基础
1. 先进的处理器技术
大型服务器的高性能首先得益于先进的处理器技术。
现代服务器普遍采用多核、多线程处理器,以提高数据处理能力和运行效率。
这些高性能处理器往往采用最新的制程技术,具有极高的集成度和性能。
2. 高速的内存和存储技术
大型服务器通常采用高速的内存和存储技术,如DDR4内存、SSD固态硬盘等。
这些技术使得服务器在读写数据、处理任务时更加迅速,提高了整体性能。
3. 高效的散热和电源管理
大型服务器在运行过程中会产生大量热量,因此高效的散热和电源管理技术是保证服务器稳定运行的关键。
高性能的散热设计和电源管理芯片可以有效降低服务器的能耗和热量,从而提高其运行效率。
三、价格因素解析
1. 硬件成本
大型服务器的硬件成本是其主要价格组成部分。
这包括处理器、内存、存储设备、电源、散热系统等部件的成本。
由于大型服务器需要采用高性能的硬件组件,因此其硬件成本往往较高。
2. 研发与设计成本
大型服务器的研发与设计成本也是不可忽视的一部分。
这包括研发人员的人力成本、研发设备的购置与维护费用、研发过程中的试验与测试费用等。
为了开发出高性能、高可靠性的服务器,企业需要投入大量的研发与设计成本。
3. 品牌与价值
品牌与价值也是影响大型服务器价格的重要因素。
知名品牌的大型服务器往往在品质、性能、售后服务等方面有更高的保障,因此其价格相对较高。
而一些新兴品牌或非主流品牌的大型服务器,由于其市场份额较小,往往需要通过降低价格来争取市场份额。
四、价格对用户的影响
1. 采购成本
高昂的价格使得用户在采购大型服务器时需要付出更多的成本。
对于企业和政府机构而言,这可能意味着需要投入更多的预算;对于个人用户而言,可能需要通过贷款或分期付款等方式来购买。
2. 运营成本
除了采购成本外,大型服务器的运营成本也不容忽视。
这包括电力消耗、散热、维护等方面的费用。
由于大型服务器功耗较高,需要投入较多的电力资源,同时需要定期进行维护和升级,这也增加了用户的运营成本。
3. 技术更新与投入
为了保持大型服务器的高性能,用户需要不断跟进技术的更新和升级。
这包括购买新的硬件设备、升级操作系统和应用程序等。
这些技术更新和投入往往需要花费大量的时间和金钱。
五、结论
大型服务器的高性能背后是复杂的技术和昂贵的价格。
用户在选择大型服务器时,需要充分考虑其性能和价格之间的平衡,并根据自身的需求和预算做出合理的选择。
同时,政府和相关机构也应关注大型服务器的价格问题,通过政策引导和市场监管,促进大型服务器市场的健康发展。
容器网络:盘点,解释与分析
虽然许多人倾向用Overlays作为解决跨主机容器网络的实现方法,但是如果您想根据您的环境做出正确的网络选型,容器网络的功能和类型差异还是很大的,值得更深入的理解。
有些类型的网络是容器引擎不可知的,有些类型的网络被锁定到特定的平台供应商或引擎。
一些类型主要关注组网的简单性,另一些类型可能关注功能的广度或IPv6支持以及组播能力。
哪一个适合您取决于您的应用程序需求,性能要求,工作负载布局(私有或公共云)等。
让我们回顾一下目前比较常见的容器网络。
本文主要关注当前容器网络类型的细分,包括:
曾经的容器网络
随着容器技术的进步与发展。
下面两种模式的网络方案经消失。
Links and Ambassadors
在使用Swarm实现多主机网络支持和编排之前,Docker从单主机网络开始,通过links促成网络连接,作为允许容器通过环境变量或/ etc / hosts文件条目发现彼此的机制,并传输容器之间的信息。
links的能力通常与 ambassador pattern 相结合,以便于跨主机连接容器,并降低被写死links的脆弱性。
这种方法的最大的问题是太静态了。
一旦创建了容器并定义了环境变量,如果相关的容器或服务移动到新的IP地址,则不可能更新这些变量的值。
Container-Mapped Networking
在这种网络模式下,一个容器重用(映射到)另一个容器的网络命名空间。
这种联网模式只能用以下运行Docker容器的方式使用:-net:container:some_container_name_or_id。
这个运行命令标志告诉Docker将这个容器的进程放在已经在另一个容器中创建的网络栈中。
当与第一个容器共享相同的IP和MAC地址和端口号时,新容器的进程仍然局限于自己的文件系统,进程列表和资源限制。
这两个容器上的进程将能够通过loopback接口相互连接。
这种联网方式对正在运行的容器执行诊断有用,并且容器缺少必要的诊断工具(例如curl或dig)。
可以创建具有必要诊断工具的临时容器并将其附加到第一容器的网络。
容器映射网络可以用于模拟pod式联网,其中多个容器共享相同的网络命名空间。
诸如共享本地主机通信和共享同一IP地址的优点是容器在同一个pod中运行的概念所固有的,这是rkt容器的行为。
现在的容器网络
None 是比较直接的容器接收一个网络堆栈,但是缺少外部网络接口。
然而,它会接收一个loopback接口。
当使用无网络或空网络时,rkt和Docker容器项目均提供类似的行为。
这种容器网络的模式具有许多用途,包括测试容器,为稍后的网络连接分配容器,并且分配给不需要外部通信的容器。
Linux网桥提供了主机内部网络,其中同一主机上的容器可以通信,但是分配给每个容器的IP地址不能从主机外部访问。
Bridge网络利用iptables进行NAT和端口映射,从而提供单主机网络。
桥接网络是默认的Docker网络类型(即,docker0),其中虚拟网络接口对的一端连接在网桥和容器之间。
这里有一个创建流程的例子:
1.在主机上设置网桥。
2.每个容器的命名空间都在该网桥中提供。
3.容器的ethX被映射到私有网桥接口。
4.使用带有NAT的iptables来映射每个私有容器和主机的公共接口。
NAT用于提供主机之外的通信。
虽然桥接网络解决端口冲突问题并为在一台主机上运行的容器提供网络隔离,但是会带来一些NAT相关的性能成本。
在这种方法中,新创建的容器与主机共享其网络命名空间,提供更高的性能(接近裸机),并且消除对NAT的需要; 然而,它确实遭受端口冲突问题。
虽然容器可以访问所有主机的网络接口,但除非在特权模式下部署,容器可能不会重新配置主机的网络堆栈。
主机网络是Mesos中使用的默认类型。
换句话说,如果框架没有指定网络类型,新的网络命名空间将不会与容器相关联,而是与主机网络相关联。
有时称为本地网络,主机网络在概念上很简单,使其更容易被理解,故障排除和使用。
Overlays使用网络隧道在主机之间传递通信。
这允许容器通过从一个主机到下一个主机隧道网络子网表现得好像它们在同一台机器上;实质上是一个网络跨越多个主机。
目前存在许多隧道技术,例如虚拟可扩展局域网VXLAN。
VXLAN是Docker libnetwork的首选隧道技术,其多主机网络在1.9版本中作为原生功能。
随着这种能力的引入,Docker选择利用HashiCorp的Serf作为gossip协议,选择它的邻居表交换和收敛时间的效率。
对于那些需要支持其他隧道技术的需求,Flannel可能是一个选择。
它支持udp,vxlan,host-gw,aws-vpc或gce。
每个云提供商隧道类型为您的帐户或者VPC在提供商的路由表中创建路由。
对公共云的支持对于overlay驱动尤其重要,因为overlay能比较好的解决混合云场景,并提供扩展和冗余,而无需打开公共端口。
多主机网络在启动Docker守护程序以及键值存储时需要额外的参数。
某些overlay依赖于分布式键值存储。
如果你正在做容器编排,你已经有一个分布式的键值存储。
overlay层侧重于跨主机通信挑战。
在同一主机上连接到两个不同overlay网络的容器不能通过本地网桥彼此通信 – 它们是彼此分段的。
底层网络驱动将主机接口(即,eth0处的物理网络接口)直接暴露给在主机上运行的容器或VM。
两个这样的底层驱动就是MACVLAN和IPVLAN。
网络工程师非常熟悉MACVLAN和IPVLAN驱动的操作和功能。
这两个网络驱动在概念上比桥接网络更简单,不需要端口映射,并且更高效。
此外,IPVLAN具有与许多网络工程师比较青睐的L3模式。
考虑到大多数公共云中的限制(或缺乏能力),当您有本地工作负载,安全问题,流量优先级或合规要求时,底层特别有用。
不同于每个VLAN需要一个网桥,底层网络允许每个子接口一个VLAN。
MACVLAN允许在主机的单个物理接口后面创建多个虚拟网络接口。
每个虚拟接口具有唯一的MAC和IP地址分配,有一个限制:IP地址需要在与物理接口相同的广播域。
虽然许多网络工程师可能更熟悉子接口这个术语(不要与辅助接口混淆),但用于描述MACVLAN虚拟接口的说法通常是上层或下层接口。
MACVLAN网络是一种消除对LINUX网桥需要的方式,NAT和端口映射,允许您直接连接到物理接口。
MACVLAN每个容器使用唯一的MAC地址,这可能导致启用了防止MAC欺骗的这种安全策略(每个物理交换机接口仅允许一个MAC地址)的网络交换机出现问题。
容器流量被过滤掉,不能与底层主机通信,将主机和它上面运行的容器完全隔离。
主机无法到达容器。
容器与主机隔离。
这对服务提供者或多租户场景有用,并且具有比网桥模型更好的隔离。
MACVLAN需要混杂模式; MACVLAN有四种工作模式,Docker 1.12只支持桥接模式。
MACvlan桥接模式和IPvlan L2模式在功能上等效。
两种模式都允许广播和组播流量进入。
这些底层协议的设计考虑了内部使用案例。
您的公有云里程将有所不同,因为它们的虚拟机接口上大多数不支持混合模式。
注意事项:MACVLAN桥接模式为每个容器分配唯一的MAC地址或许是跟踪网络流量和端到端可见性的福音; 然而,对于具有512个唯一MAC地址的上限的典型网络接口卡(NIC),例如BR OADCOM,应该考虑这个上限。
IPVLAN与MACVLAN类似,它创建新的虚拟网络接口并为每个IP地址分配一个唯一的IP地址。
区别在于,相同的MAC地址用于主机上的所有pod和容器 – 物理接口的相同MAC地址。
对这种行为的需要主要由以下事实驱动:许多交换机的通常配置的安全状态是关闭具有来自多于一个MAC地址的业务的交换机端口。
最佳运行内核是4.2或更新版本,IPVLAN可以在L2或L3模式下运行。
像MACVLAN一样,IPVLAN L2模式要求分配给子接口的IP地址与物理接口在同一子网中。
然而,IPvlan L3模式要求容器网络和IP地址在与父物理接口不同的子网上。
Linux主机上的802.1q配置(使用IP Link创建时)是短暂的,因此大多数运营商使用网络启动脚本来保持配置。
对于运行底层驱动程序和暴露API的程序化配置VLAN的容器引擎,自动化可以对其改进。
例如,当在机架交换机顶部创建新VLAN时,这些VLAN可以通过暴露的容器引擎被推入Linux主机。
MACVLAN AND IPVLAN
当在这两种底层类型之间进行选择时,请考虑是否需要网络才能看到单个容器的MAC地址。
对于地址解析协议(ARP)和广播通信,无论是底层驱动程序的L2模式,就像连接到交换机的服务器那样,通过将大量使用802.1D分组学习操作。
然而,在IPVLAN L3模式中,网络堆栈在容器内处理,不允许多播或广播流量。
在这个意义之上,IPVLAN L3模式会按照您期望L3路由器的行为运行。
注意,上游L3路由器需要知道使用IPvlan创建的网络。
网络广告和重新分配网络仍然需要完成。
今天,Docker正在尝试边界网关协议(BGP)。
虽然静态路 由可以在机架交换机的顶层创建,就像goBGP项目如雨后春笋般成立作为一个容器生态友好的方式来提供对等邻居和路由交换功能。
尽管在给定主机上支持多种联网模式,但是MACVLAN和IPVLAN不能同时在相同的物理接口上使用。
总之,如果你习惯于在主机上运行trunks,可以用L2模式。
如果你主要关注规模,L3则具有大规模的潜力。
DIRECT ROUTING
出于同样的原因,IPVLAN L3模式被网络工程师所青睐,他们可能选择专注于在第3层解决寻址网络复杂性。
这种方法受益于利用现有的网络基础设施来管理容器网络。
集中在L3的容器网络解决方案使用路由协议提供连接,这可以说更容易与现有的数据中心基础设施,连接容器,VM和裸机服务器进行相互操作。
此外,L3网络扩展和提供在过滤和隔离网络流量方面的细粒度控制。
CALICO就是一个这样的项目,使用BGP为每个网络分配路由 – 特别是对使用/ 32的工作负载,这允许它与现有的数据中心基础设施无缝集成,并且不需要Overlays。
没有Overlays或封装带来的开销,结果是可以组建具有卓越的性能和规模的网络。
容器的可路由IP地址将IP地址与端口暴露于外部世界。
被培训并习惯于使用路由协议部署,诊断和操作网络的网络工程师可能发现直接路由更容易消化。
然而,值得注意的是,CALICO不支持重叠的IP地址。
FAN NETWORKING
Fan网络是实现访问更多IP地址的一种方式,从一个分配的IP地址扩展到250个IP地址。
这是一种获得更多IP而不需要重叠网络的高效方法。
当在公有云中运行容器时,这种类型的网络特别有用,其中单个IP地址被分配给主机并且启动附加网络是禁止的,或者运行另一个负载均衡实例是昂贵的。
POINT-TO-POINT
点对点可能是CoreOS rkt使用的最简单的网络类型和默认网络。
默认情况下,使用NAT或IPMASQ,它将创建一个虚拟以太网对,将一个放在主机上,另一个放在容器pod中。
点到点网络利用iptables不仅为入站流量提供端口转发,而且通过loopback接口为pod中的其他容器之间的内部通信提供端口转发。
Capabilities
在连接性之外,需要考虑对其他网络功能和网络服务的支持。
容器网络的许多模式利用NAT和端口转发或有意避免它们的使用。
选择网络时,IP地址管理IPAM,组播,广播,IPv6,负载均衡,服务发现,策略,服务质量,高级过滤和性能都是需要额外考虑的。
问题是这些能力是否受到支持。
即使您的runtime,编排引擎或插件支持容器网络功能,您的基础架构也可能不支持该功能。
虽然一些2级公有云提供商提供对IPv6的支持,但是在顶级公有云中却缺乏对IPv6的支持,这也增加了用户对其他网络类型(例如Overlays和FAN网络)的需求。
在IPAM方面,为了提高易用性,大多数容器runtime引擎默认使用host-local为容器分配地址,因为它们已连接到网络。
host-local IPAM涉及定义要选择的固定IP地址块。
跨容器网络项目普遍支持动态主机配置协议(DHCP)。
容器网络模型(CNM)和容器网络接口(CNI)都具有用于与IPAM系统集成的IPAM内置和插件框架 – 这是在许多现有环境中采用的关键能力。
想了解更多关于容器网络模型(CNM)和容器网络接口(CNI)的技术细节请参考忘期文章: 容器网络聚焦:CNM和CNI
文末福利:请大家关注Wise2C公众号并回复【进群】,睿云小助手会第一时间拉你进入【 Docker企业落地实践群】,我们分享的各个企业案例项目的技术专家与用户代表,正在敬候您的光临,期待大家就项目的更多细节与疑问与群里的大牛们进行咨询探讨。
需要了解更多有关睿云智合的客户项目细节,请在Wise2C公众号中最佳实践菜单中查看。
干货放送系列之(一): 富德生命人寿容器技术应用实战案例
干货放送系列之(二): 中国平安容器技术应用实战案例
干货放送系列之(三): 民生人寿容器技术应用实战案例
干货放送系列之(四): 某中型人寿保险公司系统架构改造规划咨询实战案例
年度盘点系列: 年度盘点 | 2016年金融行业容器技术应用 – 保险篇
年度盘点系列: 年度盘点 | 2016年金融行业容器技术应用 – 银行篇
若需要了解更多有关Wise系列PaaS产品的详情,请与我们的市场团队联系:
微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计
基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发、部署、运维管理、持续开发持续集成的流程。
平台提供基础设施、中间件、数据服务、云服务器等资源,开发人员只需要开发业务代码并提交到平台代码库,做一些必要的配置,系统会自动构建、部署,实现应用的敏捷开发、快速迭代。
在系统架构上,PaaS云平台主要分为微服务架构、Docker容器技术、DveOps三部分,这篇文章重点介绍微服务架构的实施。
如果想学习Java工程化、高性能及分布式、深入浅出。
微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
实施微服务需要投入大量的技术力量来开发基础设施,这对很多公司来说显然是不现实的,别担心,业界已经有非常优秀的开源框架供我们参考使用。
目前业界比较成熟的微服务框架有Netflix、Spring Cloud和阿里的Dubbo等。
Spring Cloud是基于Spring Boot的一整套实现微服务的框架,它提供了开发微服务所需的组件,跟Spring Boot一起使用的话开发微服务架构的云服务会变的很方便。
Spring Cloud包含很多子框架,其中Spring Cloud Netflix是其中的一套框架,在我们的微服务架构设计中,就使用了很多Spring Cloud Netflix框架的组件。
Spring Cloud Netflix项目的时间还不长,相关的文档资料很少,博主当时研究这套框架啃了很多英文文档,简直痛苦不堪。
对于刚开始接触这套框架的同学,要搭建一套微服务应用架构,可能会不知道如何下手,接下来介绍我们的微服务架构搭建过程以及 需要那些 框架或组件来支持微服务架构。
为了直接明了的展示微服务架构的组成及原理,画了一张系统架构图,如下:
从上图可以看出,微服务访问大致路径为:外部请求 → 负载均衡 → 服务网关(GateWay)→ 微服务 → 数据服务/消息服务。
服务网关和微服务都会用到服务注册和发现来调用依赖的其他服务,各服务集群都能通过配置中心服务来获得配置信息。
服务网关(GateWay)
网关是外界系统(如:客户端浏览器、移动设备等)和企业内部系统之间的一道门,所有的客户端请求通过网关访问后台服务。
为了应对高并发访问,服务网关以集群形式部署,这就意味着需要做负载均衡,我们采用了亚马逊EC2作为虚拟云服务器,采用ELB(Elastic Load Balancing)做负载均衡。
EC2具有自动配置容量功能,当用户流量达到尖峰,EC2可以自动增加更多的容量以维持虚拟主机的性能。
ELB弹性负载均衡,在多个实例间自动分配应用的传入流量。
为了保证安全性,客户端请求需要使用https加密保护,这就需要我们进行SSL卸载,使用Nginx对加密请求进行卸载处理。
外部请求经过ELB负载均衡后路由到GateWay集群中的某个GateWay服务,由GateWay服务转发到微服务。
服务网关作为内部系统的边界,它有以下基本能力:
1、动态路由:动态的将请求路由到所需要的后端服务集群。
虽然内部是复杂的分布式微服务网状结构,但是外部系统从网关看就像是一个整体服务,网关屏蔽了后端服务的复杂性。
2、限流和容错:为每种类型的请求分配容量,当请求数量超过阀值时抛掉外部请求,限制流量,保护后台服务不被大流量冲垮;党内部服务出现故障时直接在边界创建一些响应,集中做容错处理,而不是将请求转发到内部集群,保证用户良好的体验。
3、身份认证和安全性控制:对每个外部请求进行用户认证,拒绝没有通过认证的请求,还能通过访问模式分析,实现反爬虫功能。
4、监控:网关可以收集有意义的数据和统计,为后台服务优化提供数据支持。
5、访问日志:网关可以收集访问日志信息,比如访问的是哪个服务?处理过程(出现什么异常)和结果?花费多少时间?通过分析日志内容,对后台系统做进一步优化。
我们采用Spring Cloud Netflix框架的开源组件Zuul来实现网关服务。
Zuul使用一系列不同类型的过滤器(Filter),通过重写过滤器,使我们能够灵活的实现网关(GateWay)的各种功能。
如果想学习Java工程化、高性能及分布式、深入浅出。
微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
服务注册与发现
由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构,服务之间通过轻量机制进行通信,这就引入了服务注册与发现的问题,服务的提供方要注册报告服务地址,服务调用放要能发现目标服务。
我们的微服务架构中使用了Eureka组件来实现服务的注册与发现。
所有的微服务(通过配置Eureka服务信息)到Eureka服务器中进行注册,并定时发送心跳进行 健康 检查,Eureka默认配置是30秒发送一次心跳,表明服务仍然处于存活状态,发送心跳的时间间隔可以通过Eureka的配置参数自行配置,Eureka服务器在接收到服务实例的最后一次心跳后,需要等待90秒(默认配置90秒,可以通过配置参数进行修改)后,才认定服务已经死亡(即连续3次没有接收到心跳),在Eureka自我保护模式关闭的情况下会清除该服务的注册信息。
所谓的自我保护模式是指,出现网络分区、Eureka在短时间内丢失过多的服务时,会进入自我保护模式,即一个服务长时间没有发送心跳,Eureka也不会将其删除。
自我保护模式默认为开启,可以通过配置参数将其设置为关闭状态。
Eureka服务以集群的方式部署(在博主的另一篇文章中详细介绍了Eureka集群的部署方式),集群内的所有Eureka节点会定时自动同步微服务的注册信息,这样就能保证所有的Eureka服务注册信息保持一致。
那么在Eureka集群里,Eureka节点是如何发现其他节点的呢?我们通过DNS服务器来建立所有Eureka节点的关联,在部署Eureka集群之外还需要搭建DNS服务器。
当网关服务转发外部请求或者是后台微服务之间相互调用时,会去Eureka服务器上查找目标服务的注册信息,发现目标服务并进行调用,这样就形成了服务注册与发现的整个流程。
Eureka的配置参数数量很多,多达上百个,博主会在另外的文章里详细说明。
微服务部署
微服务是一系列职责单一、细粒度的服务,是将我们的业务进行拆分为独立的服务单元,伸缩性好,耦合度低,不同的微服务可以用不同的语言开发,每一个服务处理的单一的业务。
微服务可以划分为前端服务(也叫边缘服务)和后端服务(也叫中间服务),前端服务是对后端服务做必要的聚合和剪裁后暴露给外部不同的设备(PC、Phone等),所有的服务启动时都会到Eureka服务器进行注册,服务之间会有错综复杂的依赖关系。
当网关服务转发外部请求调用前端服务时,通过查询服务注册表就可以发现目标服务进行调用,前端服务调用后端服务时也是同样的道理,一次请求可能涉及到多个服务之间的相互调用。
由于每个微服务都是以集群的形式部署,服务之间相互调用的时候需要做负载均衡,因此每个服务中都有一个LB组件用来实现负载均衡。
微服务以镜像的形式,运行在Docker容器中。
Docker容器技术让我们的服务部署变得简单、高效。
传统的部署方式,需要在每台服务器上安装运行环境,如果我们的服务器数量庞大,在每台服务器上安装运行环境将是一项无比繁重的工作,一旦运行环境发生改变,就不得不重新安装,这简直是灾难性的。
而使用Docker容器技术,我们只需要将所需的基础镜像(jdk等)和微服务生成一个新的镜像,将这个最终的镜像部署在Docker容器中运行,这种方式简单、高效,能够快速部署服务。
每个Docker容器中可以运行多个微服务,Docker容器以集群的方式部署,使用Docker Swarm对这些容器进行管理。
我们创建一个镜像仓库用来存放所有的基础镜像以及生成的最终交付镜像,在镜像仓库中对所有镜像进行管理。
服务容错
微服务之间存在错综复杂的依赖关系,一次请求可能会依赖多个后端服务,在实际生产中这些服务可能会产生故障或者延迟,在一个高流量的系统中,一旦某个服务产生延迟,可能会在短时间内耗尽系统资源,将整个系统拖垮,因此一个服务如果不能对其故障进行隔离和容错,这本身就是灾难性的。
我们的微服务架构中使用了Hystrix组件来进行容错处理。
Hystrix是Netflix的一款开源组件,它通过熔断模式、隔离模式、回退(fallback)和限流等机制对服务进行弹性容错保护,保证系统的稳定性。
1、熔断模式:熔断模式原理类似于电路熔断器,当电路发生短路时,熔断器熔断,保护电路避免遭受灾难性损失。
当服务异常或者大量延时,满足熔断条件时服务调用方会主动启动熔断,执行fallback逻辑直接返回,不会继续调用服务进一步拖垮系统。
熔断器默认配置服务调用错误率阀值为50%,超过阀值将自动启动熔断模式。
服务隔离一段时间以后,熔断器会进入半熔断状态,即允许少量请求进行尝试,如果仍然调用失败,则回到熔断状态,如果调用成功,则关闭熔断模式。
2、隔离模式:Hystrix默认采用线程隔离,不同的服务使用不同的线程池,彼此之间不受影响,当一个服务出现故障耗尽它的线程池资源,其他的服务正常运行不受影响,达到隔离的效果。
例如我们通过andThreadPoolKey配置某个服务使用命名为TestThreadPool的线程池,实现与其他命名的线程池隔离。
3、回退(fallback):fallback机制其实是一种服务故障时的容错方式,原理类似Java中的异常处理。
只需要继承HystixCommand并重写getFallBack()方法,在此方法中编写处理逻辑,比如可以直接抛异常(快速失败),可以返回空值或缺省值,也可以返回备份数据等。
当服务调用出现异常时,会转向执行getFallBack()。
有以下几种情况会触发fallback:
1)程序抛出非HystrixBadRequestExcepption异常,当抛出HystrixBadRequestExcepption异常时,调用程序可以捕获异常,没有触发fallback,当抛出其他异常时,会触发fallback;
2)程序运行超时;
3)熔断启动;
4)线程池已满。
4、限流: 限流是指对服务的并发访问量进行限制,设置单位时间内的并发数,超出限制的请求拒绝并fallback,防止后台服务被冲垮。
Hystix使用命令模式HystrixCommand包装依赖调用逻辑,这样相关的调用就自动处于Hystrix的弹性容错保护之下。
调用程序需要继承HystrixCommand并将调用逻辑写在run()中,使用execute()(同步阻塞)或queue()(异步非阻塞)来触发执行run()。
动态配置中心
微服务有很多依赖配置,某些配置参数在服务运行期间可能还要动态修改,比如:根据访问流量动态调整熔断阀值。
传统的实现信息配置的方法,比如放在xml、yml等配置文件中,和应用一起打包,每次修改都要重新提交代码、打包构建、生成新的镜像、重新启动服务,效率太低,这样显然是不合理的,因此我们需要搭建一个动态配置中心服务支持微服务动态配置。
我们使用Spring Cloud的configserver服务帮我们实现动态配置中心的搭建。
我们开发的微服务代码都存放在git服务器私有仓库里面,所有需要动态配置的配置文件存放在git服务器下的configserver(配置中心,也是一个微服务)服务中,部署到Docker容器中的微服务从git服务器动态读取配置文件的信息。
当本地git仓库修改代码后push到git服务器仓库,git服务端hooks(post-receive,在服务端完成代码更新后会自动调用)自动检测是否有配置文件更新,如果有,git服务端通过消息队列给配置中心(configserver,一个部署在容器中的微服务)发消息,通知配置中心刷新对应的配置文件。
这样微服务就能获取到最新的配置文件信息,实现动态配置。
以上这些框架或组件是支撑实施微服务架构的核心,在实际生产中,我们还会用到很多其他的组件,比如日志服务组件、消息服务组件等等,根据业务需要自行选择使用。
在我们的微服务架构实施案例中,参考使用了很多Spring Cloud Netflix框架的开源组件,主要包括Zuul(服务网关)、Eureka(服务注册与发现)、Hystrix(服务容错)、Ribbon(客户端负载均衡)等。
这些优秀的开源组件,为我们实施微服务架构提供了捷径。
如果想学习Java工程化、高性能及分布式、深入浅出。
微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
大牛有形:股票技术分析序言
在股市中,我曾对众多投资者进行了深入研究,发现许多股民的炒股之路充满艰辛。
他们或是频繁买卖,犹如坐电梯般忽上忽下,对何时卖出、哪种K线形态代表卖出时机一无所知,股价上涨时贪心不止,错过卖出时机;或是初次入场就被套牢,不知如何设置止损点,一旦陷入就难以割舍,导致损失不断扩大,深陷“毒股”、“霉股”之中。
有的投资者追涨杀跌,资金日日缩水,心情焦虑,辛辛苦苦工作赚取微薄收入,却在股市中轻易赔光,甚至难以翻身。
有些投资者如同无头苍蝇,盲目跟风,涨跌无常,对股票涨跌的原因一窍不通。
这样下去,亏损是必然的。
为了帮助大家改变这种状况,我将多年炒股心得汇集成《大牛有形》,旨在助大家盈利,告别亏损,实现财富增值。
本书以通俗易懂的方式,用周K线中的半年线和60天均线的走势、MACD技术指标等作为判断依据,通过口诀和股谚讲述股市理论。
如周K线的半年线和60天均线走平微上翘,意味着牛股来临;MACD成为“不肯去观音菩萨”预示小牛转大牛;借助MACD与0轴线的关系,以及“七大法宝”来指导操作;关注均线走势,如五条均线向上形成抛物线,意味着大金牛在望。
此外,书中还强调了多周期共振、突破压力线等策略,以及成交量分析中的关键信号。
例如,成交量持续增长的股票是投资首选。
股票疯涨后的5天均线与10天均线关系,决定是否持有;以及关注股票价格形态变化,如“黑马通道”的开启和关闭等。
基于我10年的股市经验,我曾经历过牛市赚钱,但熊市亏损的教训。
我深知技术的重要性,因此在书中提供了127幅股票运行轨迹图,以直观的方式解析股票走势。
我鼓励读者从自己的错误中学习,运用我的理论,提升炒股技巧,最终在股市中取得成功。