黄强文 曾丹
摘 要: 近年来,微服务架构是当前最流行的分布式系统类型之一,相比傳统单体架构它解决了数据、服务呈爆炸式增长带来的冲击问题。以构建一个天气预报分布式微服务系统为例,利用Spring Cloud框架将系统垂直切分为四个独立的业务服务:城市数据API微服务、天气数据采集微服务、天气数据API微服务和天气预报微服务。系统集成Eureka做服务发现,使用Zuul做路由网关,结合Hystrix熔断机制提高了系统的容错性,并使用Docker容器快速独立部署所有微服务,实现了开发、测试、部署运维的一体化。
关键词: 微服务架构; Spring Cloud框架; Docker容器
中图分类号: TP309
文献标志码: A
文章编号:1007-757X(2019)06-0098-04
Abstract: In recent years, as one of the most popular distributed system types, the microservice architecture has solved the problem of explosive growth of data and services compared to the traditional singleton architecture. Taking the construction of a weather forecast distributed microservice system as an example, this paper uses the Spring Cloud framework to divide the system vertically into four separate business services: the city data API microservice, the weather data collection microservice, the weather data API microservice, and the weather forecast microservice. The system integrates Eureka for service discovering, uses Zuul as a routing gateway, improves the fault tolerance of the system in conjunction with the Hystrix zapping mechanism, and uses the Docker container to quickly and independently deploy all services, it realizes the integration of development, tests, deployment operation and maintenance.
Key words: Microservice architecture; Spring Cloud framework; Docker container
0 引言
随着互联网、云计算的高速发展,人们对数据信息化服务依赖程度越来越深。以往的单体应用架构和面向服务化应用的架构逐渐不能满足业务的需求。而微服务这种分布式架构的兴起,是云计算应用快速发展的必然产物,也将是未来整个软件应用架构向着灵活多变、低耦合、高扩展性、动态伸缩发展的一个必然方向[1]。与此同时,Docker的诞生,代表着容器虚拟化技术的盛行高峰,它将极大减少微服务应用实现大规模部署、落地的成本。
微服务架构就是将单体应用拆分为多个高内聚低耦合的小型服务,每个小服务运行在独立进程,由不同的团队开发和维护,服务间采用轻量级通信机制,独立自动部署,可以采用不同的语言及存储。微服务架构具有如下优势[2]:
(1) 微服务架构将业务系统彻底的组件化、服务化,微服务专注于业务逻辑,服务功
能简单,边界清晰,复杂度低,接口明确,服务利于开发、部署。
(2) 服务耦合度低,每个服务是一个微型的应用,有完整的架构,可独立部署。
(3) 微服务架构允许根据服务的功能和团队的自身条件选择不同的技术路线。
(4) 优良的容错机制和熔断机制,保障微服务之间交互的友好性。
本文将以一个天气预报微服务系统为案例,使用Spring Cloud框架进行构建,将系统拆分为四个独立的子微服务:城市数据API微服务、天气数据采集微服务、天气数据API微服务和天气预报微服务。系统采用Eureka做服务注册与发现,Zuul做路由API网关,Feign做服务节点间通信,Ribbon做负载均衡,Spring Cloud Config做统一管理微服务配置,Hystrix做服务熔断,Turbine聚合监控多个微服务运行状态,并使用Docker容器自动、快速、独立部署所有微服务在一台阿里云服务器上。本文最后给出天气预报系统实现结果,并模拟天气数据API微服务掉线操作验证此系统优良的容错机制。
1 主要框架技术
1.1 Sping Cloud框架
Spring Cloud 是一系列框架、组件的有序集合,拥有功能完善的、轻量级的微服务实现组件,例如服务发现治理、服务容错、服务网关、服务配置、负载均衡、消息总线、服务跟踪等方面均有经过实践检验的成熟组件[2]。基于Spring Cloud 各组件的完整架构图,如图1所示。
其中Eureka组件负责服务的注册与发现,很好将各服务连接起来。Zuul扮演API网关的角色,它对一切来自外部的服务请求进行路由转发。Feign作为HTTP客户端实现各微服务节点间的通信。Ribbon会根据服务网关的配置实现负载均衡。Config-Server组件为整个微服务系统提供了统一的配置管理中心。Hystrix起到监控各个服务之间的通信调用情况,如果失败次数达到一个设置的阈值将进行熔断保护。Turbine 结合Dashboard组件是用来监控查看Hystrix的熔断情况,并且给予系统维护者一种图形化的界面展示。
1.2 Docker容器
Docker是使用Google 公司推出的Go语言进行开发实现的高级容器引擎,其最终目的是实现对一个完整的应用进行打包封装、独立部署并运行在宿主机上的管理,做到应用组件级别的“一次封装,随处运行”[3]。从Docker实现方式的本质上来讲,它其实就是运行在宿主机上的一个进程。Docker通过namespace实现了资源隔离,通过cgroups实现了资源的限制,通过写时复制机制实现了高效的文件操作[4]。
传统的虚拟机技术一般都是虚拟出一套完整的硬件,在上面运行一个完整的操作系统,然后把应用程序部署运行在此虚拟操作系统上。和传统的虚拟化方式相比,容器就十分轻便了。容器没有虚拟出任何硬件,也没有内核,应用程序都是运行在宿主机的内核。Docker容器利用系统资源更高效,拥有着秒级的启动速度、一致的运行环境、超方便的迁移和轻松的维护扩展特点。
Docker容器有3个基本概念:镜像、容器和仓库。
镜像,其实是一个文件系统,用来储存容器运行时需要的程序资源、配置资源、库资源等文件,它不包含任何动态数据。镜像使用分层储存,一层层进行构建,后一层以前一层为基础,内容一但构建后就不会再改变了。
容器,是镜像启动的实例。容器其实就是一个进程,运行在一个完全独立的隔离空间,有着自己的文件系统和网络配置。所以容器封装的应用比直接在宿主运行更加安全。
仓库,是一个用来储存和分发镜像的服务中心。类似Maven仓库,1个仓库包括多种标签,1个标签对应着1个特定的镜像。一般通过仓库名:标签的格式来确定某个应用软件具体的镜像版本。
2 系统设计
本系统的业务主要拆分为四个独立的子微服务。城市数据API微服务负责提供城市列表数据,并提供接口给天气数据采集微服务调用;天气数据采集微服务负责请求第三方数据服务的天气数据,并保存在Redis缓存中;天气数据API微服务负责调用天气数据采集微服务缓存的天气数据,并提供接口给天气预报微服务调用;天气预报微服务面向用户提供天气查询服务。此外,API网关负责路由转发请求。整体架构如图2所示。
2.1 微服务功能设计
(1) 城市数据API微服务:包含一张全国主要城市地区的Xml表,建立城市Javabean对象,然后利用JDK自带的JAXB解析包,快速便捷将城市Xml表解析转换为城市对象,并对外暴露接口/ cities,提供城市列表Json数据。
(2) 天气数据采集微服务:引入第三方Quartz定时器,集成Feign消费者客户端远程获取城市数据API微服务提供的城市列表数据,并结合配置了Httpclient的RestTemplate客户端每隔半小时远程调用第三方中国天气数据网的Json格式天气数据,刷新并缓存到Redis节点中。
(3) 天气数据API微服务:根据城市Id号或者城市名称从Redis缓存节点中获取天气数据,因为Redis缓存的是Json格式数据,所以用Jackson包把天气数据转换为Javabean,并对外暴露接口/weather/cityId/{cityId}和/weather/cityName/{cityName}。
(4) 天气预报微服务:暴露接口/report/cityId/{cityId},提供面向用户请求服务,把所有请求转发到API网关,并启动Hystrix熔断机制@FeignClient(name=" weather-gateway-zuul ", fallback=DataClientFallback.class)。
(5) 服务注册中心:使用Eureka做服务注册和发现中心,配置服务注册中心的URL地址。一個微服务就是一个节点,是一个完整的应用程序,并且可独立运行部署。系统除了本文上述的四个主要业务相关的微服务,还有API网关节点、配置中心Config-Server节点、Turbine的Hystrix监控节点等。这些节点都是以Eureka客户端形式注册在Eureka服务端,然后各个节点间采用轻量级Feign组件就可以实现相互调用通信了。
(6) API网关服务:根据URL转发请求到不同的微服务。用户请求访问天气预报微服务接口,天气预报微服务统一向API网关微服务发送请求,API网关再把所有请求转发到具体的其他微服务中,映射关系如下所示:
zuul.routes.city.path: /city/**
zuul.routes.city.serviceId: microservice-weather-city
zuul.routes.data.path: /data/**
zuul.routes.data.serviceId: microservice -weather-data
2.2 Docker容器部署设计
Spring Cloud应用是在Sping Boot基础上构建的,而由Spring Boot开发的应用内嵌了Tomcat,所以一个Spring Cloud应用可以直接以Jar包的形式独立运行。利用Gradle把各个微服务项目分别打包成Jar包,并使用Docker的Dockerfile镜像构建命令把各Jar包制作成对应镜像。
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Compose通过一个模板文件docker-compose.yml来定义一系列相互有关联的应用容器为一个整体项目,并且可以为各应用容器设置相应的网络环境和参数配置,如下所示为本系统的部分容器编排docker-compose.yml文件配置情况:
services://定义系统服务节点
discovery: //声明服务注册中心微服务节点
image: “discovery:0.0.1” // 配置discovery微服务容器镜像
ports: “8761:8761” //映射主机的8761端口到discovery容器的8761端口
microservice-weather-city1: //声明城市数据API微服务节点1
microservice-weather-city2: //声明城市数据API微服务节点2,使用同一个镜像,
//但通过设置不同端口来实现,用作负载均衡作用,
//其它3个微服务节点也是一样配置
microservice-weather-data: //声明天气数据API微服务节点
microservice -weather-collection //声明天气数据采集微服务节点
microservice-weather-report: //声明天气预报微服务节点
redis: //声明redis缓存节点
weather-gateway-zuul: //声明网关路由节点
…… //其它节点设置
networks: //设置所有容器节点在同一个网络环境service_base_default中
default:
external:
name: “service_base_default”
3 系统实现
整个天气预报微服务系统使用IntelliJ IDEA开发,采用Java语言,基于Spring Boot创建应用,并结合Gradle项目构建工具编译成可独立运行的Jar包应用。构建出来的每个可独立运行的Jar包应用都是系统的节点,本系统实现的所有节点如表1所示。
本系统采用Docker容器快速编排所有节点,其中4个主要的微服务节点都启动两个实例以作负载均衡。系统运行在阿里云服务器上,不同节点采用不同的端口,其中天气预报微服务microservice -weather-report提供面向用戶接
口/report/cityId/{cityId},供用户查询天气数据,用户通过访问http://39.108.184.144:8084/report/cityId/101020100可获得上海近日的天气预报,具体显示界面如图3所示,也可以通过该界面下拉列表选择其他城市获取对应的天气数据。
同时访问Turbine聚合节点,可以监控多个微服务运行状态,图4显示的是天气预报微服务节点microservice-weather-report的运行指标,如每秒执行的请求数、成功数、失败数等。
此时,停止天气数据API微服务,再次查询上海天气预报情况,出现图5所示界面,服务快速正常响应,并没有崩溃,说明天气预报微服务启动了断路器,并进入回退方法,响应其他良好内容“温馨提示:天气预报查询服务暂不可用,请稍后再查询哦!”给用户,验证了分布式微服务系统优良的容错机制。
4 总结
本文结合当前主流的分布式微服务架构思想,将天气预报系统切分为四个独立的微服务节点,各微服务之间通过Eureka实现服务注册与发现,通过轻量级Feign做通信机制。系统引入Zuul做API网关转发请求,Ribbon做负载均衡,Turbine做 Hystrix熔断情况的监控。同时,结合Docker实现微服务容器快速编排,并采取停止天气数据API微服务操作验证此系统优良的容错机制。使用当前最流行的Spring Cloud框架创建扩展性好、灵活、风险低的微服务应用[5],并结合Docker的秒级启动,进程间隔离,快速部署的特点,无疑使得基于Spring Cloud和Docker的分布式微服务架构将在未来软件架中扮演举足轻重的角色。
参考文献
[1] 孙海洪. 微服务架构和容器技术应用[J].金融电子化,2016(5):63-64.
[2] 王方旭.基于Spring Cloud实现业务系统微服务化的设计与实现[J].电子技术与软件工程,2018(8):60-61.
[3] 高礼,高昕.Docker技术在软件开发过程中的应用研究[J].软件,2016,37(3):110-113.
[4] 马雄. 基于微服务架构的系统设计与开发[D].南京:南京邮电大学,2017.
[5] Marc Adler. Microservices Are the New Building Blocks of Financial Technology[J]. Wilmott,2017 (87):50-51.
(收稿日期: 2018.06.15)