随着Docker等云技术的大量应用,企业的互联网业务复杂度不断提升,传统整体应用架构模式越来越臃肿,难以适应灵活多变的业务需求。微服务架构(Microservices Architecture)应运而生,它放弃了传统大规模的单块集成应用,改为细粒度、松耦合、可灵活组合的自治单元,成为云计算时代应用的主要构建方式。
微服务架构以其高度的弹性、灵活性和效率的巨大提升,快速受到各领域架构师和技术决策者的关注,在Netflix、Amazon、Airbnb等公司成功应用,并逐渐成为互联网行业最受关注的技术架构。今天就由云智慧开发经理 Allen Lai为大家带来关于Microservices Architecture微服务架构应用实践的分享内容。
什么是微服务?
微服务是一种全新的互联网架构,它的基本理念是将一个肥大的系统拆分成若干小的服务组件,组件之间的通讯采用轻量的协议完成,譬如REST API。微服务本质上是SOA (Serviceoriented Architecture) 的扩展延伸。相对来说,微服务的可操作性更强,可以逐步安排合理资源,对一个大的系统进行分解,或是至少停止让它继续肥大。
微服务的好处包括:
按照业务功能的独立垂直开发机制;
异构开发语言,更多的技术选择;
高效的部署机制(自动化部署) 和尽可能短的部署周期;
高效的测试机制,易于构建基于服务接口的自动化测试,能尽可能早的发现问题;
面对下游消费者透明,如采用Swagger,可详细描述输入,输出标准(见下图)。
Restful API集成Swagger1
整体应用 vs 微服务应用
那么,我们来看看另一种过去常用的架构,单体架构Monolithic application的情况,单体架构也有它的优势,对于项目应用或是公司创业初期是个很好的选择,可以更快的解决有和没有的问题,适合小团队开发实现,而且横向扩展方便,例如镜像部署的时候。但当公司大了以后,随着应用越来越多、第三方系统的不断接入或者企业的并购,问题会慢慢的暴露出来。
主要体现在如下方面:
功能多了,应用肥大;
接口污染,jar包冲突;
部署困难,任何修改都需部署整体,带来整体服务downtime;
测试/检查比较困难,任何修改,切入点过于依赖于从前到后的测试;
问题定位困难,不易找到具体的问题点,通常需要从前到后筛查,或者从海量的og里筛查;
某个服务出现OOM后对整体应用产生影响;
无法通过具体服务对资源的需求搭配硬件资源/网络资源,只能安装最高需求整体满足;
新进人员对开发环境搭建,应用的熟悉需要很长的时间,很难快速通过以点及面的方式切入系统。
我曾经遇到过一个超过400M的大Jar包,启动应用超过5分钟,那段时间简直被OPS骂死。举个例子,一个产品犹如一条鱼,开始的时候游得很畅快,但是有一天,这条鱼变成这样:
整体应用架构
它每次的转身、变更都很慢,因为太重了。后来我们意识到,不能再往它身上放东西了,经过逐步的调整,变成了如下的结构:
Microservices Architecture
Tomcat上承载的东西变少了,有明确边界的服务都被拆分成了独立的restful应用,这样面向众多客户的web app,部署节奏加快,后端的若干子服务部署节奏也加快。
公司大了以后,异构系统和Hybrid都是在所难免的,有朝一日 云智慧 也会面临这个场景。 监控宝和透视宝 平台提供的功能由php, java, Ruby on Rails, Python Django, .net mvc等组成,同时对于外部服务的集成,集成后对主应用的影响不亚于功能性的要求。比如集成一个外部服务,他的服务升级很快,那么对这块功能的变更和主应用应该是隔离的,而微服务架构确实能隔离这个问题。
微服务架构的实现,目前国内有阿里的dubbo,国外有Twitter的Finagle框架,他们都是基于RPC的。如果我们的微服务是基于restful服务,那么无须选择他们,考虑到异构系统,基于http rest依旧是最合适方案。
任何一种架构都有它的适用场景和一些不足,微服务什么问题呢?
需考虑服务间通讯的局部不可用问题。
假如一个请求需要2个或者多个服务共同组装数据,某个服务不可用,本质上这个应该取决于业务,具体该请求判决为成功或失败取决于该故障服务提供的数据权重,比如一个提供商品评论的服务暂时不可用,该数据是次要的。
服务线性依赖问题
这是个设计问题,从设计上微服务不应该依赖别的业务微服务,如果设计成了服务A—>服务B>服务C..那么带来的问题会较多。
带来更多的单点考虑
采用合理的负载均衡可以解决,但是显然会带来部署的复杂性。
应用管理复杂度会上升
这方面,业界也有解决方案,比如Docker / Kubernetes集群化方案。今晚主要是从High level介绍一下微服务架构,具体细节要有合适的应用场景,下次分享我们会准备一个Demo,一起来尝试如何让web app更轻,如何用spring boot构建一个微服务。