引言
在当今数字化时代,企业面临着对敏捷性和可扩展性需求不断增长的挑战。云计算已成为满足这些需求的关键驱动力,因为云原生技术提供了构建和管理弹性、可扩展和敏捷基础设施所需的工具。
容器和微服务的崛起
容器和微服务是云原生架构的基础。容器是一种轻量级虚拟化方法,允许在单个操作系统上同时运行多个隔离的应用程序。微服务是一种将应用程序分解为较小、独立组件的设计方法,这些组件可以轻松开发、部署和扩展。
容器的优势
微服务的优势
- 模块化:微服务允许开发人员专注于构建应用程序的特定功能。
- 敏捷性:微服务可以独立开发、部署和扩展,从而实现更快速和更灵活的开发过程。
- 可扩展性:微服务可以根据需要轻松地横向扩展或纵向扩展,以满足应用程序需求。
云原生应用程序的特性
云原生应用程序是专门为云环境设计的应用程序,利用云原生技术的优势,包括:
- 弹性:云原生应用程序能够自动适应故障和变化。
构建云原生基础设施
构建云原生基础设施涉及采用以下关键组件:
容器编排平台
容器编排平台负责管理和调度容器,例如 Kubernetes 和 Docker Swarm。
微服务网格
微服务网格提供微服务之间通信和治理所需的网络和安全服务,例如 Istio 和 Linkerd。
DevOps 工具
DevOps 工具实现持续集成和持续交付 (CI/CD) 流程,例如 Jenkins 和 GitLab。
云服务
云服务提供基础设施和服务,例如计算、存储和数据库,例如 AWS Elastic Compute Cloud (EC2) 和 Google Cloud Platform (GCP)。
案例研究
一家电子商务公司部署了一个云原生基础设施,包括容器、微服务和一个微服务网格。此基础设施实现了以下好处:
- 应用程序开发时间缩短 50%:模块化和独立的微服务简化了开发过程。
- 基础设施成本降低 30%:容器化和自动化的云服务最大限度地提高了资源利用率。
- 应用程序可用性提高 99.9%:自动故障转移和弹性机制确保了应用程序的持续可用性。
结论
容器、微服务和云原生应用程序是构建现代、敏捷且可扩展云基础设施的关键技术。通过采用这些技术,企业可以提高应用程序开发速度、降低基础设施成本并提高应用程序可用性。对于需要满足不断变化的业务需求的企业来说,云原生基础设施是必不可少的。
5种微服务注册中心如何选型?这几个维度告诉你!
1、前言
微服务的注册中心目前主流的有以下四种:
Kubernetes
那么实际开发中到底如何选择呢?这是一个值得深入研究的事情,别着急,今天陈某就带大家深入了解一下这四类注册中心以及如何选型的问题。
这是《SpringCloud进阶》专栏第四篇文章,往期文章如下:
五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?
openFeign夺命连环9问,这谁受得了?
阿里面试这样问:Nacos、Apollo、Config配置中心如何选型?这10个维度告诉你!
2、为什么需要注册中心?
随着单体应用拆分,首当面临的第一份挑战就是服务实例的数量较多,并且服务自身对外暴露的访问地址也具有动态性。可能因为服务扩容、服务的失败和更新等因素,导致服务实例的运行时状态经常变化,如下图:
商品详情需要调用营销、订单、库存三个服务,存在问题有:
营销、订单、库存这三个服务的地址都可能动态的发生改变,单纯只使用配置的形式需要频繁的变更,如果是写到配置文件里面还需要重启系统,这对生产来说太不友好了
服务是集群部署的形式调用方负载均衡如何去实现
解决第一个问题办法就是用我们用伟人说过一句话,没有什么是加一个中间层解决不了的,这个中间层就是我们的注册中心。
解决第二问题就是关于负载均衡的实现,这个需要结合我们中间层老大哥来实现。
3、如何实现一个注册中心?
对于如何实现注册中心这个问题,首先将服务之间是如何交互的模型抽象出来,我们结合实际的案例来说明这个问题,以商品服务为例:
当我们搜索商品的时候商品服务就是提供者;
当我们查询商品详情的时候即服务的提供者又是服务的消费者,消费是订单、库存等服务;由此我们需要引入的三个角色就是:中间层(注册中心)、生产者、消费者,如下图:
整体的执行流程如下:
在服务启动时,服务提供者通过内部的注册中心客户端应用自动将自身服务注册到注册中心,包含主机地址、服务名称等等信息;
在服务启动或者发生变更的时候,服务消费者的注册中心客户端程序则可以从注册中心中获取那些已经注册的服务实例信息或者移除已下线的服务;
上图还多一个设计缓存本地路由,缓存本地路由是为了提高服务路由的效率和容错性,服务消费者可以配备缓存机制以加速服务路由。
更重要的是,当服务注册中心不可用时,服务消费者可以利用本地缓存路由实现对现有服务的可靠调用。
在整个执行的过程中,其中有点有一点是比较难的,就是服务消费者如何及时知道服务的生产者如何及时变更的,这个问题也是经典的生产者消费者的问题,解决的方式有两种:
发布-订阅模式:服务消费者能够实时监控服务更新状态,通常采用监听器以及回调机制,经典的案例就是Zookeeper;
主动拉取策略:服务的消费者定期调用注册中心提供的服务获取接口获取最新的服务列表并更新本地缓存,经典案例就是Eureka;
对于如何选择这两种方式,其实还有一个数据一致性问题可以聊聊,比如选择定时器肯定就抛弃了一致性,最求的是最终一致,这里就不深入展开了,另外你可能还会说服务的移除等等这些功能都没介绍,在我看来那只是一个附加功能,注册中心重点还是在于服务注册和发现,其他都是锦上添花罢了。
负载均衡的实现有两种方式:
服务端的负载均衡;
客户端的负载均衡;对于实现的方案来说本质上是差不多的,只是说承接的载体不一样,一个是服务端,一个客户端,如下图:
服务端的负载均衡,给服务提供者更强的流量控制权,但是无法满足不同的消费者希望使用不同负载均衡策略的需求。
客户端的负载均衡则提供了这种灵活性,并对用户扩展提供更加友好的支持。
但是客户端负载均衡策略如果配置不当,可能会导致服务提供者出现热点,或者压根就拿不到任何服务提供者。
服务端负载均衡典型的代表就是Nginx,客户端负载均衡典型代表是Ribbon,每种方式都有经典的代表,我们都是可以深入学习的。
常见的负载均衡器的算法的实现,常见的算法有以下六种:
1、轮询法
将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
2、随机法
通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
由概率统计理论可以得知,随着客户端调用服务端的次数增多;其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
3、哈希算法
哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。
采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
4、加权轮询法
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。
给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
5.加权随机法
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。
不同的是,它是按照权重随机请求后端服务器,而非顺序。
6.最小连接数法
最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
5、注册中心如何选型?
现在注册中心的选择也是五花八门,现阶段比较流行有以下几种:
在介绍这个之前大家有些需要了解的知识有CAP、Paxos、Raft算法这里我就不进行过多介绍了。
开始介绍以上5种实现注册中心的方式。
1、Zookeeper
这个说起来有点意思的是官方并没有说他是一个注册中心,但是国内Dubbo场景下很多都是使用Zookeeper来完成了注册中心的功能。
当然这有很多历史原因,这里我们就不追溯了,我还是来聊聊作为注册中心使用的情况下,Zookeeper有哪些表现吧。
1、三种角色
Leader角色:一个Zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及Observer间的心跳。
所有的写操作必须要通过Leader完成再由Leader将写操作广播给其它服务器。
Follower角色:一个Zookeeper集群可能同时存在多个Follower,它会响应Leader的心跳。
Follower可直接处理并返回客户端的读请求,同时会将写请求转发给Leader处理,并且负责在Leader处理写请求时对请求进行投票。
Observer角色:与Follower类似,但是无投票权。
2、四种节点
PERSISTENT-持久节点:除非手动删除,否则节点一直存在于Zookeeper上
EPHEMERAL-临时节点:临时节点的生命周期与客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
PERSISTENT_SEQUENTIAL-持久顺序节点:基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
EPHEMERAL_SEQUENTIAL-临时顺序节点:基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
3、一种机制
Zookeeper的Watch机制,是一个轻量级的设计。
因为它采用了一种推拉结合的模式。
一旦服务端感知主题变了,那么只会发送一个事件类型和节点信息给关注的客户端,而不会包括具体的变更内容,所以事件本身是轻量级的,这就是推的部分。
然后,收到变更通知的客户端需要自己去拉变更的数据,这就是拉的部分。
Zookeeper如何实现注册中心?
简单来讲,Zookeeper可以充当一个服务注册表(ServiceRegistry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(ip+端口)去访问具体的服务提供者。如下图所示:
每当一个服务提供者部署后都要将自己的服务注册到zookeeper的某一路径上:/{service}/{version}/{ip:port}。
比如我们的HelloWorldService部署到两台机器,那么Zookeeper上就会创建两条目录:
/HelloWorldService/1.0.0/100.19.20.01
HelloWorldService/1.0.0/100.19.20.02。
这么描述有点不好理解,下图更直观,
在Zookeeper中,进行服务注册,实际上就是在Zookeeper中创建了一个Znode节点,该节点存储了该服务的IP、端口、调用方式(协议、序列化方式)等。
该节点承担着最重要的职责,它由服务提供者(发布服务时)创建,以供服务消费者获取节点中的信息,从而定位到服务提供者真正IP,发起调用。
通过IP设置为临时节点,那么该节点数据不会一直存储在ZooKeeper服务器上。
当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在ZooKeeper服务器上被删除,剔除或者上线的时候会触发Zookeeper的Watch机制,会发送消息给消费者,因此就做到消费者信息的及时更新。
Zookeeper从设计上来说的话整体遵循的CP的原则,在任何时候对Zookeeper的访问请求能得到一致的数据结果,同时系统对网络分区具备容错性,在使用Zookeeper获取服务列表时,如果此时的Zookeeper集群中的Leader宕机了,该集群就要进行Leader的选举,又或者Zookeeper集群中半数以上服务器节点不可用(例如有三个节点,如果节点一检测到节点三挂了,节点二也检测到节点三挂了,那这个节点才算是真的挂了),那么将无法处理该请求。
所以说,Zookeeper不能保证服务可用性。
2、Eureka
Netflix我感觉应该是在酝酿更好的东西的,下面我们重点还是来介绍Ereka1.x相关的设计。
Eureka由两个组件组成:Eureka服务端和Eureka客户端。
Eureka服务器用作服务注册服务器。
Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。
Eureka的基本架构,由3个角色组成:1、EurekaServer
提供服务注册和发现功能;
2、ServiceProvider服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到;
3、ServiceConsumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
Eureka在设计时就紧遵AP原则,EurekaServer可以运行多个实例来构建集群,解决单点问题,实例之间通过彼此互相注册来提高可用性,是一种去中心化的架构,无master/slave之分,每一个实例都是对等的,每个节点都可被视为其他节点的副本。
在集群环境中如果某台EurekaServer宕机,EurekaClient的请求会自动切换到新的EurekaServer节点上,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。
当节点开始接受客户端请求时,所有的操作都会在节点间进行复制操作,将请求复制到该EurekaServer当前所知的其它所有节点中。
当一个新的EurekaServer节点启动后,会首先尝试从邻近节点获取所有注册列表信息,并完成初始化。
EurekaServer通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳契约的方式定期更新。
默认情况下,如果EurekaServer在一定时间内没有接收到某个服务实例的心跳(默认周期为30秒),EurekaServer将会注销该实例(默认为90秒,-expiration-duration-in-seconds进行自定义配置)。
当EurekaServer节点在短时间内丢失过多的心跳时,那么这个节点就会进入自我保护模式,这个测试环境的时候需要注意一下。
Eureka的集群中,只要有一台Eureka还在,就能保证注册服务可用,只不过查到的信息可能不是最新的(不保证强一致性)。
除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
Eureka不再从注册表中移除因为长时间没有收到心跳而过期的服务;
Eureka仍然能够接受新服务注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
当网络稳定时,当前实例新注册的信息会被同步到其它节点中。
3、Nacos
Nacos无缝支持一些主流的开源生态,如下图:
Nacos致力于帮助您发现、配置和管理微服务。
Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。
Nacos是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
Nacos除了服务的注册发现之外,还支持动态配置服务。
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
服务发现和服务健康监测
Nacos支持基于DNS和基于RPC的服务发现。
服务提供者使用原生SDK、OpenAPI、或一个独立的AgentTODO注册Service后,服务消费者可以使用DNSTODO或HTTP&API查找和发现服务。
Nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
Nacos支持传输层(PING或TCP)和应用层(如HTTP、MySQL、用户自定义)的健康检查。
对于复杂的云环境和网络拓扑环境中(如VPC、边缘网络等)服务的健康检查,Nacos提供了agent上报模式和服务端主动检测2种健康检查模式。
Nacos还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos提供了一个简洁易用的UI(控制台样例Demo)帮助您管理所有的服务和应用的配置。
Nacos还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态DNS服务
动态DNS服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现API上的风险。
Nacos提供了一些简单的DNSAPIsTODO帮助您管理服务的关联域名和可用的IP:PORT列表.
服务及其元数据管理
Nacos能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的SLA以及最首要的metrics统计数据。
Nacos支持插件管理
关于Nacos数据的存储来说,支持临时也支持持久化。
关于设计来说支持CP也支持AP,对他来说只是一个命令的切换,随你玩,还支持各种注册中心迁移到Nacos,反正一句话,只要你想要的他就有。
4、Consul
Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。
Consul是分布式的、高可用的、可横向扩展的用于实现分布式系统的服务发现与配置。
Consul的特点
服务发现(ServiceDiscovery)
Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。
一些外部的服务通过Consul很容易的找到它所依赖的服务。
健康检查(HealthChecking)
Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。
操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
Key/Value存储
应用程序可以根据自己的需要使用Consul提供的Key/Value存储。
Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
安全服务通信
Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。
意图可用于定义允许哪些服务通信。
服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心
Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
Consul支持多数据中心,在上图中有两个DataCenter,他们通过Internet互联,同时请注意为了提高通信效率,只有Server节点才加入跨数据中心的通信。
在单个数据中心中,Consul分为Client和Server两种节点(所有的节点也被称为Agent),Server节点保存数据,Client负责健康检查及转发数据请求到Server;Server节点有一个Leader和多个Follower,Leader节点会将数据同步到Follower,Server的数量推荐是3个或者5个,在Leader挂掉的时候会启动选举机制产生一个新的Leader。
集群内的Consul节点通过gossip协议(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是Client还是Server。
单个数据中心的流言协议同时使用TCP和UDP通信,并且都使用8301端口。
跨数据中心的流言协议也同时使用TCP和UDP通信,端口使用8302。
集群内数据的读写请求既可以直接发到Server,也可以通过Client使用RPC转发到Server,请求最终会到达Leader节点,在允许数据延时的情况下,读请求也可以在普通的Server节点完成,集群内数据的读写和复制都是通过TCP的8300端口完成。
Consul其实也可以在应用内进行注册,后续采用SpringCloud全家桶这套做负载
我们这里聊聊关于Consul的应用外的注册:
上图主要多出来两个组件,分别是Registrator和ConsulTemplate,接下来我们介绍下这两个组件如何结合可以实现在应用发进行服务发现和注册。
Registrator:一个开源的第三方服务管理器项目,它通过监听服务部署的Docker实例是否存活,来负责服务提供者的注册和销毁。
ConsulTemplate:定时从注册中心服务端获取最新的服务提供者节点列表并刷新LB配置(比如Nginx的upstream),这样服务消费者就通过访问Nginx就可以获取最新的服务提供者信息,达到动态调节负载均衡的目的。
整体架构图可能是这样:
我们用Registrator来监控每个Server的状态。
当有新的Server启动的时候,Registrator会把它注册到Consul这个注册中心上。
由于ConsulTemplate已经订阅了该注册中心上的服务消息,此时Consul注册中心会将新的Server信息推送给ConsulTemplate,ConsulTemplate则会去修改的配置文件,然后让Nginx重新载入配置以达到自动修改负载均衡的目的。
5、Kubernetes
Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。
通过Kubernetes能够进行应用的自动化部署和扩缩容。
在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更
软件架构入门-分层架构、事件驱动、微服务架构和云原生架构
软件架构(software architecture)就是软件的基本结构。
合适的架构是软件成功的最重要因素之一。
大型软件公司通常有专门的架构师职位(architect),只有资深程序员才可以担任。
OReilly 出版过一本免费的小册子《Software Architecture Patterns》(PDF), 介绍了五种最常见的软件架构,是非常好的入门读物。
软件架构就是软件的基本结构。
架构的本质是管理复杂性。
如果你觉得架构不重要,可能是你做的事情不够复杂,或者是你没有管理好复杂性。
架构模式虽多,经过抽象沉淀之后,也就那么几种:
1. 分层架构(比较传统的单体架构)
2. 事件驱动架构 (一般适用于应用局部场景,用来实现异步解耦)
3. 微核架构(又称插件架构,开发难度较高,一般用来做工具软件开发,如Eclipse,不太适合分布式业务场景)
4. 微服务架构(当前比较流行的服务化架构,解决单体架构面临的问题,适合敏捷开发,快速迭代)
5. 云架构(现在的说法是云原生架构-Cloud Native,基于Docker、Kubernetes、Service Mesh 云原生架构)
在原文的基础上,我按照自己的想法,进行了小幅调整。
分层架构( layered architecture )是最常见的软件架构,也是事实上的标准架构。
如果你不知道要用什么架构,那就用它。
这种架构将软件分成若干个水平层,每一层都有清晰的角色和分工,不需要知道其他层的细节。
层与层之间通过接口通信。
虽然没有明确约定,软件一定要分成多少层,但是四层的结构最常见。
有的软件在逻辑层(business)和持久层(persistence)之间,加了一个服务层(service),提供不同业务逻辑需要的一些通用接口。
用户的请求将依次通过这四层的处理,不能跳过其中任何一层。
优点
缺点
事件(event)是状态发生变化时,软件发出的通知。
事件驱动架构(event-driven architecture)就是通过事件进行通信的软件架构。
它分成四个部分。
事件驱动架构(event-driven architecture)核心组件:
对于简单的项目,事件队列、分发器和事件通道,可以合为一体,整个软件就分成事件代理和事件处理器两部分。
优点
缺点
事件驱动架构在通信产品中应用得也非常广泛,典型的如状态机处理。
事件驱动架构不适于做顶层架构,但适合做局部实现,几乎遍布在通信软件的各个角落。
微核架构(microkernel architecture)又称为插件架构(plug-in architecture),指的是软件的内核相对较小,主要功能和业务逻辑都通过插件实现。
内核(core)通常只包含系统运行的最小功能。
插件则是互相独立的,插件之间的通信,应该减少到最低,避免出现互相依赖的问题。
优点
缺点
微核架构的设计和开发难度较高,这就注定它在企业产品中用得不多,虽然它的优点还不少。
微服务架构(microservices architecture)是服务导向架构(service-oriented architecture,缩写 SOA)的升级。
每一个服务就是一个独立的部署单元(separately deployed unit)。
这些单元都是分布式的,互相解耦,通过远程通信协议(比如REST、SOAP)联系。
微服务架构分成三种实现模式。
现在开源的微服务框架比较多,如常用的有Spring Cloud、Dubbo、ServiceComb等等。
优点
缺点
云架构(cloud architecture,现在的说法是云原生-Cloud Native)主要解决扩展性和并发的问题,是最容易扩展的架构。
它的高扩展性,主要原因是可以基于云上计算资源弹性伸缩。
然后,业务处理能力封装成一个个处理单元(prcessing unit)。
访问量增加,就新建处理单元(Docker容器);访问量减少,就关闭处理单元(Docker容器)。
由于没有中央数据库,所以扩展性的最大瓶颈消失了。
由于每个处理单元的数据都独立分库。
这个模式主要分成两部分:处理单元(processing unit)和虚拟中间件(virtualized middleware)。
虚拟中间件又包含四个组件:
随着Docker、Kubernetes等容器化技术的快速发展,上述关于云架构描述有点陈旧了。
当前最新的云原生架构,以Docker+Kubernetes为核心,尤其是容器编排Kubernetes 已经成为事实上的行业标准。
云原生架构图的主要特征:
主要目标:
1. 让开发人员聚焦业务逻辑的实现,其他交给容器云平台来完成;
2. 支持业务系统的快速迭代,支撑业务的快速变化和发展;
3. 构建以共享服务体系为核心的业务中台;
下面是我针对某新零售企业设计的云原生架构图,以云和微服务架构为基础构建云原生应用,这里云可以是公有云、私有云、混合云等等。
以上是从不同的视角,对架构进行了分类。
实际应用中,各种架构并不是孤立的,可以根据业务环境和业务诉求,对各种架构进行综合和嫁接。
每种架构都有其优点和缺点。
优点不必多说,缺点则几乎都是通过工具工程(比如自动化发布工具、自动化测试等等)能力的方法来规避,工具工程对软件架构非常重要。
云原生和云计算的区别
这里还隐藏了一个词——“计算”(Computing),因为云原生本质上是一种与云计算(CloudComputing)相同的计算方式,因此通常我们在说云原生的时候,实际上是暗指云原生计算(CloudNativeComputing)。
云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。
云原生的英文为CloudNative,是一个组合词:Cloud+Native。
云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。
容器技术和云原生好比一对螺旋体,容器技术催生了云原生思潮,云原生生态推动了容器技术发展。
从2013年Docker技术诞生,到2015年CNCF这个云原生领域重量级联盟成立,这不是历史的巧合而是历史的必然。
云原生从字面意思上来看可以分成云和原生两个部分。
云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。
云原生包含哪些技术?云原生技术以微服务、DevOps、容器、多云业务管理为代表,目前已经成为了加速企业数字化业务高效创新、实现企业数字化转型的最佳技术支撑。
1、云原生安全指云平台安全原生化和云安全产品原生化现在也越来越多的企业开始重视云原生安全了。
2、腾讯云原生安全的排名不错,可以说是行业标杆。
各行各业以及省级政务平台都在采纳腾讯的安全服务团队,且评价相当好。
3、云原生安全,拥有从硬件层透穿的最高等级安全能力,打造全环境、全生命周期的可信环境。
用户视角看到的层级也将发生变化,安全产品随之演进变化。
4、腾讯云原生安全综合实力首屈一指,行业内都还是挺信任它的,能力有目共睹。
基于云原生以上的几个特点,在容器云PaaS、DevOps、微服务治理、服务网格、API网关等等方面,时速云做的还不错,是一家全栈云原生技术服务提供商,可以了解下。
容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。
在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。
持续部署是云原生的一个比较显著的特点,因为从开发人员提交代码到编译、测试、部署整个流程都是通过自动化执行,这种方式加快了交付的速度,同时在发现问题时也缩短修复的时间。
治理、更新和演进。
云原生的相关特点:云原生应用也就是面向“云”而设计的应用,在使用云原生技术后,开发者无需考虑底层的技术实现,可以充分发挥云平台的弹性和分布式优势,实现快速部署、按需伸缩、不停机交付等。