基于SpringCloud的食品安全溯源系统的设计与实现

2019-09-04 10:00张斌任富彬沈炜
软件工程 2019年8期
关键词:溯源微服务食品安全

张斌 任富彬 沈炜

摘  要:食品安全问题是关系国计民生的大事,在互联网时代的今天,有一款可以解决食品安全的软件是非常有必要的,有关食品的原料采购及成品去向都要在平台中进行备案。若一件食品有问题,则可以快速定位该批食品,定位问题厂家及该批货源所有去向,及时召回,可以有效地解决食品安全问题。而在微服务快速发展的今天,我们可以使用微服务框架SpringCloud快速有效的进行食品安全溯源系统的开发。

关键词:微服务;食品安全;溯源;NoSQL;消息中间件

中图分类号:TP311.5     文献标识码:A

Abstract:Food safety is a major issue related to national economy and people's livelihood.In today's Internet era,it is necessary to design and implement a system to solve the problems in the field of food safety.The procurement of raw materials for food and the destination of finished products must be filed on the platform.In case of problems for a piece of food,the batch of such products,the related manufacturers and all the destinations of the batch can be quickly located and recalled in time,which can effectively solve the problems in food safety.Moreover,with the rapid development of micro-services,we can use the micro-services framework SpringCloud to quickly and effectively develop food safety traceability systems.

Keywords:micro-service;food safety;traceability;NoSQL;message-oriented middleware

1   引言(Introduction)

近年来,食品安全事故给社会带来了深刻的负面影响,公众对食品安全和监管的要求也越来越高[1]。国家虽然不断完善和推出新的法律法规,但是食品安全问题依然层出不穷,所以我们考虑开发一个互联网项目,将每个食品从生产到售出到用户手中都以数据的形式记录下来,随时进行安全监管,提高消费者对食品安全和政府监管的信心。本系统考虑使用当下流行的微服务框架SpringCloud,能够进行快速读写的NoSQL数据库Redis及当下流行的用于消息推送及流量削峰的消息中间件[2]RabbitMQ来进行开发。

2   微服务介绍(Micro-service introduction)

最初的单体架构,在java中可以理解为一个Java Web应用程序,从JSP时代到中间过渡使用的流行的Struts+Spring+ Hibernate框架及SpringMVC+Spring+Mybatis框架,都属于单体架构,包含视图层、业务层、数据访问层,也就是我们常说的MVC架构,从Controller到Service到最后与数据库操作相关的Dao层,所有服务都写在一个程序中,没有任何拆分,各模块之间耦合度高,如果有一个地方要修改,要从上到下controller到dao的去修改,且因为在一个程序中,其他模块被影响的可能性也非常大,每次都要等待所有开发人员完成后才能完成部署,团队灵活性非常低。且因为所有的功能都写在一起,在程序启动时,一个进程包含了所有的业务逻辑,系统的启动时间会比较长。而且当添加新的需求或改进时,无法针对单点增加,每次都要进行全局的修改部署,影响团队效率。单体服务架构图如图1所示。

微服務架构是近些年来随着互联网快速发展衍生的新的系统架构,它可以将一个完整的应用从数据存储到模块划分垂直的拆分为多个不同的服务,每个服务负责自己的模块,相互独立,都能独立部署、维护及扩展,服务之间通过诸如RESTful API或RPC的方式来进行相互调用。微服务是一种新的适应于当今互联网行业需求的架构风格,一个大型复杂的软件系统可以由一个或多个微服务组成,且各微服务之间是松耦合的。每个微服务仅需要关注自身的业务逻辑即可。微服务架构示意图如图2所示。

3  系统技术选型及总体架构设计(System technology selection and overall architecture design)

Spring Cloud是Spring团队基于Spring Boot实现的微服务框架,它整合了诸多优秀的开源组件,如服务网关zuul和gateway,提供服务间调用的feign组件,用于服务注册及服务发现的eureka和consul,负载均衡组件ribbon,服务间调用组件feign,配置中心config,容错组件hystrix,智能路由等。

Redis是一个开源的使用ANSIC语言编写的key-value存储系统,是当前比较热门的NOSQL[3]系统之一。Redis的读写操作都在内存中进行,读取速度可以达到110000次/s,写速度可以达到81000次/s,效率远远高于数据库的只有千级的并发量。所以很多短时间不会发生变化的数据我们都可以存储在Redis中,提高用户的响应速度,减轻数据库压力。

RabbitMQ是使用Erlang语言编写的基于AMQP协议的开源的消息代理和队列服务器。它凭借自身高可靠、易扩展、高可用及丰富的功能特性成为最流行的消息中间件之一。当我们使用消息中间件进行服务间的消息推送时,当服务A向服务B发送消息,如果当时网络不可用,或B服务出现故障,消息中间件都将保留着这份消息,直到服务B可以接受执行并消费消息,可以防止服务间因为一个服务出现问题而出现阻塞。

