基于Spring Cloud的微服务架构的应用与实现

2021-04-03 23:46葛萌李闯男欧阳宏基
现代信息科技 2021年19期

葛萌 李闯男 欧阳宏基

摘  要:传统单体架构存在着开发技术单一、系统耦合度高、错误隔离性差、可收缩性差等缺点。微服务架构以分而治之、可收缩性强、模块独立开发、迭代周期短等优点逐渐成为新一代软件开发架构用来弥补单体架构的缺陷。介绍了微服务架构的基本概念,以Spring Cloud微服务框架为基础,利用Java语言、中间件技术和MySQL数据库设计并实现了一个教师教学评价系统。论述了微服务架构实现的关键步骤和系统核心模块的实现过程,为微服务架构在应用中的实现提供了一定的借鉴。

关键词:微服务架构;Spring Cloud;中间件技术;教学评价系统

中图分类号:TP311                  文献标识码:A文章编号:2096-4706(2021)19-0023-04

Application and Implementation of Microservice Architecture Based on Spring Cloud

GE Meng, LI Chuangnan, OUYANG Hongji

(School of Computer Science, Xianyang Normal University, Xianyang 712000, China)

Abstract: The traditional monomer architecture has some disadvantages, such as single development technology, high system coupling, poor error isolation, poor scalability and so on. Microservice architecture has gradually become a new generation of software development architecture to make up for the defects of monomer architecture with the advantages of divide and rule, strong contractibility, independent module development and short iteration cycle. This paper introduces the basic concept of microservice architecture, designs and implements a teacher teaching evaluation system based on Spring Cloud microservice framework, Java language, middleware technology and MySQL database. It discusses the key steps of implementation of microservice architecture and the implementation process of system core modules, which provides a certain reference for the implementation of microservice architecture in application.

Keywords: microservice architecture; Spring Cloud; middleware technology; teaching evaluation system

0  引  言

傳统的单体应用系统架构会随着软件规模和业务的扩大变得复杂且不易于扩展和维护,微服务架构的出现很好地解决了这个问题[1]。微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通。每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等[2]。

本文以Spring Cloud为微服务架构的实现框架[3],以教师教学评价为业务背景,综合应用Maven管理工具、Mycat中间件、SSM框架[4]、Docker容器等技术,实现了微服务开发的基本流程,详细描述了核心模块的实现过程,Spring Clound框架的应用与实现提供了一定的参考。

1  微服务架构相关技术概述

1.1  Spring Boot框架

Spring Boot是一个Java EE一站式开发框架,可以简单、快速、零配置的创建基于Spring的项目[5]。Spring Boot提供了大量配置包,能够自动识别查找依赖管理中提供的jar包并进行配置。同时内置了Servlet容器,服务器上无须安装额外的软件,只要具备Java Runtime环境即可运行。还内置了健康检查、度量指标,可方便接入既有运维监控系统,也可使用自身提供的Spring Boot Admin服务监控。

1.2  Spring Cloud框架

Spring Cloud是一款基于Java语言、采用Spring Boot开发的微服务框架。它提供了服务治理、分布式配置、分布式任务、服务跟踪、消息总线、服务负载均衡、服务熔断降级等一系列问题的解决方案[6]。其中包括的核心组件有:(1)Spring Cloud Consul Config是一个分布式配置中心,为注册在同一Consul集群下的微服务下发配置。(2)Spring Cloud Consul Discovery将微服务注册到Consul中。(3)Spring Cloud OpenFeign声明式RestClient,通过接口方式调用其他微服务,封装了RestTemplate和负载均衡。(4)Spring Cloud LoadBalancer为微服务调用提供负载均衡。(5)Spring Cloud Hystrix断路器避免将单个服务的故障扩散到整个服务集群中。(6)Spring Data用于简化Spring应用对数据的访问,包括关系型数据库、非关系数据库、Map-Reduce 框架和云数据服务等。

1.3  Mycat数据库中间件

Mycat是一个开源的、面对大中型应用的数据库中间件[7]。使用Mycat的分库分表技术,可将大量记录分散到不同的MySQL数据库储存。Mycat负责维护具体的表信息。还可以通过读写分离技术来分散读写请求,在高并发场景下降低单一MySQL服务器的访问压力。

1.4  OpenResty网关负载均衡

OpenResty是一款基于Nginx与Lua的高性能Web平台,其内部集成了大量优秀的Lua库、第三方模块以及其依赖项,用于方便地搭建能够处理高并发、高扩展性的动态Web应用、Web服务和动态网关[8]。当扩展微服务时,Nginx的配置文件并不能同步的发生变化[9],需要借助OpenResty中不同流程的指令加上Lua语言来实现动态配置,通过非阻塞的API来完成无感知的负载配置变更。

2   教学评价系统架构与服务

2.1  系统架构

教学评价系统的架构如图1所示,其中包括15个业务微服务、网关微服务、网关负载均衡、服务监控、服务治理中心、Mycat数据库中间件。其中15个业务微服务、服务监控和网关微服务都需要注册到Consul中。Consul和服务监控都会对微服务进行健康检查,将不可用的服务实例逐出实例列表。服务监控检查到服务状态发生变化会在监控页面发出通知、并向预设的通知方式中发送模板信息。

