为何 kubernetes 自然适合微服务 (2)

此文已由做者刘超受权网易云社区发布。数据库

欢迎访问网易云社区,了解更多网易技术产品运营经验后端

3、微服务化的十个设计要点缓存

微服务有哪些要点呢?第一张图是 SpringCloud 的整个生态。并发

第二张图是微服务的 12 要素以及在网易云的实践。负载均衡

第三张图是构建一个高并发的微服务,须要考虑的全部的点。运维

接下来细说微服务的设计要点。分布式

设计要点一:API 网关。微服务

在实施微服务的过程当中,难免要面临服务的聚合与拆分,当后端服务的拆分相对比较频繁的时候,做为手机 App 来说,每每须要一个统一的入口,将不一样的请求路由到不一样的服务,不管后面如何拆分与聚合,对于手机端来说都是透明的。高并发

有了 API 网关之后,简单的数据聚合能够在网关层完成,这样就不用在手机 App 端完成,从而手机 App 耗电量较小,用户体验较好。性能

有了统一的 API 网关,还能够进行统一的认证和鉴权,尽管服务之间的相互调用比较复杂,接口也会比较多,API 网关每每只暴露必须的对外接口,而且对接口进行统一的认证和鉴权,使得内部的服务相互访问的时候,不用再进行认证和鉴权,效率会比较高。

有了统一的 API 网关,能够在这一层设定必定的策略,进行 A/B 测试,蓝绿发布,预发环境导流等等。API 网关每每是无状态的,能够横向扩展,从而不会成为性能瓶颈。

设计要点二:无状态化,区分有状态的和无状态的应用。

影响应用迁移和横向扩展的重要因素就是应用的状态,无状态服务,是要把这个状态往外移,将 Session 数据,文件数据,结构化数据保存在后端统一的存储中,从而应用仅仅包含商务逻辑。

状态是不可避免的,例如 ZooKeeper, DB,Cache 等,把这些全部有状态的东西收敛在一个很是集中的集群里面。

整个业务就分两部分,一个是无状态的部分,一个是有状态的部分。

无状态的部分能实现两点,一是跨机房随意地部署,也即迁移性,一是弹性伸缩,很容易地进行扩容。

有状态的部分,如 DB,Cache,ZooKeeper 有本身的高可用机制,要利用到他们本身高可用的机制来实现这个状态的集群。

虽然说无状态化,可是当前处理的数据,仍是会在内存里面的,当前的进程挂掉数据,确定也是有一部分丢失的,为了实现这一点,服务要有重试的机制,接口要有幂等的机制,经过服务发现机制,从新调用一次后端服务的另外一个实例就能够了。

设计要点三:数据库的横向扩展。

数据库是保存状态,是最重要的也是最容易出现瓶颈的。有了分布式数据库可使数据库的性能能够随着节点增长线性地增长。

分布式数据库最最下面是 RDS,是主备的,经过 MySql 的内核开发能力,咱们可以实现主备切换数据零丢失,因此数据落在这个 RDS 里面,是很是放心的,哪怕是挂了一个节点,切换完了之后,你的数据也是不会丢的。

再往上就是横向怎么承载大的吞吐量的问题,上面有一个负载均衡 NLB,用 LVS,HAProxy, Keepalived,下面接了一层 Query Server。Query Server 是能够根据监控数据进行横向扩展的,若是出现了故障,能够随时进行替换的修复,对于业务层是没有任何感知的。

另一个就是双机房的部署,DDB 开发了一个数据运河 NDC 的组件,可使得不一样的 DDB 之间在不一样的机房里面进行同步,这时候不但在一个数据中内心面是分布式的,在多个数据中内心面也会有一个相似双活的一个备份,高可用性有很是好的保证。

设计要点四:缓存

在高并发场景下缓存是很是重要的。要有层次的缓存,使得数据尽可能靠近用户。数据越靠近用户能承载的并发量也越大,响应时间越短。

在手机客户端 App 上就应该有一层缓存,不是全部的数据都每时每刻从后端拿,而是只拿重要的,关键的,时常变化的数据。

尤为对于静态数据,能够过一段时间去取一次,并且也不必到数据中心去取,能够经过 CDN,将数据缓存在距离客户端最近的节点上,进行就近下载。

有时候 CDN 里面没有,仍是要回到数据中心去下载,称为回源,在数据中心的最外层,咱们称为接入层,能够设置一层缓存,将大部分的请求拦截,从而不会对后台的数据库形成压力。

若是是动态数据,仍是须要访问应用,经过应用中的商务逻辑生成,或者去数据库读取,为了减轻数据库的压力,应用可使用本地的缓存,也可使用分布式缓存,如 Memcached 或者 Redis,使得大部分请求读取缓存便可,没必要访问数据库。

固然动态数据还能够作必定的静态化,也即降级成静态数据,从而减小后端的压力。

设计要点五:服务拆分和服务发现

当系统扛不住,应用变化快的时候,每每要考虑将比较大的服务拆分为一系列小的服务。

