基于Spring Cloud微服务架构的 开放实验室管理系统构建研究与实践

2021-02-21 08:51李祥金安安
中国教育信息化·高教职教 2021年1期
关键词:微服务

李祥 金安安

摘   要:微服务架构因其服务独立开发、独立部署、独立维护、可扩展性高等众多优点成为当前网络应用开发首选架构。文章针对现有实验室管理平台的缺点,对微服务架构在实验室管理平台上的应用进行充分研究;在分析软件构架演变的基础上,以实验室科研管理为实际业务场景,结合开发与设计实验室管理平台实践,对Spring Cloud微服务架构进行研究,实现实验室管理软件的Docker平台应用部署,对同类设计与开发具有良好的借鉴作用。

关键词:实验管理系统;微服务;Spring Cloud

中图分类号:TP315;G203 文献标志码:A 文章编号:1673-8454(2021)01-0055-05

一、引言

高校实验室是进行实验教学、开展科学研究、培育学生创新能力、提高学生综合素质的重要基地,也是孵化高水平研究成果、服务经济建设的主要场所。高等院校的实验教学是培养学生创新精神和实践动手能力直接、关键的环节,其优势在于使学生把所学的理论和实践相结合,着力培养学生创新精神和知识运用能力。它既有知识传承,又有动手实践,遵循认知规律,让学生在科学实验中亲身去发现和认识科学理论,并检验所获得的理论知识。

当前高校实验室普遍存在着因实验课时过少和封闭式管理,没有充分发挥其培养学生创新精神和实践能力的重要作用的问题。如何利用实验教学资源与已建成的基础实验平台、专业基础实验平台和重点学科研究实验平台共同构建一个完整实验室体系,是一项值得重要扶持和发展的重点课题。因此,高校实验室开放共享体系的构建,对培养学生的创新精神和实践动手能力具有重要的意义和深远的影响。

微服务是将独立的应用系统开发分解为一组小型服务的开发,其中每个小型服务都以独立进程运行,并采用如HTTP资源API这样轻量机制来相互通信的新型应用开发机制。近年来,微服务架构以其独立部署、高效、松耦合、高内聚、扩展性强等优点成为目前火热的后台开发架构之一。本文旨在通过以实验室管理系统设计开发为实际业务场景,在对微服务架构的整体模式进行深入分析的基础上,完成微服务系统架构的搭建与部署工作。

二、Spring Cloud微服务框架简介

Spring Cloud是一套用于搭建微服务架构应用的框架,由Pivotal团队提供,实现了配置管理、服务发现、智能路由、负载均衡、熔断器等功能。该框架简化了Spring应用的创建、运行、调试、部署等工作,使开发者可以专注于Spring应用的开发,无需过多关注XML的配置以及特定配置方法。Spring Cloud主要包括Spring Cloud Netflix和Spring Cloud OpenFeign兩种典型框架。

Spring Cloud Netflix是Spring Cloud中的一套框架,它包含了解决服务注册与发现,网关、负载均衡、服务之间通信、断路器等微服务架构所需解决问题的众多组件。Spring Cloud OpenFeign框架则只需要定义好接口,就可以将原来通过Http的请求调用转化为调用定义好接口的方法,使客户端可以很容易调用http服务,为微服务架构下服务之间的调用提供了更加便捷的应用解决方案。

三、系统微服务构架的设计与实现

1.微服务架构设计

不同于单体架构,引入微服务后,系统整体架构提升了复杂度,结合Spring Cloud体系结构,本文设计了本系统微服务架构,如图1所示。服务注册中心是微服务架构最核心和最基础的服务,使用Eureka解决。实验管理系统拆分的三个服务(人员服务user、成果服务achievement、设备服务device)作为业务模块,使用Spring Boot构建。拆分为多个微服务后,使用Zuul组件作为服务网关统一管理服务的入口。每个服务都有自己的配置文件,过于分散,不易管理。故使用Spring Cloud Config这一组件作为配置中心来统一管理所有应用的相关配置文件。在数据存储方面,关系型数据库主要使用开源的MySQL。