(1)数据库:将食品安全溯源系统的全部数据都存放在MySQL数据库中,MySQL是当下最流行的关系型数据库管理系统之一,特别在WEB系统方面使用尤为广泛,这里我们将所有的企业信息,食品信息包括食品的原材料采购及成品售出去向等信息,每次的企业生产报备信息等都存储在数据库中,考虑到数据库的并发量,在系统中我们会将特定的符合条件的数据存放在Redis中,通过设置过期时间等来根据特定场景对数据的实时性进行维护,提高数据读写效率,提高系统响应速度。

(2)业务逻辑层:首先将整个系统拆分为不同的服务模块,主要分为服务提供者和服务消费者两大类,服务提供者包括企业模块、食品模块、备案模块,包含短信发送服务等功能的基础模块,服务消费者包括企业端模块和监管端模块。企业首先进行注册,通过上传营业执照等成功进行资格审查后,可以进行食品生产及销售备案,而所有的企业信息,食品生产及销售信息等都可以在监管端清晰地展示出来。

(3)展示界面:主要通过ElementUI+vue.js实现前端页面的展示,前端页面主要分为两部分,提供给企业使用的企业系统和提供给政府监管方使用的监管系统。在监管系统中,我们可以通过Echarts图表的方式来清晰的展示我们想要得到的各种信息。

4   系统模块设计(System module design)

4.1   企业端模块

企业通过手机号进行企业注册,注册后企业的默认状态为未认证状态,通过上传营业执照进行企业合法性审核并等待监管端进行审核。若审核通过,企业可以上传生产/销售许可证进行相关生产/销售资质的审核申请,同样在审核通过后可以进行食品登记并在进行生产/销售备案后进行食品生产和出货销售。企业注册流程图如图4所示。

企业注册后可以进行生产报备,包括使用的原材料信息,生产的食品件数,一次生产报备会有一个唯一的身份标识码,如果需要食品溯源时,这个码就是可以快速定位全部食品去向的“身份证”。生产结束后会进入企业的库存信息中,每次进行销售的时候要进行食品销售报备,包括交易企业信息、销售件数、销售件数要在库存中扣除,当库存售光,即该批次的食品销售完毕,每一级的经销商在出货销售的时候也要进行销售报备,直到末级经销商(如超市)。

4.2   监管端模块

监管端模块是给政府或食药监等监管部门使用的一套系统,这里可以直观地看到全部食品生产企业及销售企业的一切行为,可以看到每次的食品生产及销售的报备情况,更是有一键追溯功能能够快速定位问题食品的去向可以快速追回。

首先监管端账号由系统管理员提供给监管方,在账号第一次登录时需要用户绑定手机,在通过手机验证码校验后可以输入自定义的新密码,且后面可以通过手机号登录。

登录成功后首先进入工作台页面,这里可以直观地查看系统中全部企业的大体情况,里面有各种Echarts图表做的各种统计,主要分为企业模块和报备模块,如当月报备企业数和未报备企业数,按地区显示地区的入网企业数和报备企业数,当月报备总数及同比上涨比例等。

通过工作台的功能导航栏可以进入企业管理模块,这里可以查看各种类型的企业列表及对单个企业进行操作,可以按照当月报备或未报备类型来查看企业列表,也可以通过精确查找或模糊匹配来完成目标企业的查找。在查看企业中,我们可以通过发送短信的方式给企业相关负责人发送通知,也可以通过消息队列来进行站内消息的收发,企业审核的功能也是在这里完成的,若发现企业异常行为可以将企业加入异常名单中,异常名单中的企业不能进行生产/销售报备,企业要通过上传材料解除异常且通过审核后才可以恢复正常。

监管端功能流程图如图5所示。

5   系统实现(System implementation)

5.1   系統架构实现

食品安全溯源系统采用SpringCloud+MySQL+Redis+

RabbitMQ的微服务架构方式搭建而成。

接口请求到我们的服务的时候首先要经过网关,这里我们使用的是Spring Cloud[4]生态体系中的第二代网关Spring Cloud Gateway。Spring Cloud Gateway是Spring官方基于Spring5.0、Spring Boot2.0和Project Reactor等技术开发的网关,它为微服务架构提供了简单、有效且统一的API路由管理方式,其不仅提供统一的路由方式,并且还基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。

服务治理[5]我们采用Spring Cloud的Consul组件,Spring Cloud Consul是一个分布式高可用的系统服务发现与配置工具,提供包括服务发现、配置和分段功能在内的全功能控制平面。有了Consul,服务可以通过DNS或者HTTP直接找到它所以来的服务,Consul提供健康检查的机制,Consul还支持多数据中心,这意味着用户不用为了多数据中心自己做抽象。

