基于微服务架构,改造企业核心系统之实践

代码生成工具

借助Stencil代码生成工具,我们能在很短时间内就构建出一个可以立即运行的微服务应用程序。随着系统越来越复杂,微服务程序的不断增多,Stencil模板和代码生成工具帮助我们大大简化了创建微服务的流程,让开发人员更关注如何实现业务逻辑并快速验证。

Create a project from the stencil template (version 0.1.27)
--name, -n <s>: New project name. eg. things-and-stuff
--git-owner, -g <s>: Git owner (default: which team or owner)
--database, -d: Include database connection code
--triggered-task, -t: Include triggered task code
--provider, -p: Is it a service provider? (other services use this service)
--consumer, -c: Is it a service consumer? (it uses other services)
--branch, -b <s>: Specify a particular branch of Stencil
--face-palm, -f: Overide name validation
--help, -h: Show this message

如上代码所示,通过指定不同参数,我们能创建具有数据库访问能力的微服务程序,或者是包含异步队列处理的微服务程序。同时,我们也可以标记该服务是数据消费者还是数据生产者,能帮助我们理解多个微服务之间的联系。

持续集成模板

基于持续集成服务器Bamboo,团队创建了针对Stencil的持续集成模板工程,并定义了三个主要阶段:

打包:运行单元测试,集成测试,等待测试通过后生成RPM包。

发布:将RPM包发布到Koji服务器上,并打上相应的Tag。然后使用Packer在亚马逊 AWS云环境中创建AMI,建好的AMI上已经安装了当前微服务程序的最新RPM包。

部署:基于指定版本的AMI,将应用快速部署到验收环境或者产品环境上。

利用持续集成模板工程,团队仅需花费很少的时间,就可以针对新建的微应用程序,在Bamboo上快速定义其对应的持续集成环境。

一键部署工具

所有的微服务程序都部署并运行在亚马逊AWS云环境上。同时,我们使用Asgard对AWS云环境中的资源进行创建、部署和管理。 Asgard是一套功能强大的基于Web的AWS云部署和管理工具,由Netflix采用Groovy>基于B/S的AWS部署及管理工具,使用户能通过浏览器直接访问AWS云资源,无需设置Secret Key和Access Key;

定义了`Application`以及`Cluster`等逻辑概念,更清晰、有效地描述了应用程序在AWS云环境中对应的部署拓扑结构。

在对应用的部署操作中,集成了AWS Elastic Load Balancer、AWS EC2以及AWS Autoscaling Group,并将这些资源自动关联起来。

提供RESTful接口,能够方便地与其他系统集成。

简洁易用的用户接口,提供可视化的方式完成一键部署以及流量切换。

由于Asgard对RESTful的良好支持,团队实现了一套基于Asgard的命令行部署工具,只需如下一条命令,提供应用程序的名称以及版本号,就可自动完成资源的创建、部署、流量切换、删除旧的应用等操作。

asgard-deploy [AppName] [AppVersion]

同时,基于命令行的部署工具,也可以很容易的将自动化部署集成到Bamboo持续集成环境。

通过使用微服务框架Stencil,大大缩短了团队开发微服务的周期。同时,基于Stencil,我们定义了一套团队内部的开发流程,帮助团队的每一位成员理解并快速构建微服务。

微服务架构下的新系统

经过5个月的努力,我们重新构建了合同管理系统,将之前的产品、价格、销售人员、合同签署、合同审查以及PDF生成都定义成了独立的服务接口。相比之前大而全、难以维护的合同管理系统而言,新的系统由不同功能的微服务组成,每个微服务程序只关注单一的功能。每个微服务应用都有相关的负责人,通过使用Page Duty建立消息通知机制。每当有监控出现告警的时候,责任人能立即收到消息并快速做出响应。

由于微服务具有高内聚,低耦合的特点,每个应用都是一个独立的个体。当出现问题时,很容易定位问题并解决问题,大大缩短了修复缺陷的周期。另外,通过使用不同功能的微服务接口提供数据,用户接口(UI)部分变成了一个非常简洁、轻量级的应用,更关注如何渲染页面以及表单提交等交互功能。