在实验室管理系统的分析设计过程中,为充分发挥云平台中的微服务应用效率,将通用的人员管理(user)、成果管理(achievement)以及设备管理(device)三个模块划分为三个微服务模块:①user服务管理实验室人员信息,包括添加、修改、查询等功能。②achievement服务管理实验室的科研成果。科研成果包括著作、论文、专利、研究项目四种类型。③device服务管理实验室的设备信息,包括实验室设备信息的录入、修改、删除等。实验室人员可以申请实验室的设备使用,但申请后应得到管理员的审核方可使用。

2.微服务构架技术实现

在实现角度,每个微服务共有的操作大概分为三步,包括引入依赖完成pom文件、编写启动类以及用ymal语法编写yml配置文件等部分。

在实验室管理系统中,系统用户管理微服务模块,主要提供用户注册、用户登录、用户个人信息管理、用户地址管理等服务。在设计过程中,考虑到用户管理中心其他微服务也会调用,所以先做聚合工程UserManage,此模块包含2个子工程:

- leyou-user-interface:包含实体类及对外接口;

- leyou-user-service:包括业务逻辑和内部接口。

具体结构如图2所示:

(1)模块逻辑设计

- 请求方式:GET;

- 请求路径:/check/{param}/{type};

- 请求参数:param,type;

- 返回结果:true或false。

(2)关键代码分析

//**

*用户注册

*@param user

*@param code

*@return

*/

@ PostMapping("register")

public ResponseEntity register(@Valid User user, @RequestParam("code")String code){

userService.register(user,code);

return ResponseEntity.status(HttpStatus.CREATED).build();

}

/**

*校验数据是否可用

*@param data

*@param type

*@return

*/

@GetMapping("/check/{data}/{type}")

