微服务架构(MSA)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的类上应用很多 SOLID 原则。
用通俗的话来讲,就是为了高度解耦软件之间的依赖性,使每个独立的模块都能够单独测试,单独运维,最大限度的提高软件的开发流程。从下图可以看一下微服务的软件生命周期。
软件从需求分析就可以适配模块,也就是说需求分析的过程就可以加入设计,从新的角度来说就是在哪个模块中进行升级开发,开发人员在开发完成后,通过持续集成,将开发的结果发布到测试环境中供测试人员使用,在反复测试后,可以将测试完成的版本部署到线上环境,并且持续运维,使整个流程效率最大化。
其实不只是互联网业务,对于给客户提交的传统型业务也非常适合使用微服务。
下面说一下相关的技术框架,现在主要是java和go两种语言特别适合:
spring-boot是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
多年以来, Spring IO平台 饱受非议的一点就是大量的XML配置以及复杂的依赖管理。在去年的SpringOne 2GX会议上,Pivotal的CTO Adrian Colyer 回应了这些批评 ,并且特别提到该平台将来的目标之一就是实现免XML配置的开发体验。Boot所实现的功能超出了这个任务的描述,开发人员不仅不再需要编写XML,而且在一些场景中甚至不需要编写繁琐的import语句。在对外公开的beta版本刚刚发布之时,Boot描述了如何使用该框架在140个字符内实现可运行的web应用,从而获得了极大的关注度,该样例发表在 tweet 上。
然而,Spring Boot并不是要成为Spring IO平台里面众多 “Foundation”层 项目的替代者。Spring Boot的目标不在于为已解决的问题域提供新的解决方案,而是为平台带来另一种开发体验,从而简化对这些已有技术的使用。对于已经熟悉Spring生态系统的开发人员来说,Boot是一个很理想的选择,不过对于采用Spring技术的新人来说,Boot提供一种更简洁的方式来使用这些技术。
在追求开发体验的提升方面,Spring Boot,甚至可以说整个Spring生态系统都使用到了 Groovy编程语言 。Boot所提供的众多便捷功能,都是借助于Groovy强大的MetaObject协议、可插拔的AST转换过程以及内置的依赖解决方案引擎所实现的。在其核心的编译模型之中,Boot使用Groovy来构建工程文件,所以它可以使用通用的导入和样板方法(如类的main方法)对类所生成的字节码进行装饰(decorate)。这样使用Boot编写的应用就能保持非常简洁,却依然可以提供众多的功能。
至于体验spring boot的极速,这里就不表述了,对于微服务提出的无状态、消息集成都可以看实际的相关例子,相信会有更深刻的理解。
Spring 框架对 JPA 提供的支持主要体现在如下几个方面:
首先,它使得 JPA 配置变得更加灵活。JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中。该文件通常包含了初始化 JPA 引擎所需的全部信息。Spring 提供的 LocalContainerEntityManagerFactoryBean 提供了非常灵活的配置,persistence.xml 中的信息都可以在此以属性注入的方式提供。
第三,也是最具意义的,Spring 将 EntityManager 的创建与销毁、事务管理等代码抽取出来,并由其统一管理,开发者不需要关心这些,业务方法中只剩下操作领域对象的代码,事务管理和 EntityManager 创建、销毁的代码都不再需要开发者关心了。
这个也就是传统意义上的DAO层和一部分SERVICE层的封装,大大的简化了开发工作。
Spring Data REST是 Spring Data 项目的一部分,通过它可以轻松将基于JPA的库作为RESTful末端。
Spring Data REST项目的目标是通过使用简单的HTTP REST语义,为实现CRUD(Create Read Update Delete,增查改删)操作到你的JPA库管理的实体中提供一个坚实的基础。
那这东西跟Spring MVC是什么关系呢,开发者可以轻松在现有的Spring MVC应用程序中集成Spring Data REST,只需在Spring MVC配置中添加一个bean,好吧,就是这么简单。
以上基本上覆盖了微服务开发的各个层次,逻辑关系如下图:
说完了java,再来看看go,
beego是一个快速开发Go应用的http框架,作者是SegmentFault 用户,go 语言方面技术大牛。beego可以用来快速开发API、Web、后端服务等各种应用,是一个 RESTFul 的框架,主要设计灵感来源于 tornado 、sinatra、 flask 这三个框架,但是结合了Go本身的一些特性(interface、struct继承等)而设计的一个框架。
如果想了解这个框架,可以从它的官网来查看:
http://beego.me/
好吧,开发文档几乎覆盖了所有的开发规则,所需要做的就是学习一下go的语法,然后go吧。
关于beego的介绍:
http://beego.me/docs/intro/
微服务为系统带来方便的同时,也会带来一些问题,测试一个基于微服务架构的应用也是很复杂的任务。比如,采用流行的Spring Boot架构,对一个单体式web应用,测试它的REST API,是很容易的事情。反过来,同样的服务测试需要启动和它有关的所有服务(至少需要这些服务的stubs)。再重申一次,不能低估了采用微服务架构带来的复杂性。
另外一个挑战在于,微服务架构模式应用的改变将会波及多个服务。比如,假设你在完成一个案例,需要修改服务A、B、C,而A依赖B,B依赖C。在单体式应用中,你只需要改变相关模块,整合变化,部署就好了。对比之下,微服务架构模式就需要考虑相关改变对不同服务的影响。比如,你需要更新服务C,然后是B,最后才是A,幸运的是,许多改变一般只影响一个服务,而需要协调多服务的改变很少。
最后,重要的事情说三遍:不能低估了采用微服务架构带来的复杂性、不能低估了采用微服务架构带来的复杂性、不能低估了采用微服务架构带来的复杂性。
参考资料:
深入学习微框架:Spring Boot
使用 Spring Data JPA 简化 JPA 开发
Spring Data REST 1.0候选版发布,Spring MVC的REST扩展
beego官网
作者:skyme 出处: http://www.niubua.com/
邮箱【cloudskyme@163.com】
QQ 【270800073】
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。