2.2  服务划分

整个教师教学评价系统按功能模块进行服务划分,各服务的名称和含义如表1所示。

3  微服务在教学评价系统中的实现

3.1  Maven工程

系统所有模块均由Maven进行管理。创建一个Maven工程打包类型设为POM,作为所有模块的父工程。该工程用来约束全部微服务的Spring Boot版本、Spring Cloud版本。首先在该工程中引入Spring Boot的父工程作为Jar包依赖版本约束,然后再引入Spring Cloud依赖管理,最后再引入各个服务所需的依赖。

3.2  管理服务

管理服务是逻辑上划分的一组服务,主要负责维护整个系统的基础数据。该服务连接Mycat数据库中间件,为管理服务、身份认证服务、评价服务提供服务。以上服务在对数据修改后传递到这个服务保存数据。教师服务、数据字典服务、评价规则服务、指标服务、学生服务、课程服务、学年服务。这些服务的工程结构是相似的,采用经典的三层架构来实现:利用Spring MVC实现控制层,利用Spring实现业务层,利用MyBatis实现持久层,利用Spring实现3层的整合。

3.3  服务治理

Consul提供服务发现与配置,每个服务里都配置了Consul的地址。微服务启动后会自动向Consul注册,提供自己的服务名、IP地址、端口号、上下文路径、健康检查地址等信息。启动Consul后,可通过8500端口查看UI界面,服务健康监控如图2所示。

3.4  API網关

Spring Cloud Gateway是高性能网关,它提供了微服务请求统一入口。该微服务可以将指定URL或者匹配到URL的请求转发到指定的微服务中去,同时当转发的微服务有多个实例时,自动对这些实例使用负载均衡算法转发请求。指定的URL规则配置在bootstrap.yml文件中,如图3所示。Routs表示路由的配置列表开始,id代表这条路由的名字,uri属性配置转发地址,可以使用服务名代替,lb://代表自动使用负载均衡。predicates代表转发规则,配置为指定的路径。filters属性代表过滤器,此处配置为熔断。当转发的微服务不可用时,转发到熔断地址fallback,相关代码如图3所示。

3.5  OpenResty网关负载均衡

通过OpenResty内置的lua语言、lua-resty-redis、lua-cJSON和lua-resty-balancer模块,结合Redis来动态配置网关。首先在init_by_lua_file中指定运行脚本init.lua,在init.lua中初始化cJSON、balancer模块作为全局变量。同时初始全局变量请求计数器vtimes为-1,当前服务列表下标currentserver为1。默认的网关地址serverlist初始为config.lua中配置的默认网关地址。在access_by_lua_file中指定运行脚本access.lua,在access.lua中判断请求计数器vtimes是否小于0,如果为真就重新赋值请求计数器并从Redis中获取数据。成功获得到数据就更新当前服务器列表。vtimes初始化为-1就要求在第一次请求时刷新配置。在balancer_by_lua_file中指定运行脚本balancer.lua,在balancer.lua首先判断当前serverList的大小,当列表大小等于1时表示只有一个网关,这时候就无须再进行负载均衡直接转发便可以。大于1时,采用轮询算法将每个请求分别转发到不同的网关上。

3.6  服务调用

本系统微服务之间使用HTTP+JSON来实现通信。HTTP是通信的协议,JSON是通信时的数据格式[10],使用OpenFeign来隐藏远程调用的实现细节。首先在需要调用微服务的pom.xml中增加OpenFeign依赖,然后创建一个接口,添加@FeignClient注解。其中value的值是要调用的服务名,path是调用服务的上下文路径,fallback是调用失败时调用该接口的实现类。在调用时直接将注入到调用对象中,调用findAllDepartments()方法即可。

3.7  服务熔断

本系统的服务熔断主要应用在网关转发和微服务间调用上,在这两点上添加熔断可以确保系统的稳定运行。网关的熔断配置在过滤器上的fallbackuri,当网关转发时发现此服务无实例可用或者应答超时,将直接转发到fallbackuri配置的地址上。因为微服务间调用使用了OpenFeign,其内部已经封装熔断。在Feign接口上配置fallback选项为接口指定一个实现类,在调用失败后会使用这个类的方法作为此接口的默认实现方法。

3.8  公共模块

公共模块封装了15个业务微服务的实体类、响应请求的包装类、身份认证工具类,每个微服务都可以从该模块中调用自己需要的类。不同的微服务之间会通过调用其他的微服务来获取对象。定义CommonResponse类负责系统多数对外响应,需要考虑普适性、可重用性。该类提供了5种响应状态:代码code、操作结果消息message、实例数据对象data、实例数据对象集合table和请求号requestId。包含的方法包括:ok()/ok(String message)、error()/error(String message)、auth(String message)、bad()、busy()、data(Model data)和table(List table)。

3.9  身份认证服务