Public ResponseEntity checkUserData(@PathVariable("data") String data, @PathVariable(value="type",defaultValue=”1”) Integer type){

Boolean boo=this.userService.checkData(data,type);

if(boo==null){

Return ResponseEntity.status(HttpStatus.BAD_REQUEST).Build();

}

Return ResponseEntity.ok(boo);

/**

* 发送验证码

* @param phone

* @return

*/

3.微服务构架高可用优化

在微服务架构中,高可用通过部署多个实例来实现。如Eureka Server微服务构架中,可以启动多个Eureka Server实例,这些Eureka Server实例之间以相互注册的方式来实现服务的高可用。

所有Eureka Server节点在服务提供者的同时,也在服务消费者。实现步骤如下:

(1)新建两个配置文件application-e1.yml和application-e2.yml。

(a)application-e1.yml作为实例一的配置文件,将service-url指向实例二。內容如下:

eureka:

client:

service-url:

defaultZone:  http://eureka2:8762/eureka/

spring:

application:

name: eureka

server:

port: 8761

(b)application-e2.yml作为实例二的配置文件,将service-url指向实例一。内容如下:

eureka:

client:

service-url:

defaultZone:  http://eureka1:8761/eureka/

spring:

application:

name: eureka

server:

port: 8762

(2)然后使用rancher通过参数spring.profiles.active指定配置文件分别启动两个eureka实例。

四、系统功能结构设计(见图3)

本文所针对的实验室管理系统开发以所在学校的科研实验室管理为主要分析对象,主要包含人员管理、成果管理和设备管理等三部分内容,实现开放管理。

1.人员管理

主要负责实验室人员的信息管理,包括管理员和普通人员两类角色。功能主要分为:①查询。所有人都可以查询个人信息。管理员拥有最高权限,可以录入、修改和删除人员信息,并且可以查询所有人员信息。普通人员只可以查询自己个人信息。②添加、修改和删除。管理员可以添加、修改和删除所有人的个人信息,而个人不可以执行这些操作。③查询统计个人成果。在人员管理模块,可以指定某条人员信息后查询该人员的所有科研成果信息。

在该页面中会加载被编辑人员原来的详细信息。显示的信息字段与添加人员信息的字段一致。但是姓名字段不可修改,并且该页面隐藏了人员id字段。其中性别和导师字段输入框均为下拉框。在加载页面时会初始化加载数据。在页面的最下面有两个按钮,点击返回直接返回到人员管理查询页面,并会刷新修改之后的数据。修改数据后点击保存,数据包括隐藏字段人员id将会以json格式传给user服务。在服务端将会根据人员id更新人员信息。所有人的人员信息以一个表格的形式展示,包括姓名、专业、岗位、导师、研究方向、教育背景、介绍、联系方式、操作。其中操作字段显示的是人员信息的编辑按钮。点击编辑按钮,页面将跳转到人员信息的编辑页面。人员信息查询可以根据查询姓名进行查询,输入姓名后,点击查询,Get请求将会携带姓名信息,以及默认的每页显示页数和当前页信息到后台。(见图4)

2.成果管理

负责所有实验室人员的科研成果信息维护。包括著作、论文、专利以及科研项目。每条成果信息必须包含实验室人员id,该id对应人员管理部分中人员信息的id,逻辑上是成果信息的外键。成果信息主要由管理人员维护,管理员可以对所有成果信息进行增加、修改、删除以及查询。而普通人员只拥有查询所有人科研成果的权限。

查询结果页面以表格信息展示著作信息,包括序列号、书名、类型、作者、出版社、出版时间、描述、操作等列项。其中操作列中显示著作的编辑按钮。在表格的上方可以输入查询条件,可以根据书名查询书籍信息。当点击著作菜单项时,会跳转到图5所示页面。第一页的书籍信息会自动加载。输入查询条件,点击搜索框,页面发送请求到achievement服务进行查询。

3.设备管理

负责实验室的设备信息管理,处理实验室的设备信息维护,包括增、删、改、查等。还应该维护实验室设备的借用情况。实验室人员使用實验室设备之前必须提交申请,等待管理员通过审核后方可使用。

实验室信息管理页面的添加、修改和查询与前面相似。在这里介绍一下设备申请功能。点击设备信息管理页面的申请按钮,将携带设备的编号跳转到设备申请页面,在该页面首先会根据url携带的设备编号参数,加载设备的名称和库存数量,这两个字段都设置为只读。申请者填写申请数量后点击保存提交后将数据发送给device服务,device服务生成申请编号后保存到device_apply表中,等待管理员审核,同时,申请信息将会保存到device_apply表中的申请信息,作为操作日志备查。(见图6)

五、系统微服务架构配置

根据系统设计,基于Spring Boot应用框架,以Spring Cloud技术栈作为微服务的架构配置流程包括以下几个方面内容:

1.服务注册中心

服务注册中心使用Eureka组件。Eureka包含服务端和客户端。除了注册中心,其它的服务都可以在主类中加上注解@EnableEurekaServer注册到eureka server端。并且通过设置参数defaultZone注册到eureka注册中心。DefaultZone属性可以是eureka注册中心多实例中的任何一个。

2.配置中心搭建

Spring Cloud Config默认是采用Git存储配置。实现过程如下:

(1)添加config server和eureka client依赖。引入eureka客户端依赖,是因为需要将config-server注册到eureka服务端进入微服务治理体系,以实现配置中心的高可用。

(2)主类同时添加注解@EnableDiscoveryClient和@EnableConfigServer。Config服务既作为Eureka的客户端,又作为Config的服务端。

(3)创建Git仓库。这里使用GitHub作为仓库。

(4)修改配置文件。配置Git仓库的相关信息。至此完成Spring Cloud Config的引入。

3.服务网关搭建

引入Spring Cloud Zuul步骤:

(1)添加org.springframework.cloudspring-cloud-starter-netflix-zuul依赖。

(2)通过在主类中添加注解@EnableZuulProxy启用Zuul组件。

(3)配置路由规则。Zuul默认配置的路由规则是,所有服务暴露的端口都是可访问的。在本系统配置中希望ahievement是不直接对外提供服务的,只是通过user服务调用,所以需要禁用默认的路由规则。禁用配置如下:

zuul:

ignored-services: achievement

(4)设置过滤。Zuul不仅可以路由,还具有过滤功能。使用Zuul,主要是使用它提供的过滤器,Zuul中提供了PRE、ROUTING、POST、ERROR四种过滤器类型。在这里调用user服务,需要验证请求中是否携带令牌token。如未携带该请求不通过。需要在api-gateway中实现一个前置过滤器。该过滤器需实现ZuulFilter接口,filterType()方法返回前置过滤器PRE_TYPE类型,filterOrder()返回的是过滤器执行的顺序位置。run()方法里是需要执行的操作,当请求中不携带token时,请求将得不到执行。过滤逻辑的具体实现代码如下:

RequestContext currentContext = RequestContext.getCurrentContext();

HttpServletRequest request = currentContext.getRequest();

String token = request.getParameter("token");

if(StringUtils.isEmpty(token)){

currentContext.setSendZuulResponse(false);

currentContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());

}

