`
jiezhu2007
  • 浏览: 245931 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
Cfa1f850-3fc3-3a36-9cd8-c3415c9610c6
hadoop技术学习
浏览量:144427
Group-logo
大数据产业分析
浏览量:2985
社区版块
存档分类
最新评论

初识微服务

阅读更多

 

微服务架构越来越火,有必要学习一下。

软件开发过程中碰到什么问题

一个简单的应用会随着时间推移逐渐变大。在每次的sprint中,开发团队都会面对新故事,然后开发许多新代码。几年后,这个小而简单的应用会变成了一个巨大的怪物。

一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦。敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它。因此,修正bug和正确的添加新功能变的非常困难,并且很耗时。另外,团队士气也会走下坡路。如果代码难于理解,就不可能被正确的修改。最终会走向巨大的、不可理解的泥潭。

单体式应用也会降低开发速度。应用越大,启动时间会越长。比如,最近的一个调查表明,有时候应用的启动时间居然超过了12分钟。某些应用需要40分钟启动时间。如果开发者需要经常重启应用,那么大部分时间就要在等待中渡过,生产效率受到极大影响。

另外,复杂而巨大的单体式应用也不利于持续性开发。今天,SaaS应用常态就是每天会改变很多次,而这对于单体式应用模式非常困难。另外,这种变化带来的影响并没有很好的被理解,所以不得不做很多手工测试。那么接下来,持续部署也会很艰难。

单体式应用在不同模块发生资源冲突时,扩展将会非常困难。比如,一个模块完成一个CPU敏感逻辑,应该部署在AWS EC2 Compute Optimized instances,而另外一个内存数据库模块更合适于EC2 Memory-optimized instances。然而,由于这些模块部署在一起,因此不得不在硬件选择上做一个妥协。

单体式应用另外一个问题是可靠性。因为所有模块都运行在一个进程中,任何一个模块中的一个bug,比如内存泄露,将会有可能弄垮整个进程。除此之外,因为所有应用实例都是唯一的,这个bug将会影响到整个应用的可靠性。

最后,单体式应用使得采用新架构和语言非常困难。比如,设想你有两百万行采用XYZ框架写的代码。如果想改成ABC框架,无论是时间还是成本都是非常昂贵的,即使ABC框架更好。因此,这是一个无法逾越的鸿沟。你不得不在最初选择面前低头。

总结一下:一开始你有一个很成功的关键业务应用,后来就变成了一个巨大的,无法理解的怪物。因为采用过时的,效率低的技术,使得雇佣有潜力的开发者很困难。应用无法扩展,可靠性很低,最终,敏捷性开发和部署变的无法完成。

微服务解决应用复杂性

面对上面的问题,通过采用微服务解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。

一个微服务一般完成某个特定的功能,比如下单管理、客户管理等等。每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器。一些微服务还会发布API给其它微服务和应用客户端使用。其它微服务完成一个Web UI,运行时,每一个实例可能是一个云VM或者是Docker容器。

运行时,行程管理服务由多个服务实例构成。每一个服务实例都是一个Docker容器。为了保证高可用,这些容器一般都运行在多个云VM上。服务实例前是一层诸如NGINX的负载均衡器,他们负责在各个实例间分发请求。负载均衡器也同时处理其它请求,例如缓存、权限控制、API统计和监控。

这种微服务架构模式深刻影响了应用和数据库之间的关系,不像传统多个服务共享一个数据库,微服务架构每个服务都有自己的数据库。另外,这种思路也影响到了企业级数据模式。同时,这种模式意味着多份数据,但是,如果你想获得微服务带来的好处,每个服务独有一个数据库是必须的,因为这种架构需要这种松耦合。

到底什么是微服务

接下来我们来看看到底什么是微服务。实际上微服务本身并没有一个严格的定义,不过从很多人的反馈来看,大家都达成了这样一个共识:微服务是一种简单的应用,大概有10100行代码。我知道使用代码行数来比较实现其实很不靠谱,因此你能理解这个意思就行,不必过分拘泥于细节。不过有一点需要注意,那就是微服务通常都是很小的,甚至是微型的。这意味着你不会在大型框架上看到很多小服务,这是不切实际的。简单与轻量级是当今的主流。诸如SinatraWebbitFinagleConnect等小型框架在将你的代码包装到一个薄薄的通信层这方面做得刚刚好。

从物理角度来说,这些服务都很小,你可以在同一台机器上运行大量服务,不必担心内存或是资源等问题。重申一遍,基于大型框架的简单库将会取得最后的胜利,你会发现对第三方库的依赖越来越少。

这种服务层上的解耦还提供了另外一个有趣儿的选择。我们将很多老旧应用的复杂性推到了基础设施层,不再受限于单个技术栈或是语言了。我们现在可以发挥出任何技术栈或是语言的优势。

你不会看到任何基于微服务的架构是托管在应用服务器上的,这是关键。本质上,微服务是自我托管的,他们获取一个端口然后监听。这意味着你将失去典型的企业应用服务器所带来的很多好处,服务需要提供这些必要的功能(性能度量、监控等等)。

微服务的通信

服务之间该如何通信呢?这个问题是无法通过一个简单的答案解决的,甚至在单个解决方案中也是难以做到的。最基本的答案就是通过HTTP公开所有服务,然后以JSON作为数据交换格式。服务探测(一个服务是如何找到另一个服务的)可以很简单,只需将端点细节信息放到配置文件中即可(硬编码也行)。

你可能会发现在某些情况下,一个完整事务中对JSON负载的序列化与反序列化的代价会造成系统瓶颈。也许JSON并不适合,你可能需要使用别的协议,如Protobuf等。

不过硬编码的URL会导致耦合。在分层应用中,这是有意义的,不过对于基于服务的架构来说,这意味着你不能再被这种潜在的限制所约束。服务之间的某些通信可以是完全解耦的,事实上,有些服务可以随意发布事件或是数据。他们只是将其扔出去(比如说消息总线),也许有一天出现了某个服务,然后开始监听了。此外,也许系统的某些部分会以批量/离线的流程进行运作,他们可能会在几小时后才从队列中取出消息。微服务架构可以实现这种灵活性而无需修改整个架构。

微服务的部署

部署一个微服务应用也很复杂,一个分布式应用只需要简单在复杂均衡器后面部署各自的服务器就好了。每个应用实例是需要配置诸如数据库和消息中间件等基础服务。相对比,一个微服务应用一般由大批服务构成。例如,根据Adrian CockcroftHailo160个不同服务构成,NetFlix 有大约600个服务。每个服务都有多个实例。这就造成许多需要配置、部署、扩展和监控的部分,除此之外,你还需要完成一个服务发现机制,以用来发现与它通讯服务的地址(包括服务器地址和端口)。传统的解决问题办法不能用于解决这么复杂的问题。接续而来,成功部署一个微服务应用需要开发者有足够的控制部署方法,并高度自动化。

一种自动化方法是使用PaaS服务,例如Cloud Foundry PaaS给开发者提供一个部署和管理微服务的简单方法,它把所有这些问题都打包内置解决了。同时,配置PaaS的系统和网络专家可以采用最佳实践和策略来简化这些问题。另外一个自动部署微服务应用的方法是开发对于你来说最基础的PaaS系统。一个典型的开始点是使用一个集群化方案,比如配合Docker使用Mesos或者Kubernetes。后面的系列我们会看看如何基于软件部署方法例如NGINX,可以方便的在微服务层面提供缓存、权限控制、API统计和监控。

监控与度量

分层解决方案的组件出现问题时不会销声匿迹,要么是编译失败,要么是遇到问题时抛出异常(除非你将抛出的异常隐藏掉了)。在基于服务的方式中,有的服务可能出现了问题,而其他服务则会很容易发现问题(特别是在pub/sub模型中)。这意味着我们必须要能对服务进行监控和编排。事实上,只知道服务还能用是不够的,服务是不是还能提供业务价值?还能否继续使用?它是可靠交易的瓶颈么?

监控总是非常重要的事情,对于基于服务的架构来说更是如此,因为这时出现的失败并不容易被发现。JVM世界中的MetricsOstrich等库不仅可以收集度量信息,还提供了与NagiosGanglia等服务的集成,可以将数据发送给他们。

 

微服务的测试

对于基于微服务架构的系统来说,测试服务并没有什么特殊之处,不过我这里要强调的是你不必再对每个服务使用完整的测试套件了。因为一个服务只做一件事,因此引入系统Bug的几率明显降低了,这要归功于基于服务的系统的天生的行为。

微服务架构的好处

微服务架构模式有很多好处。首先,通过分解巨大单体式应用为多个服务方法解决了复杂性问题。在功能不变的情况下,应用被分解为多个可管理的分支或服务。每个服务都有一个用RPC-或者消息驱动API定义清楚的边界。微服务架构模式给采用单体式编码方式很难实现的功能提供了模块化的解决方案,由此,单个服务很容易开发、理解和维护。

第二,这种架构使得每个服务都可以有专门开发团队来开发。开发者可以自由选择开发技术,提供API服务。当然,许多公司试图避免混乱,只提供某些技术选择。然后,这种自由意味着开发者不需要被迫使用某项目开始时采用的过时技术,他们可以选择现在的技术。甚至于,因为服务都是相对简单,即使用现在技术重写以前代码也不是很困难的事情。

第三,微服务架构模式是每个微服务独立的部署。开发者不再需要协调其它服务部署对本服务的影响。这种改变可以加快部署速度。UI团队可以采用AB测试,快速的部署变化。微服务架构模式使得持续化部署成为可能。

最后,微服务架构模式使得每个服务独立扩展。你可以根据每个服务的规模来部署满足需求的规模。甚至于,你可以使用更适合于服务资源需求的硬件。比如,你可以在EC2 Compute Optimized instances上部署CPU敏感的服务,而在EC2 memory-optimized instances上部署内存数据库。

微服务架构的不足

Fred Brooks30年前写道,“there are no silver bullets”,像任何其它科技一样,微服务架构也有不足。其中一个跟他的名字类似,『微服务』强调了服务大小,实际上,有一些开发者鼓吹建立稍微大一些的,10-100 LOC服务组。尽管小服务更乐于被采用,但是不要忘了这只是终端的选择而不是最终的目的。微服务的目的是有效的拆分应用,实现敏捷开发和部署。

另外一个主要的不足是,微服务应用是分布式系统,由此会带来固有的复杂性。开发者需要在RPC或者消息传递之间选择并完成进程间通讯机制。更甚于,他们必须写代码来处理消息传递中速度过慢或者不可用等局部失效问题。当然这并不是什么难事,但相对于单体式应用中通过语言层级的方法或者进程调用,微服务下这种技术显得更复杂一些。

另外一个关于微服务的挑战来自于分区的数据库架构。商业交易中同时给多个业务分主体更新消息很普遍。这种交易对于单体式应用来说很容易,因为只有一个数据库。在微服务架构应用中,需要更新不同服务所使用的不同的数据库。使用分布式交易并不一定是好的选择,不仅仅是因为CAP理论,还因为今天高扩展性的NoSQL数据库和消息传递中间件并不支持这一需求。最终你不得不使用一个最终一致性的方法,从而对开发者提出了更高的要求和挑战。

测试一个基于微服务架构的应用也是很复杂的任务。比如,采用流行的Spring Boot架构,对一个单体式web应用,测试它的REST API,是很容易的事情。反过来,同样的服务测试需要启动和它有关的所有服务(至少需要这些服务的stubs)。再重申一次,不能低估了采用微服务架构带来的复杂性。

另外一个挑战在于,微服务架构模式应用的改变将会波及多个服务。比如,假设你在完成一个案例,需要修改服务ABC,而A依赖BB依赖C。在单体式应用中,你只需要改变相关模块,整合变化,部署就好了。对比之下,微服务架构模式就需要考虑相关改变对不同服务的影响。比如,你需要更新服务C,然后是B,最后才是A,幸运的是,许多改变一般只影响一个服务,而需要协调多服务的改变很少。

微服务总结

1、微服务是一种新的架构思路,从传统的SOA中发扬出来,摒弃了传统SOA重型、低效的弊端。

2、微服务更多的是一种架构理念,服务的划分没有一个强规则,遵循服务自治,数据自有即可。实施微服务同时也在践行新的敏捷、devops等开发理念。

3、微服务适合复杂应用,微服务就是为解耦复杂应用诞生。复杂是业务逻辑复杂,并不是资源消耗多。所以微服务更适合应用层业务的实施,而不是底层平台,如存储、数据库、OS等。

4、微服务需要发展和配合更多的分布式监控、部署、测试、定位工具,架构的解耦同时引入了分布式的复杂性。

参考文献

1、微服务架构解析http://www.infoq.com/cn/news/2013/12/micro-service-architecture/

 2、详述微服务架构的优势与不足http://www.d1net.com/cloud/news/351811.html

2
1
分享到:
评论

相关推荐

    SpringCloud核心技术-初识SpringCloud微服务解决方案.docx

    SpringCloud 核心技术初识微服务解决方案 SpringCloud 是一个基于 Java 语言的微服务架构解决方案,由 Netflix 公司开发,旨在帮助开发者快速构建可靠的微服务系统。 SpringCloud 的核心技术包括服务注册、服务...

    Docker+k8s的微服务实战课程

    一、初识微服务 1 微服务-导学 2 软件架构的进化 3 什么是微服务 4 画出微服务架构图 5 微服务架构的优势和不足 二、微服务带来的问题及解决方案分析 1 微服务架构带来的问题 2 微服务间如何通讯 3 服务发现、部署...

    Docker+Kubernetes(k8s)微服务容器化实践1

    在【初识微服务】部分,首先提到了Web应用的整体框架,这是理解微服务的基础。传统的Web应用架构通常由前端、后端、数据库等组成,而随着业务复杂性的增加,单体架构的局限性逐渐显现。容器化与DevOps工具的引入,如...

    资料资料 资料 资料 资料 资料

    初识微服务资料

    Spring Microservices(pdf+epub+mobi+code_files).zip

    总而言之,《Spring Microservices》是一本深入浅出的指南,无论你是初识微服务还是寻求实践经验,都能从中受益匪浅。通过阅读并实践书中的例子,你将能够熟练掌握使用Spring构建高效、稳定的微服务系统。

    Nacos 核心原理解读+高性能微服务系统实战视频第2章 初识Nacos

    Nacos 核心原理解读+高性能微服务系统实战【视频】第2章 初识Nacos

    初识springboot,自学springboot,微服务demo,使用idea直接导入运行

    总之,通过这个初识SpringBoot的教程,你将学习到如何使用IDEA搭建和运行SpringBoot微服务应用,以及如何实现拦截器来扩展请求处理的功能。随着深入学习,你将发现SpringBoot的强大之处,它不仅简化了开发流程,还...

    高级Java人才培训专家-微服务保护

    #### 二、初识Sentinel **雪崩问题及解决方案** - **雪崩问题**:在微服务架构中,如果某一环节出现故障,可能会导致后续的一系列服务调用都受到影响,最终导致整个系统的瘫痪,这种现象被称为“雪崩效应”。 - **...

    微服务保护.pdf

    #### 一、初识Sentinel ##### 1.1 雪崩问题及解决方案 **1.1.1 雪崩问题** 在微服务架构中,各服务之间通过复杂的调用关系进行交互。一旦某个服务出现问题(如服务I发生故障),依赖该服务的其他服务也会受到影响,...

    初识springboot(修订版).docx

    ### 初识Spring Boot及其环境配置 #### 一、微服务与Spring Boot概念 ##### 微服务简介 微服务架构是一种现代软件设计方法,它强调将一个大型的应用程序拆分成一组小的服务,每个服务实现单一的功能,并且可以独立...

    初识前端后端UI

    微服务架构则将大型应用拆分成小的、独立的服务,每个服务都有自己的业务逻辑和数据库,提高了可扩展性和可维护性。 最后,Web UI技术综述。UI设计是提升用户体验的关键,它包括颜色搭配、布局、字体选择等视觉元素...

    springboot初识

    SpringBoot初识:快速搭建与应用 SpringBoot是由Pivotal团队提供的全新框架,其设计目标是用来简化新Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如JPA、Thymeleaf、WebSocket等,使得...

    国人:JSON-RPC之初识

    在《国人:JSON-RPC之初识》这篇博文中,作者可能详细介绍了如何在实际项目中使用JSON-RPC,包括设置服务器端的JSON-RPC服务、创建客户端连接、调用远程方法以及处理可能出现的错误。同时,可能会涉及到一些工具的...

    dubbo框架初识

    **Dubbo框架初识** Dubbo,源自阿里巴巴,是一款高性能、轻量级的Java服务治理框架,它主要致力于解决微服务架构中的服务发现、服务调用、服务治理等问题。Dubbo的核心理念是“面向接口的编程”,使得服务提供者和...

    初识springboot

    SpringBoot对微服务架构有很好的支持,可以轻松地与Spring Cloud等微服务框架集成,实现服务发现、配置中心、熔断器等功能。 十、测试支持: SpringBoot提供了丰富的测试支持,包括单元测试、集成测试和端到端测试...

    初识 Node.js-3课时 课件 源码.zip

    这个"初识 Node.js-3课时 课件 源码.zip"文件显然是一个关于 Node.js 入门教程的压缩包,包含了三课时的课程内容以及源代码,适合初学者学习理解和实践。 ### 第一课时:Node.js 简介 在第一课时中,你可能会学习...

    初识java,用springBoot学习java

    - **微服务架构**:进一步学习Spring Cloud,实现微服务间的通信和协调。 4. **项目实践** - **创建项目**:使用Maven或Gradle创建Spring Boot项目,选择合适的起步依赖。 - **编写Controller**:定义REST API,...

    初识前端后端UI交互,初学者必看

    **前后端开发模式**有很多种,例如MVC(模型-视图-控制器)、MVVM(模型-视图-ViewModel)、SPA(单页应用)和微服务架构等。MVC是经典的设计模式,将业务逻辑、数据和用户界面分离。MVVM在前端开发中广泛应用,如...

    Springboot入门课件.pptx

    SpringBoot是为了解决传统JavaWeb开发中的复杂性而诞生的,它简化了开发和部署过程,尤其适用于微服务架构。 1. **SpringBoot简介** - SpringBoot简化了传统的JavaWeb开发,不再需要繁琐的Servlet配置和Tomcat部署...

Global site tag (gtag.js) - Google Analytics