微服务(MicroServices)从发展到成熟,已经经历了很长一段时间,它是一种架构概念,业界都在使用微服务去改造目前的单体服务,为用户提供更敏捷、更快速、更安全的服务,基于微服务概念而产生的框架和工具如雨后春笋般的发展起来了,Spring Cloud、Netflix、Dubbo、Consul、Eureka等服务注册中心、服务调度框架都是我们非常熟悉的框架和工具。
在一个组织和企业内部,每个团队依据各自业务的特点及人员的特点,都在使用着不同的服务框架和工具。对于一个组织或企业来说,每个团队都使用不同的服务框架,就会增加人力学习成本、增加资源投入、增大故障发生机率、延长故障处理时间,不利于整个企业的技术发展,需要有一个统一的、稳定的、可维护的基础框架来支撑每个业务的发展。
在网易传媒技术内部,有的团队使用Spring Cloud,有的团队使用Dubbo,有的团队使用Spring MVC,在语言栈上,传媒技术大部分都使用Java语言栈,有部分团队使用C++、Python等其他语言栈,如何使每个团队的服务框架做到统一,而且对现有代码不会造成大量修改,同时也要兼容不同语言栈。如何能平滑、全覆盖、快速的进行微服务改造,是我们面对的比较大的挑战,我将通过两篇文章为大家介绍在传媒技术内部如何进行微服务改造的,本篇文章主要对微服务及目前开源组件做一些介绍,下一篇文章将阐述在传媒内部如何进行微服务改造工作。 如果你想和更多微服务技术专家交流,可以加我微信liyingjiese,备注『加群』。群里每周都有全球各大公司的最佳实践以及行业最新动态 。
在介绍微服务之前,先来了解下单体应用,单体应用就是将应用程序的所有功能都打包成一个独立可运行的程序,可以是JAR、WAR、EAR或其他格式的包,在单体应用的时代,不涉及到分布式部署,不涉及到扩容、持续集成等方面的问题,但随着业务越来越复杂,对快速迭代的需求越来越多,团队的不断壮大,业务请求量越来越大,单体应用的缺点逐渐被暴漏出来,主要包括:
正是由于单体应用不能满足业务快速发展、敏捷性、灵活性和可扩展性的需求,迫切需要一种更加快速高效的软件交付方式。2014年,Martin Fowler在其博文中发表了“Microervices”一文,首先提到了“微服务”这个词。简单来说,微服务首先是一种架构风格,它将单体应用拆分为更多的小型服务,这些小型服务在独立的进程中运行,服务之间通过HTTP的RESTFul API进行通信,被拆成的每一个小型服务都具有如下特点:
看上去微服务能够解决软件开发方面的很多问题,但同时,微服务也带来了一些其他的问题,主要包括如下几点
在实施微服务过程中,需要有一些基础的组件和服务来支持微服务的实施,以下对一些基础的服务和组件做一些介绍。
在整个微服务架构中,注册中心是最基础的核心服务之一,它记录着服务和服务地址的映射关系,为服务提供方提供注册、注销功能,为服务消费方提供服务发现的功能。
1). CAP
在讨论注册中心之前,先了解一下CAP原则,它是指在一个分布式系统中所拥有的三个特性:Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)。
这三个分布式特性中,不可能同时存在,需要依据实际业务需求进行取舍,目前存在的注册中心实现中,有的实现了AP,有的实现了CP,我们接下来分别进行讨论
2). Eureka
Eureka是由Netflix开源的服务注册中心项目,基于Java语言开发,目前开源了1.X版本,2.X版本已经宣布闭源。Eureka满足了AP,采用了Server/Client模式进行设计。Server是注册中心,为Client提供服务注册和发现的功能,维护着注册到自身的Client相关的信息,提供接口给Client获取服务注册相关的信息。Client将自己的服务信息登记到Server上,并维护自己信息的一致性。
Eureka的整体架构图如下所示:
Eureka保证了AP,没有保证不同集群之间的Server数据强一致性,仅通过数据拷贝的方式争取注册中心数据的最终一致性,虽然放弃数据强一致性但是换来了Server的可用性,降低了注册的代价,提高了集群运行的健壮性
3). Consul
Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,保证了CP(采用Raft算法保证服务的一致性),且支持多种健康检查方式,保证服务提供方的服务是可用
Consul主要支持以下特性:
4). ZooKeeper
ZooKeeper是由Google最早开源的分布式协调服务,最早是和Hadoop、Hbase同时发布,做为Hadoop、Hbase的重要组件,提供了数据/发布订阅、负载均衡、分布式同步等功能。
Zookeeper保证了CP,具体由以下几部分组成:
服务注册中心有很多的可选工具,需要依据各自的业务及要求进行选择,传媒依据自己的业务特点,使用了Consul做为服务注册中心,后期将做详细介绍。
微服务由一些职责单一的细粒度服务组成分布式网状结构,服务之间通过轻量级协议进行通信。服务提供方需要注册服务,通知消费方,服务消费方需要找到服务提供方实例地址,并进行消费,服务注册中心还需要检查服务提供方的实例的健康状态。
我们将服务消费主要分为以下三类:
集中式:在服务提供者和服务消费者之间通过负载均衡进行转发,这个负载均衡比较常见的有硬负载(如F5,现在比较少见),软负载(LVS、HAProxy等软件),负载均衡上保存所有服务的地址映射表,这些地址映射表通常由运维人员进行注册,当服务消费方消费服务时,向负载均衡发出请求,负载均衡依据相应策略(比如:轮询,随机等策略)将请求转发到目标服务,从而实现服务的调用。负载均衡一般都有健康检查机制,会定期摘除不健康的服务实例。
集中式的优点及缺点如下:
进程内:将负载均衡以二方包的形式提供给服务消费者和服务提供者,负载均衡在服务消费者及服务提供者的进程中运行,这种方式在很多Java的RPC框架中见到,比如:Dubbo、Ribbon、Motan等。
进程的优点及缺点如下:
独立进程:前面两种方案都存在一些弊端,为了解决前面两种的问题,提出了一个独立进程负载均衡方案,这个方案是对前两种方案的不足提出的一种折中方案,将第二种方案做了优化,将进程内的负载均衡移了出来,变成了一个独立进程,服务消费方消费服务时,都通过本机的服务代理进行访问。
独立进程优点及缺点如下:
目前在传媒内部,使用的是第二和第三种方案的结合,对于Java语言栈,一般使用进程内方案,性能会比较好,对于其他语言,使用第三中方案,后期会详细介绍。
在整个系统微服务化之后,服务与服务之间存在着错综复杂的调用关系,每个服务都不可能保证100%的可靠,服务可能会出现不可用的状况,如果调用方所依赖的服务产生故障,不能快速进行容错或隔离,那个这个应用就会存在拖垮整个应用的风险,如果多个调用方都产生不可用情况,就会产生雪崩,严重时整个系统将不能提供正常服务。
Hytrix是Netflix公司开源的服务容错框架,它通过三个方面解决服务容错相关的问题。
正常状态下,熔断器处于Closed状态,如果调用超时或持续出错,就会进入熔断状态(Open),后续所有请求都会被拒绝,一段时间后,保护器会尝试进入半熔断状态(Half-Open),允许少量请求进来尝试,如果调用仍然失败,则回到熔断状态,如果调用成功,则回到电路闭合状态
在微服务场景下,一个系统有可能被拆为多个微服务,每个微服务又暴漏了若干API(以Restful形式暴漏),管理起来非常的不方便,接入也非常的麻烦,在外网访问每个服务的时候,需要有一个API网关提供统一的入口,将流量转发给对应的后端取得数据后再一次返回,除此,还需要增加限流、熔断、鉴权等通用功能。
统一网关有如下优点:
目前开源网关方案有很多,我们列举了如下几个网关产品:
目前在网易传媒使用Kong做为统一网关。
以上对微服务做了一些比较全面的介绍,下一篇会结合网易传媒的实际情况,如何在传媒内部做到微服务框架的落地与推广的。
原文链接: https://mp.weixin.qq.com/s/MlCOh3SFibreIIT63AJJHQ