return null;

4.断路器搭建

(1)添加spring-cloud-starter-netflix-zuul依赖。

(2)主类添加注解@EnableCircuitBreaker以引入断路器。

(3)Hystrix组件是一个容错框架,可以通过注解@HystrixCommand配置,参数fallbackMethod设置回退降级处理方法。

(4)在user服务中定义findAchievementById方法的回退降级处理方法fallback。实现过程如下:

引入Hystrix-dashboard。Hystrix-dashboard是Hystrix一款可以对Hystrix进行实时监控的组件。通过Hystrix-dashborad可以清晰明了地查看请求响应时间、请求成功率等数据。

5.微服务通信

Spring Cloud中使用Feign框架来解决通信问题。现以根据实验室人员id查看该实验室人员科研成果这一业务为例说明如何配置微服务通信。

(1)首先创建一个著作信息BookInfo实体,通过ORM框架映射到数据库。通过注解@Entity注明该类为数据库表映射类。类名和数据库表对应。注解@Id注明表的主键。

(2)ORM框架使用Spring Data Jpa。只需要编写一个继承自JpaRepository的接口就能完成数据的访问。

(3)通过对外暴露的接口,可根据作者id查询著作的接口进行实现。

6.微服务链路追踪

Spring Cloud项目的Spring Cloud Sleuth为服务之间提供了链路追踪,以了解服务耗时、网络深度、调用次数等信息。配置模式如下:

(1)先运行一个zipkin server。通过docker可以快速运行zipkin。

(2)在user和achievement服务中添加spring-cloud-starter-zipkin依赖。

(3)在bootstrap.yml文件中添加配置。

六、结束语

现在微服务架构是非常炙热的话题。在本项目软件开发中,采用了Spring Boot作为单个服务应用框架,以Spring Cloud为技术栈搭建微服务架构,实现整个项目的微服务架构系统搭建,以及基于Docker容器技术的系统部署,对微服务软件应用开发整个流程进行了系统的实践。

微服务虽然能解决单体应用膨胀、耦合度高、开发效率低下等问题,但是同样也会带来部署和维护越来越复杂的问题,[14]而且如果没有丰富的实践经验,对服务拆分的粒度也是很难把控的。因此,在实际开发中,应根据实际业务需要来选择采用哪种构架来进行软件应用开发、实现单体架构和微服务架构有机融合。

参考文献:

[1]辛园园,钮俊,谢志军,张开乐,毛昕怡.微服务体系结构实现框架综述[J].計算机工程与应用,2018(19):10-17.

[2]戴胜.微服务架构应用前景探析[J].花炮科技与市场,2018(4):67-70.

[3]赵然,朱小勇.微服务架构评述[J].网络新媒体技术,2019(1):58-61.

[4]刘瀚璟.基于微服务架构的导师遴选和研究生招生系统的设计与实现[D].济南:济南大学,2018.

[5]孙宇,周纲.基于微服务架构的资源发现系统平台构建研究[J].中国图书馆学报,2020(1).

[6]姚刚,蔡凤翔,李英浩.浅谈微服务架构的网站开发技术[J].信息系统工程,2019(12):69-70.

[7]李娜.基于Spring Cloud微服务架构的应用[J].电子技术与软件工程,2019(12):142.

[8]黄强文,曾丹.基于Spring Cloud和Docker的分布式微服务架构设计[J].微型电脑应用,2019(6):98-101.

[9]Cerny. Aspect-oriented challenges in system integration with microservices, SOA and IoT[J].Enterprise Information Systems,2019.

[10]梅璇.基于Spring Cloud的微服务调用研究[D].武汉:武汉理工大学,2018.

[11]Ru Wang,Muhammad Imran,Kashif Saleem.A microservice recommendation mechanism based on mobile architecture[J].Journal of Network and Computer Applications,2019.

[12]隋亚楠.基于Spring Cloud技术的生产管理云平台的研究[D].天津:天津大学,2018.

[13]周立.Spring Cloud与Docker微服务架构实战[M].北京:电子工业出版社,2017.5.

[14]章仕锋,潘善亮.Docker技术在微服务中的应用[J].电子技术与软件工程,2019(4):164.

(编辑:王天鹏)

猜你喜欢
微服务
微信公众平台在医院图书馆的应用现状调查
从单一模式系统架构往微服务架构迁移转化技术研究