一、背景介绍
微服务被认为是IT软件架构的未来方向,其基本思想是围绕业务领域组件来创建应用,应用可独立地进行开发、管理和加速。在分散的组件中使用微服务云架构和平台使部署、管理和服务功能交付变得更加简单。随着软件对敏捷性、低成本等提出了更高的要求,微服务也越来越火。
图1 传统应用和微服务对比
二、什么是微服务?
软件开发者James Lewis和Martin Fowler给出的定义:“微服务架构的风格就是一种开发一个单独的应用程序作为一组小的服务方法,每个服务运行在自己的进程中,并使用轻量级的机制沟通,通常是HTTP API。这些服务建立在其处理业务能力的基础上构建,并通过全自动化的部署机制独立部署,最低限度的集中管理这些服务。它们可能是用不同的编程语言编写,并使用不同的数据存储技术。”
个人理解:微服务可以分为两方面,“微”和“服务”。什么是“微”?重量轻、形状小到一定程度。什么是“服务”?这里的服务和传统应用有区别,应尽量将功能拆分,服务粒度做小,把一个或者一组相对较小且可独立部署运行对外提供功能、用户感知最小单元称为服务。传统应用是整体进行交付,其缺陷是不能满足更高复杂度下对服务治理、运维、自动化基础设施的要求,随着系统复杂度的持续升高,软件交付需要支持高效扩展,势必将功能进行拆分,从而演化成一个个微服务。这种思路带来的好处就是可以独立开发、部署从而保障自己持续稳固的运行。比如:商品分类、购物车、订单,支付中心等都可以作为单个服务独立提供,如图2所示。
图2 微服务
那什么样的应用适合做成微服务?我们可以从根据业务模块划分服务种类、每个服务可独立部署运行且相互隔离、通过轻量级 API 调用服务的通信机制和架构、服务松耦合且需保证良好的高可用性四个方面来衡量。简而言之就是根据需求和业务场景来决定,不能为了微服务而微服务。
三、基于SpringBoot构建微服务及实践
SpringBoot框架的理念是自动配置(Auto Configuration),将Spring传统的约定优先配置的思路(Conversion Over Configuration)进一步发扬,它要解决的痛点是原先Spring集成各种框架时的繁琐配置和版本库的依赖问题,提供基础能力和总体构建应用的思路,拆分后的服务可独立开发部署以及运行。
1.速度快
使用SpringBoot构建简单、启动访问速度快。具体步骤如下:
搭建maven工程,在pom.xml文件中引用SpringBoot
图3 引用SpringBoot
配置数据源
图4 配置文件
编码RESTful API接口
图5 Controller
编码SpringBoot启动类
图6 启动类
完成以上步骤即搭建完成,启动Application成功后即可访问。
2.认证和鉴权
在pom.xml文件中,引入spring-boot-starter-security的依赖
图7 spring-boot-starter-security
在application.properties中,配置访问的用户名和密码
图8 配置文件
再次访问时,拦截后出现以下登录页面,表示配置成功
图9 拦截后的登录页面
以上是一个简单的鉴权认证,更复杂的配置,可以分不同角色,然后按照设计(比如做到方法级别的拦截),实现权限控制。Security广泛支持各种身份验证模式,这些验证模型绝大多数都由第三方提供,或者正在开发的有关标准机构提供的。作为补充,Security 也提供了自己的一套验证功能,目前支持认证一体化如下认证技术:
HTTP BASIC authentication headers
HTTP Digest authentication headers
HTTP X.509 client certificate exchange
LDAP 、Form-based authentication
OpenID authentication Computer Associates Siteminder
JA-SIG Central Authentication Service
Transparent authentication context propagation for Remote Method Invocation and HttpInvoker
具体需要用到哪些,我们根据实际需求再去细化。
3.SpringBoot服务间的通信
目前在三种主流的Web服务实现方案中,REST模式的Web服务与复杂的SOAP和XML-RPC相比较,更加简洁,通过注解暴露接口很方便,因此越来越多的Web服务开始采用REST风格设计和实现。SpringBoot中就是使用REST,让我们的工作变得更加轻松。
4.SpringBoot profile,实现多环境自动切换,简单实用。
全局的profile为application.properties,可以根据不同的环境配置多个,命名规范为: application-{环境}.properties,可以自定义N个,如下,自定义了2个,分别为dev,test。
图10 profile配置文件
在全局的application.properties里面注明当前激活的配置,如:spring.profiles.active=dev。application-dev.properties或application-test.properties里面可以配置相关的配置信息,比如: 数据库信息、日志信息、端口信息等。SpringBoot 的执行顺序为: 首先执行全局的application.properties,检查是否有配置当前激活的子文件,如果有,则读取子配置中的信息进行初始化。如果没有,则直接使用全局中的配置信息初始化。
5.集成管理和监控
SpringBoot 对这些运维相关的功能进行了整合,形成了一个功能完备和可定制的功能集,称之为 Actuator。Actuator模块包含性能指标、运行信息和应用管理等。在pom.xml文件中添加 spring-boot-starter-actuator 的依赖即可,添加之后会自动暴露一些 HTTP 服务来提供这些信息。如下:
表1 SpringBoot Actuator 所提供的 HTTP 服务
表1中的每个服务通过访问名称对应的 URL 就可以获取到相关的信息(如访问“/health”就可以获取 health服务对应的信息)。服务是否包含敏感信息说明了该服务暴露出来的信息是否包含一些比较敏感的信息,从而确定是否需要添加相应的访问控制,而不是对所有人都公开。所有的这些服务都是可以配置的,比如通过改变名称来改变相应的 URL。
6.集成对数据库的支持
SpringBoot中spring-boot-starter-data-jpa对数据库功能进行了整合,其包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。项目中使用它与数据库交互,快速高效方便。和以前整合SSH框架相比,可以避免冲突带来的麻烦。配置如下:
图11 spring-data-jpa配置文件
四、微服务架构需要考虑哪些方面?
微服务使我们的工作便捷高效,但这仅限于单个微服务。而实际应用中微服务不止一个,那么问题来了:多个微服务之间怎么相互通信?他们怎么组成一个完整的应用?谁提供云架构和平台来部署管理?Spring家族有很多开源项目,SpringBoot只是其中一员,针对上面提出的问题,SpringCloud也给出了自己的答案。微服务架构需要考虑哪些方面,具体如下:
服务前端路由
服务注册、发现、负载均衡、容错和健康检查
认证和鉴权
轻量级的通信,事件调度机制
分布式数据管理
统一代码框架(支持多种编程语言、框架依赖关系和集成管理接口)
统一错误处理框架(问题定位及调试)
统一服务构建、打包、开发测试
持续集成和持续交付(CI/CD)
灰度发布和蓝绿部署(部署、升级)
日志监控和审计(日志的汇总、分类和查询)
监控和告警(监控每个服务的状态,必要时产生告警)
资源管理(物理机、虚拟机、存储和网络管理)
基础设施自动化
由此可见,微服务架构需要考虑的东西很多、涉及的面也很广,但在实际应用中未必需要全部实现,针对自己的业务场景需求去选择,适合的就是最好的。
五、使用心得
对于许多应用来说,由于其原始的架构设计和依赖关系,整体设计是不可避免的。然而由于响应速度、经济成本等,有些应用迫不得已需要重新设计,需要将应用分割成更小的服务,允许更大的灵活性和可扩展性,使开发人员能够轻松地更改代码,各服务尽量解耦互不影响,生产中这些服务能够独立缩放。
微服务带来的好处:
1、微服务体积小,易于理解、开发和维护
2、启动速度更快并能独立部署
3、可以多个团队同步进行开发工作
4、微服务可以实现分离
5、技术多样性
看起来很完美,但使用它也要考虑付出的代价:
1、增加内存消耗
2、分布式系统难以编写
3、不一致性的管理
4、测试、运维工作的复杂性
综上所述,微服务有利有弊,你的应用是否适合微服务?答案不是肯定的,这要根据需求和业务场景来决定。微服务是一种分布式架构、一种降低单个子系统架构、实现和维护复杂度的实践方式。除了SpringBoot,微服务框架还有Dropwizard、Vertx、Jersey、Restlet等,根据实际需求去选择适合的。SpringBoot并不能够解决所有问题,离微服务架构的实现还是有距离的。所以,机遇与挑战并存,革命尚未成功,仍需我们努力!