張斌 任富彬 沈煒
摘? 要:食品安全問題是關(guān)系國計民生的大事,在互聯(lián)網(wǎng)時代的今天,有一款可以解決食品安全的軟件是非常有必要的,有關(guān)食品的原料采購及成品去向都要在平臺中進行備案。若一件食品有問題,則可以快速定位該批食品,定位問題廠家及該批貨源所有去向,及時召回,可以有效地解決食品安全問題。而在微服務(wù)快速發(fā)展的今天,我們可以使用微服務(wù)框架SpringCloud快速有效的進行食品安全溯源系統(tǒng)的開發(fā)。
關(guān)鍵詞:微服務(wù);食品安全;溯源;NoSQL;消息中間件
中圖分類號:TP311.5? ? ?文獻標(biāo)識碼: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)
近年來,食品安全事故給社會帶來了深刻的負(fù)面影響,公眾對食品安全和監(jiān)管的要求也越來越高[1]。國家雖然不斷完善和推出新的法律法規(guī),但是食品安全問題依然層出不窮,所以我們考慮開發(fā)一個互聯(lián)網(wǎng)項目,將每個食品從生產(chǎn)到售出到用戶手中都以數(shù)據(jù)的形式記錄下來,隨時進行安全監(jiān)管,提高消費者對食品安全和政府監(jiān)管的信心。本系統(tǒng)考慮使用當(dāng)下流行的微服務(wù)框架SpringCloud,能夠進行快速讀寫的NoSQL數(shù)據(jù)庫Redis及當(dāng)下流行的用于消息推送及流量削峰的消息中間件[2]RabbitMQ來進行開發(fā)。
2? ?微服務(wù)介紹(Micro-service introduction)
最初的單體架構(gòu),在java中可以理解為一個Java Web應(yīng)用程序,從JSP時代到中間過渡使用的流行的Struts+Spring+ Hibernate框架及SpringMVC+Spring+Mybatis框架,都屬于單體架構(gòu),包含視圖層、業(yè)務(wù)層、數(shù)據(jù)訪問層,也就是我們常說的MVC架構(gòu),從Controller到Service到最后與數(shù)據(jù)庫操作相關(guān)的Dao層,所有服務(wù)都寫在一個程序中,沒有任何拆分,各模塊之間耦合度高,如果有一個地方要修改,要從上到下controller到dao的去修改,且因為在一個程序中,其他模塊被影響的可能性也非常大,每次都要等待所有開發(fā)人員完成后才能完成部署,團隊靈活性非常低。且因為所有的功能都寫在一起,在程序啟動時,一個進程包含了所有的業(yè)務(wù)邏輯,系統(tǒng)的啟動時間會比較長。而且當(dāng)添加新的需求或改進時,無法針對單點增加,每次都要進行全局的修改部署,影響團隊效率。單體服務(wù)架構(gòu)圖如圖1所示。
微服務(wù)架構(gòu)是近些年來隨著互聯(lián)網(wǎng)快速發(fā)展衍生的新的系統(tǒng)架構(gòu),它可以將一個完整的應(yīng)用從數(shù)據(jù)存儲到模塊劃分垂直的拆分為多個不同的服務(wù),每個服務(wù)負(fù)責(zé)自己的模塊,相互獨立,都能獨立部署、維護及擴展,服務(wù)之間通過諸如RESTful API或RPC的方式來進行相互調(diào)用。微服務(wù)是一種新的適應(yīng)于當(dāng)今互聯(lián)網(wǎng)行業(yè)需求的架構(gòu)風(fēng)格,一個大型復(fù)雜的軟件系統(tǒng)可以由一個或多個微服務(wù)組成,且各微服務(wù)之間是松耦合的。每個微服務(wù)僅需要關(guān)注自身的業(yè)務(wù)邏輯即可。微服務(wù)架構(gòu)示意圖如圖2所示。
3? 系統(tǒng)技術(shù)選型及總體架構(gòu)設(shè)計(System technology selection and overall architecture design)
Spring Cloud是Spring團隊基于Spring Boot實現(xiàn)的微服務(wù)框架,它整合了諸多優(yōu)秀的開源組件,如服務(wù)網(wǎng)關(guān)zuul和gateway,提供服務(wù)間調(diào)用的feign組件,用于服務(wù)注冊及服務(wù)發(fā)現(xiàn)的eureka和consul,負(fù)載均衡組件ribbon,服務(wù)間調(diào)用組件feign,配置中心config,容錯組件hystrix,智能路由等。
Redis是一個開源的使用ANSIC語言編寫的key-value存儲系統(tǒng),是當(dāng)前比較熱門的NOSQL[3]系統(tǒng)之一。Redis的讀寫操作都在內(nèi)存中進行,讀取速度可以達(dá)到110000次/s,寫速度可以達(dá)到81000次/s,效率遠(yuǎn)遠(yuǎn)高于數(shù)據(jù)庫的只有千級的并發(fā)量。所以很多短時間不會發(fā)生變化的數(shù)據(jù)我們都可以存儲在Redis中,提高用戶的響應(yīng)速度,減輕數(shù)據(jù)庫壓力。
RabbitMQ是使用Erlang語言編寫的基于AMQP協(xié)議的開源的消息代理和隊列服務(wù)器。它憑借自身高可靠、易擴展、高可用及豐富的功能特性成為最流行的消息中間件之一。當(dāng)我們使用消息中間件進行服務(wù)間的消息推送時,當(dāng)服務(wù)A向服務(wù)B發(fā)送消息,如果當(dāng)時網(wǎng)絡(luò)不可用,或B服務(wù)出現(xiàn)故障,消息中間件都將保留著這份消息,直到服務(wù)B可以接受執(zhí)行并消費消息,可以防止服務(wù)間因為一個服務(wù)出現(xiàn)問題而出現(xiàn)阻塞。
(1)數(shù)據(jù)庫:將食品安全溯源系統(tǒng)的全部數(shù)據(jù)都存放在MySQL數(shù)據(jù)庫中,MySQL是當(dāng)下最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,特別在WEB系統(tǒng)方面使用尤為廣泛,這里我們將所有的企業(yè)信息,食品信息包括食品的原材料采購及成品售出去向等信息,每次的企業(yè)生產(chǎn)報備信息等都存儲在數(shù)據(jù)庫中,考慮到數(shù)據(jù)庫的并發(fā)量,在系統(tǒng)中我們會將特定的符合條件的數(shù)據(jù)存放在Redis中,通過設(shè)置過期時間等來根據(jù)特定場景對數(shù)據(jù)的實時性進行維護,提高數(shù)據(jù)讀寫效率,提高系統(tǒng)響應(yīng)速度。
(2)業(yè)務(wù)邏輯層:首先將整個系統(tǒng)拆分為不同的服務(wù)模塊,主要分為服務(wù)提供者和服務(wù)消費者兩大類,服務(wù)提供者包括企業(yè)模塊、食品模塊、備案模塊,包含短信發(fā)送服務(wù)等功能的基礎(chǔ)模塊,服務(wù)消費者包括企業(yè)端模塊和監(jiān)管端模塊。企業(yè)首先進行注冊,通過上傳營業(yè)執(zhí)照等成功進行資格審查后,可以進行食品生產(chǎn)及銷售備案,而所有的企業(yè)信息,食品生產(chǎn)及銷售信息等都可以在監(jiān)管端清晰地展示出來。
(3)展示界面:主要通過ElementUI+vue.js實現(xiàn)前端頁面的展示,前端頁面主要分為兩部分,提供給企業(yè)使用的企業(yè)系統(tǒng)和提供給政府監(jiān)管方使用的監(jiān)管系統(tǒng)。在監(jiān)管系統(tǒng)中,我們可以通過Echarts圖表的方式來清晰的展示我們想要得到的各種信息。
4? ?系統(tǒng)模塊設(shè)計(System module design)
4.1? ?企業(yè)端模塊
企業(yè)通過手機號進行企業(yè)注冊,注冊后企業(yè)的默認(rèn)狀態(tài)為未認(rèn)證狀態(tài),通過上傳營業(yè)執(zhí)照進行企業(yè)合法性審核并等待監(jiān)管端進行審核。若審核通過,企業(yè)可以上傳生產(chǎn)/銷售許可證進行相關(guān)生產(chǎn)/銷售資質(zhì)的審核申請,同樣在審核通過后可以進行食品登記并在進行生產(chǎn)/銷售備案后進行食品生產(chǎn)和出貨銷售。企業(yè)注冊流程圖如圖4所示。
企業(yè)注冊后可以進行生產(chǎn)報備,包括使用的原材料信息,生產(chǎn)的食品件數(shù),一次生產(chǎn)報備會有一個唯一的身份標(biāo)識碼,如果需要食品溯源時,這個碼就是可以快速定位全部食品去向的“身份證”。生產(chǎn)結(jié)束后會進入企業(yè)的庫存信息中,每次進行銷售的時候要進行食品銷售報備,包括交易企業(yè)信息、銷售件數(shù)、銷售件數(shù)要在庫存中扣除,當(dāng)庫存售光,即該批次的食品銷售完畢,每一級的經(jīng)銷商在出貨銷售的時候也要進行銷售報備,直到末級經(jīng)銷商(如超市)。
4.2? ?監(jiān)管端模塊
監(jiān)管端模塊是給政府或食藥監(jiān)等監(jiān)管部門使用的一套系統(tǒng),這里可以直觀地看到全部食品生產(chǎn)企業(yè)及銷售企業(yè)的一切行為,可以看到每次的食品生產(chǎn)及銷售的報備情況,更是有一鍵追溯功能能夠快速定位問題食品的去向可以快速追回。
首先監(jiān)管端賬號由系統(tǒng)管理員提供給監(jiān)管方,在賬號第一次登錄時需要用戶綁定手機,在通過手機驗證碼校驗后可以輸入自定義的新密碼,且后面可以通過手機號登錄。
登錄成功后首先進入工作臺頁面,這里可以直觀地查看系統(tǒng)中全部企業(yè)的大體情況,里面有各種Echarts圖表做的各種統(tǒng)計,主要分為企業(yè)模塊和報備模塊,如當(dāng)月報備企業(yè)數(shù)和未報備企業(yè)數(shù),按地區(qū)顯示地區(qū)的入網(wǎng)企業(yè)數(shù)和報備企業(yè)數(shù),當(dāng)月報備總數(shù)及同比上漲比例等。
通過工作臺的功能導(dǎo)航欄可以進入企業(yè)管理模塊,這里可以查看各種類型的企業(yè)列表及對單個企業(yè)進行操作,可以按照當(dāng)月報備或未報備類型來查看企業(yè)列表,也可以通過精確查找或模糊匹配來完成目標(biāo)企業(yè)的查找。在查看企業(yè)中,我們可以通過發(fā)送短信的方式給企業(yè)相關(guān)負(fù)責(zé)人發(fā)送通知,也可以通過消息隊列來進行站內(nèi)消息的收發(fā),企業(yè)審核的功能也是在這里完成的,若發(fā)現(xiàn)企業(yè)異常行為可以將企業(yè)加入異常名單中,異常名單中的企業(yè)不能進行生產(chǎn)/銷售報備,企業(yè)要通過上傳材料解除異常且通過審核后才可以恢復(fù)正常。
監(jiān)管端功能流程圖如圖5所示。
5? ?系統(tǒng)實現(xiàn)(System implementation)
5.1? ?系統(tǒng)架構(gòu)實現(xiàn)
食品安全溯源系統(tǒng)采用SpringCloud+MySQL+Redis+
RabbitMQ的微服務(wù)架構(gòu)方式搭建而成。
接口請求到我們的服務(wù)的時候首先要經(jīng)過網(wǎng)關(guān),這里我們使用的是Spring Cloud[4]生態(tài)體系中的第二代網(wǎng)關(guān)Spring Cloud Gateway。Spring Cloud Gateway是Spring官方基于Spring5.0、Spring Boot2.0和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它為微服務(wù)架構(gòu)提供了簡單、有效且統(tǒng)一的API路由管理方式,其不僅提供統(tǒng)一的路由方式,并且還基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點、限流等。
服務(wù)治理[5]我們采用Spring Cloud的Consul組件,Spring Cloud Consul是一個分布式高可用的系統(tǒng)服務(wù)發(fā)現(xiàn)與配置工具,提供包括服務(wù)發(fā)現(xiàn)、配置和分段功能在內(nèi)的全功能控制平面。有了Consul,服務(wù)可以通過DNS或者HTTP直接找到它所以來的服務(wù),Consul提供健康檢查的機制,Consul還支持多數(shù)據(jù)中心,這意味著用戶不用為了多數(shù)據(jù)中心自己做抽象。
Spring Cloud Feign使我們使用的服務(wù)間調(diào)用組件,它是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign,可以做到使用HTTP請求訪問遠(yuǎn)端服務(wù),就像調(diào)用本地方法一樣,開發(fā)者完全感知不到這是在調(diào)用遠(yuǎn)程方法,更感知不到在訪問HTTP方法。
Spring Cloud Ribbon組件是微服務(wù)體系中彈性擴展的基礎(chǔ)組件,其豐富的負(fù)載均衡策略、重試機制、支持多協(xié)議的異步與響應(yīng)式模型、容錯、緩存與批處理等功能都可以讓我們在構(gòu)建微服務(wù)架構(gòu)時更加方便快捷。
Spring Cloud Hystrix是Spring Cloud提供的一個針對分布式系統(tǒng)容錯處理的開源組件,它是一個延遲和容錯庫,旨在隔離遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫,阻止級聯(lián)故障,在復(fù)雜的分布式系統(tǒng)中實現(xiàn)恢復(fù)能力。
Spring Cloud Config是Spring Cloud微服務(wù)體系中的配置中心,是微服務(wù)中不可獲取的一部分,其能夠很好的將程序中配置日益增多的各種功能的開關(guān)、參數(shù)的配置、服務(wù)器的地址,配置修改后實時生效,灰度發(fā)布,分環(huán)境、分集群管理配置等進行全面的集中化管理,有利于系統(tǒng)的配置管理和維護。
Redis是一款在內(nèi)存中進行讀寫的非關(guān)系型Key-Value存儲系統(tǒng),作為一個內(nèi)存數(shù)據(jù)庫,Redis讀寫數(shù)據(jù)的時候不會受到硬盤I/O速度的限制,讀取速度可以達(dá)到110000次/秒,寫入速度達(dá)到81000次/秒,遠(yuǎn)遠(yuǎn)優(yōu)于常規(guī)DB數(shù)據(jù)庫的讀取速度[6]。它支持多種數(shù)據(jù)類型,并支持原子性操作。Redis與其他Cache相比,擁有更多的數(shù)據(jù)結(jié)構(gòu)并支持更豐富的數(shù)據(jù)操作。Redis最主要的應(yīng)用場景之一便是業(yè)務(wù)緩存,將一些不經(jīng)常改變但又經(jīng)常訪問的熱點數(shù)據(jù)常駐在內(nèi)存中,并在內(nèi)存中完成對數(shù)據(jù)的操作有效地減少數(shù)據(jù)庫讀取次數(shù),減少數(shù)據(jù)庫壓力,提高響應(yīng)時間,增強吞吐量。
5.2? ?持久化實現(xiàn)
數(shù)據(jù)庫使用流行的關(guān)系型數(shù)據(jù)庫MySQL,使用的持久層框架為SpringBoot自帶的Spring Data Jpa,Spring Data JPA是Spring Data的一個子項目,它通過提供基于JPA的Repsitory極大地減少了JPA作為數(shù)據(jù)訪問方案的代碼量。
5.3? ?業(yè)務(wù)邏輯流程
本系統(tǒng)從前端接受的數(shù)據(jù)類型均為json格式,在通過路由匹配找到對應(yīng)的Controller方法后開始執(zhí)行我們的業(yè)務(wù)邏輯代碼。Controller在接受前端傳遞的參數(shù)后去service層處理邏輯,service層通過redis中或通過dao層取出相應(yīng)數(shù)據(jù),若是調(diào)用其他服務(wù)的接口,則在service層中通過feign組件調(diào)用其他服務(wù)的接口,將數(shù)據(jù)封裝好后返回給controller層,再同樣以json的格式返回給用戶。
5.4? ?頁面實現(xiàn)
前端采用ElementUI+VUE.js的前端架構(gòu)來實現(xiàn)前端頁面開發(fā),VUE負(fù)責(zé)與后臺數(shù)據(jù)交互和前端頁面數(shù)據(jù)的動態(tài)渲染,ElementUI負(fù)責(zé)靜態(tài)頁面的編寫,圖表使用Echarts插件進行生成。
6? ?結(jié)論(Conclusion)
本文描述了SpringCloud微服務(wù)架構(gòu)的開發(fā)理念,介紹了Spring Cloud提供的微服務(wù)組件,并且基于微服務(wù)架構(gòu)體系開發(fā)了食品安全溯源系統(tǒng)。介紹了系統(tǒng)中各個模塊的設(shè)計和實現(xiàn)方法,傳統(tǒng)的監(jiān)管類軟件都是基于傳統(tǒng)的單體架構(gòu)開發(fā)的,代碼臃腫繁雜,冗余較高,本文將微服務(wù)架構(gòu)應(yīng)該在相關(guān)軟件中,為監(jiān)管部門提供更加完善的技術(shù)支持,提高開發(fā)效率,提高系統(tǒng)的響應(yīng)速度,且對于新需求的添加更為簡單快捷與之前的系統(tǒng)功能沖突性小,且負(fù)載均衡和智能容錯等功能都可以幫助監(jiān)管部門更好更直觀的進行食品安全監(jiān)管。
參考文獻(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的微服務(wù)架構(gòu)設(shè)計[J].中國信息化,2018(3):53-55.
[5] 張羽.一種分布式服務(wù)治理框架的設(shè)計與實現(xiàn)[D].北京交通大學(xué),2016.
[6] 林紅.基于Redis的氣象數(shù)據(jù)分發(fā)管理系統(tǒng)的設(shè)計與實現(xiàn)[J].軟件工程,2019(03):47-50.