认证服务涉及账户的登录、注销、维护登录用户信息、每个角色能访问的指标、修改密码、系统访问凭证下发等功能。所有的用户在访问任何服务时都必须在请求中携带身份认证服务下发的访问凭证。用户的登录、注销、获取的用户信息等都需要将请求路由给该服务完成。由于HTTP是无状态协议,本系统采用前后端分离技术开发,不能像传统的应用一样在浏览器端设置一个Cookie来维护会话信息。通过使用访问凭证的方式,后端不需要维护会话只需要凭证,前端也只需要保存凭证。前端将访问凭证保存在浏览器里,在请求后端时带了此凭证完成身份校验。所有的服务在操作时都必定会先验证用户账户的合法性,都会请求身份认证服务检查凭证。每次请求都验证会大大降低性能,在请求量大时会可能直接导致身份认证服务宕机。因为外部所有的请求都会通过网关,所以在Spring Cloud Gateway上做请求的凭证检查。统一放行无凭证但正在请求身份认证的请求,拦截到其他服务的请求并检查凭证。凭证有效放行请求,凭证无效不放行并返回凭证无效信息。

身份认证服务依赖于管理服务中的学生服务和教师服务,身份认证服务只维护被发送过访问凭证的用户信息,并不维护数据库中的用户信息。身份认证服务将接收的账户密码根据请求的接口转发到学生服务或者是教师服务。学生服务或教师服务在收到账户和密码后会在数据库中查询比对用户信息。查询成功后返回给身份认证服务用户信息,认证服务将根据用户信息签发凭证,同时将用户信息缓存到Redis中,设置过期时间为1小时。用户注销时删除Redis中缓存的用户信息。

系统的凭证基于JSON Web Tokens(JWT)[11]设计,JWT非常适合无状态的HTTP协议。当用户登录成功后将获得的用户信息中的学工号加入JWT的sub字段、角色ID加入JWT的role字端、过期时间为当前系统时间加一个小时,返回给用户。用户的下次请求会在HTTP头部的Authorization字段添加下发的凭证,网关会负责检查凭证。

3.10  评价服务

评价服务分为学生评价服务和教学督导评价服务,包含的功能如图4所示。之所以拆分为两个,是因为在实际业务中学生的人数远远大于教学督导的人数。那么学生评价服务接受的请求量也远远大于教学督导评价服务所接受的请求量,将两个服务分离能更有效地在请求量增大时进行动态扩容处理。

4  结  论

Spring Cloud框架提供了微服务架构应用的“一站式”解决方案,简化了微服务架构在应用系统的使用过程。首先介绍了Spring Cloud框架及其包括的核心组件,然后结合教学评价系统阐述了Spring Cloud框架的具体使用过程,重点描述了服务治理、API网关、负载均衡、服务调用、服务熔断、业务服务等模块的实现过程。为Spring Cloud框架的使用提供了一定的借鉴。

参考文献:

[1] 倪小璐,王旭英,边俊凯,等.微服务软件架构设计模式及其应用 [J].杭州师范大学学报(自然科学版),2021,20(4):442-448.

[2] 冯志勇,徐砚伟,薛霄,等.微服务技术发展的现状与展望 [J].计算机研究与发展,2020,57(5):1103-1122.

[3] SUN X,CHEN H N,WANG Q Y,et al. Research and Design of Online Training Platform based on Spring Cloud Distributed System Structure and Computer Big Data [J/OL].Journal of Physics:Conference Series,2021,1952:1-7.[2021-09-03].https://iopscience.iop.org/article/10.1088/1742-6596/1952/4/042087.

[4] 王伟,常庆丽,吴朝霞.基于Springboot+Vue的精准帮扶系统研究与实现 [J].河南科技,2021,40(27):12-14.

[5] 朱瑞,曾劲涛,龙满生.基于SSM框架的创业资讯发布系统的设计与实现 [J].井冈山大学学报(自然科学版),2021,42(1):54-60.

[6] 欧阳宏基,杨铎.基于微服务架构的学位论文写作辅助平台 [J].计算机与现代化,2019(10):34-39.

[7] 张莹,郑学智.基于Mycat的大数据存储研究 [J].电子设计工程,2020,28(5):1-6.

[8] 温馨,樊婧雯,王富强.基于OpenResty平台的API网关系统的设计与实现 [J].信息化研究,2020,46(3):62-68.

[9] 許诺.大数据下基于Nginx负载均衡的教务系统优化设计 [J].信息技术与信息化,2021(6):191-193.

[10] 刘家雨,王永生,刘爱东.基于JSON的防空武器系统应用适配器 [J].兵工自动化,2021,40(7):1-4.

[11] SPIGA D,PRA S D,SALOMONI D,et al. Dynamic integration of distributed,Cloud-based HPC and HTC resources using JSON Web Tokens and the INDIGO IAM Service [J].EPJ Web of Conferences,2020,245:1-9.[2021-09-03].https://doi.org/10.1051/epjconf/202024507020.

作者简介:葛萌(1980—),女,汉族,陕西咸阳人,讲师,硕士,研究方向:软件工程、企业级JavaEE应用开发;李闯男(1999—),男,汉族,陕西咸阳人,本科在读,研究方向:软件工程;欧阳宏基(1982—),男,汉族,陕西宝鸡人,副教授,硕士,研究方向:软件工程、软件设计与体系结构。