張斌 任富彬 沈煒



摘? 要:食品安全問題是關系國計民生的大事,在互聯網時代的今天,有一款可以解決食品安全的軟件是非常有必要的,有關食品的原料采購及成品去向都要在平臺中進行備案。若一件食品有問題,則可以快速定位該批食品,定位問題廠家及該批貨源所有去向,及時召回,可以有效地解決食品安全問題。而在微服務快速發展的今天,我們可以使用微服務框架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.