这样第一个好处就是开发比较独立,当很是多的人在维护同一个代码仓库的时候,每每对代码的修改就会相互影响,经常会出现我没改什么测试就不经过了,并且代码提交的时候,常常会出现冲突,须要进行代码合并,大大下降了开发的效率。

另外一个好处就是上线独立,物流模块对接了一家新的快递公司,须要连同下单一块儿上线,这是很是不合理的行为,我没改还要我重启,我没改还让我发布,我没改还要我开会,都是应该拆分的时机。

另外再就是高并发时段的扩容,每每只有最关键的下单和支付流程是核心,只要将关键的交易链路进行扩容便可,若是这时候附带不少其余的服务,扩容便是不经济的,也是颇有风险的。

再就是容灾和降级,在大促的时候,可能须要牺牲一部分的边角功能,可是若是全部的代码耦合在一块儿,很难将边角的部分功能进行降级。

固然拆分完毕之后,应用之间的关系就更加复杂了,于是须要服务发现的机制,来管理应用相互的关系,实现自动的修复,自动的关联,自动的负载均衡,自动的容错切换。

设计要点六:服务编排与弹性伸缩

当服务拆分了,进程就会很是的多,于是须要服务编排来管理服务之间的依赖关系,以及将服务的部署代码化,也就是咱们常说的基础设施即代码。这样对于服务的发布,更新,回滚,扩容,缩容,均可以经过修改编排文件来实现,从而增长了可追溯性,易管理性,和自动化的能力。

既然编排文件也能够用代码仓库进行管理,就能够实现一百个服务中,更新其中五个服务,只要修改编排文件中的五个服务的配置就能够,当编排文件提交的时候,代码仓库自动触发自动部署升级脚本,从而更新线上的环境,当发现新的环境有问题时,固然但愿将这五个服务原子性地回滚,若是没有编排文件,须要人工记录此次升级了哪五个服务。有了编排文件,只要在代码仓库里面 revert,就回滚到上一个版本了。全部的操做在代码仓库里都是能够看到的。

设计要点七:统一配置中心

服务拆分之后,服务的数量很是多,若是全部的配置都以配置文件的方式放在应用本地的话,很是难以管理,能够想象当有几百上千个进程中有一个配置出现了问题,是很难将它找出来的,于是须要有统一的配置中心,来管理全部的配置,进行统一的配置下发。

在微服务中,配置每每分为几类,一类是几乎不变的配置,这种配置能够直接打在容器镜像里面,第二类是启动时就会肯定的配置,这种配置每每经过环境变量,在容器启动的时候传进去,第三类就是统一的配置,须要经过配置中心进行下发,例如在大促的状况下,有些功能须要降级,哪些功能能够降级,哪些功能不能降级,均可以在配置文件中统一配置。

设计要点八:统一的日志中心

一样是进程数目很是多的时候,很难对成千上百个容器,一个一个登陆进去查看日志,因此须要统一的日志中心来收集日志,为了使收集到的日志容易分析,对于日志的规范,须要有必定的要求,当全部的服务都遵照统一的日志规范的时候,在日志中心就能够对一个交易流程进行统一的追溯。例如在最后的日志搜索引擎中,搜索交易号,就可以看到在哪一个过程出现了错误或者异常。

设计要点九:熔断,限流,降级

服务要有熔断,限流,降级的能力,当一个服务调用另外一个服务,出现超时的时候,应及时返回,而非阻塞在那个地方,从而影响其余用户的交易,能够返回默认的托底数据。

当一个服务发现被调用的服务,由于过于繁忙,线程池满,链接池满,或者老是出错,则应该及时熔断,防止由于下一个服务的错误或繁忙,致使本服务的不正常,从而逐渐往前传导,致使整个应用的雪崩。

当发现整个系统的确负载太高的时候,能够选择降级某些功能或某些调用,保证最重要的交易流程的经过,以及最重要的资源所有用于保证最核心的流程。

还有一种手段就是限流,当既设置了熔断策略,又设置了降级策略,经过全链路的压力测试,应该可以知道整个系统的支撑能力,于是就须要制定限流策略,保证系统在测试过的支撑能力范围内进行服务,超出支撑能力范围的,可拒绝服务。当你下单的时候,系统弹出对话框说 “系统忙,请重试”,并不表明系统挂了,而是说明系统是正常工做的,只不过限流策略起到了做用。

设计要点十:全方位的监控

当系统很是复杂的时候,要有统一的监控,主要有两个方面,一个是是否健康,一个是性能瓶颈在哪里。当系统出现异常的时候,监控系统能够配合告警系统,及时地发现,通知,干预,从而保障系统的顺利运行。

当压力测试的时候,每每会遭遇瓶颈,也须要有全方位的监控来找出瓶颈点,同时可以保留现场,从而能够追溯和分析,进行全方位的优化。

网易云轻舟微服务是围绕应用和微服务打造的一站式 PaaS 平台,帮助用户快速实现易接入、易运维的微服务解决方案。

相关阅读:为何 kubernetes 自然适合微服务 (1)

为何 kubernetes 自然适合微服务 (2)

为何 kubernetes 自然适合微服务 (3)

文章来源: 网易云社区

相关文章
相关标签/搜索