Spring Cloud Feign使我们使用的服务间调用组件,它是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign,可以做到使用HTTP请求访问远端服务,就像调用本地方法一样,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP方法。

Spring Cloud Ribbon组件是微服务体系中弹性扩展的基础组件,其丰富的负载均衡策略、重试机制、支持多协议的异步与响应式模型、容错、缓存与批处理等功能都可以让我们在构建微服务架构时更加方便快捷。

Spring Cloud Hystrix是Spring Cloud提供的一个针对分布式系统容错处理的开源组件,它是一个延迟和容错库,旨在隔离远程系统、服务和第三方库,阻止级联故障,在复杂的分布式系统中实现恢复能力。

Spring Cloud Config是Spring Cloud微服务体系中的配置中心,是微服务中不可获取的一部分,其能够很好的将程序中配置日益增多的各种功能的开关、参数的配置、服务器的地址,配置修改后实时生效,灰度发布,分环境、分集群管理配置等进行全面的集中化管理,有利于系统的配置管理和维护。

Redis是一款在内存中进行读写的非关系型Key-Value存储系统,作为一个内存数据库,Redis读写数据的时候不会受到硬盘I/O速度的限制,读取速度可以达到110000次/秒,写入速度达到81000次/秒,远远优于常规DB数据库的读取速度[6]。它支持多种数据类型,并支持原子性操作。Redis与其他Cache相比,拥有更多的数据结构并支持更丰富的数据操作。Redis最主要的应用场景之一便是业务缓存,将一些不经常改变但又经常访问的热点数据常驻在内存中,并在内存中完成对数据的操作有效地减少数据库读取次数,减少数据库压力,提高响应时间,增强吞吐量。

5.2   持久化实现

数据库使用流行的关系型数据库MySQL,使用的持久层框架为SpringBoot自带的Spring Data Jpa,Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repsitory极大地减少了JPA作为数据访问方案的代码量。

5.3   业务逻辑流程

本系统从前端接受的数据类型均为json格式,在通过路由匹配找到对应的Controller方法后开始执行我们的业务逻辑代码。Controller在接受前端传递的参数后去service层处理逻辑,service层通过redis中或通过dao层取出相应数据,若是调用其他服务的接口,则在service层中通过feign组件调用其他服务的接口,将数据封装好后返回给controller层,再同样以json的格式返回给用户。

5.4   页面实现

前端采用ElementUI+VUE.js的前端架构来实现前端页面开发,VUE负责与后台数据交互和前端页面数据的动态渲染,ElementUI负责静态页面的编写,图表使用Echarts插件进行生成。

6   结论(Conclusion)

本文描述了SpringCloud微服務架构的开发理念,介绍了Spring Cloud提供的微服务组件,并且基于微服务架构体系开发了食品安全溯源系统。介绍了系统中各个模块的设计和实现方法,传统的监管类软件都是基于传统的单体架构开发的,代码臃肿繁杂,冗余较高,本文将微服务架构应该在相关软件中,为监管部门提供更加完善的技术支持,提高开发效率,提高系统的响应速度,且对于新需求的添加更为简单快捷与之前的系统功能冲突性小,且负载均衡和智能容错等功能都可以帮助监管部门更好更直观的进行食品安全监管。

参考文献(References)

[1] Hantoro I,Ansje J.L?hr,Belleghem F G A J V ,et al.Microplastics in coastal areas and seafood: implications for food safety[J].Food Additives & Contaminants:Part A,2019:1-38.

[2] Walraven S,Landuyt D,Rafique A,et al.PaaSHopper:Policy-driven middleware for multi-PaaS environments[J].Journal of Internet Services and Applications,2015,6(1):2.

[3] Jing H,Haihong E,Guan L,et al.Survey on NoSQL database[C].International Conference on Pervasive Computing & Applications,2011.

[4] 王方旭.基于Spring Cloud和Docker的微服务架构设计[J].中国信息化,2018(3):53-55.

[5] 张羽.一种分布式服务治理框架的设计与实现[D].北京交通大学,2016.

[6] 林红.基于Redis的气象数据分发管理系统的设计与实现[J].软件工程,2019(03):47-50.

猜你喜欢
溯源微服务食品安全
毛泽东与党的实事求是思想路线确立
微信公众平台在医院图书馆的应用现状调查
有机RFID标签在农产品食品溯源中的应用
基于微信企业号的校园移动服务
“箪瓢陋巷”典故研究
微服务视角下高职图书馆数字资源使用分析
新媒体在食品安全监管工作中的特点和作用
从单一模式系统架构往微服务架构迁移转化技术研究
我国食品安全监管面临的挑战及应对措施分析
“时务文体”溯源