導語:宜信於2019年3月29日正式開源nextsystem4(如下簡稱「NS4」)系列模塊。這次開源的NS4系列模塊是圍繞當前支付系統笨重、代碼耦合度高、維護成本高而產生的分佈式業務系統解決方案。NS4系列框架容許建立複雜的流程/業務流,對於業務服務節點的實現可串聯,可分佈式。其精簡、輕量,實現了「脫容器」(不依賴tomcat、jetty等容器)獨立運行。NS4系列框架的設計理念是將業務和邏輯進行分離,開發人員只需經過簡單的配置和業務實現就能夠實現邏輯複雜、性能高效、功能穩定的業務系統。【點擊查看框架總體介紹】java
NS4系列包括4個開源模塊,分別是:ns4_frame分佈式服務框架、ns4_gear_idgen ID 生成器組件(NS4框架Demo示例)、ns4_gear_watchdog 監控系統組件(服務守護、應用性能監控、數據採集、自動化報警系統)和ns4_chatbot通信組件。本文將詳細介紹ns4_frame分佈式服務框架開發指南。git
項目開源地址:https://github.com/newsettle/ns4_framegithub
ns4_frame本質上是兩個應用加三套開發框架組合起來的分佈式業務框架。redis
ns4_frame分佈式框架主要適用於業務類型爲消息流或者業務核心模型爲流式業務的業務系統。它支持消息分發、傳遞、追蹤,支持分步驟、分批次的消息處理,對於信息流、數據流等消息驅動型的業務尤其契合。緩存
ns4_frame框架是一套MAVEN父子項目,由五個項目組成:tomcat
開發語言:JAVA服務器
JDK版本:JDK1.7架構
MAVEN版本:3.3以上併發
REDIS版本:3.0以上框架
以上是開發環境必備的組件和配置,其中java爲開發語言,maven爲項目編譯打包部署必備, redis做爲消息中間件使用。
ns4_frame運行至少須要啓動三個jvm項目才能完整運行。啓動整個項目分爲以下三步:
第一步: ns4_frame消息入口是一個http接口,http服務是由NS_DISPATCHER項目提供的,因此咱們第一件事情就是要把NS_DISPATCHER運行起來。要運行NS_DISPATCHER,直接運行Bootstrap類的main方法便可。 默認的NS_DISPATCHER會在本機(127.0.0.1)的8027端口上監聽http請求,若是收到http請求,默認會將http請求轉換成內部通訊消息,並存儲到本機(127.0.0.1)的 redis中,默認訪問的redis端口號是6379。
第二步: NS_CONTROLLER負責接收NS_DISPATCHER傳入的消息,並根據配置進行消息分發。 因此咱們隨後須要運行NS_CONTROLLER項目(爲了方便,如下簡稱「CONTROLLER」) 。 在CONTROLLER項目中咱們不能直接運行,須要配置一些東⻄。CONTROLLER要運行至少須要指定一個配置文件位置。這個配置文件須要經過java命令參數來指定。假設我如今指定java運行參數 -Dconfigfile=nscontroller.xml 這個參數本質上是給CONTROLLER底層的NS_TRANSPORTER使用的,它指明瞭 NS_TRANSPORTER必須得配置文件位置,使得CONTROLLER能順利利用 NS_TRANSPORTER進行消息收發。 默認狀況下,CONTROLLER還會到classpath下去找關於NS_CHAIN須要的配置文件, 默認路徑是classpath下的nschainconfig目錄,在這個目錄下全部的xml文件會被認做是NS_CHAIN須要的配置文件集合。 當配置文件配置好後,能夠經過調用 com.creditease.ns.transporter.context.XmlAppTransporterContext的 main方法來啓動NS_CONTROLLER 。
第三步: 在這個步驟中咱們須要啓動本身的業務項目,在這個業務項目中,必須有如下三個前置條件:
完成以上的三個步驟,一個基本的ns4_frame系統就搭建好並運行起來了。
上圖展現了ns4_frame每一個系統的層次結構。
ns4_frame整套系統本質上其實就是一套消息中間件服務加開發框架,總體的結構圖以下:
上圖顯示了一個ns4_frame總體分佈式項目的運行流程,一個消息的運轉流程按以下順序:
默認的,在沒有作任何配置的狀況下,NS_MQ會自動訪問本機(127.0.0.1)的6379端口的redis,若是沒有,則會報異常。一般,NS_MQ會去找classpath下一個名爲ns_mq.properties的配置文件,這個配置文件中存儲着全部和底層消息中間件相關的屬性。
列舉一些關鍵的配置元素:
上圖展現了整個NS_TRANSPORTER的總體架構,整套框架收發處理消息分爲以下三個步驟:
ServiceMessage:對各個模塊之間傳遞的消息的java封裝,包含了模塊間通訊須要知道的任何信息;
Worker:業務層須要實現此接口的doWork方法,實現此接口的對象會被NS_TRANSPORTER的Handler線程回調用來對ServiceMessage中的信息進行處理。
ActionWorker:已經部分封裝好的抽象類,實現了Worker接口,業務層能夠直接繼承這個抽象類,簡化開發。
默認的,NS_TRANSPORTER會去找名爲configfile的系統變量,這個系統變量的值就是NS_TRANSPOTER須要的配置文件所在的路徑,NS_TRANSPORTER會找到這個xml配置文件,並在解析相關的配置後啓動。
NS_TRANSPORTER相關的配置文件模板以下:
<queues> <prefix></prefix> <launchers> <launcher> <class name="類的全名" method="method方法名" property="" /> <class name="類的全名" static-method="method方法名" /> </launcher> </launchers> <inqueues> <queue> <name></name> <fetchernum></fetchernum> <buffersize></buffersize> <handlersize></handlersize> <serviceClass></serviceClass> <sendernum></sendernum> </queue> </inqueues> </queues>
以上xml模板中有以下幾個關鍵元素須要注意:
因爲NS_CHAIN本質是一個純開發框架,故暫時忽略此框架的框架架構。
暫略
本節將詳細介紹NS_CHAINS的配置。
NS_CHAINS啓動時會去找系統變量chainconfig,這個變量的值就是NS_CHAINS配置文件所在的路徑。NS_CHAINS支持配置目錄(目錄下的全部xml格式文件都被視做NS_CHAINS框架的配置文件)和配置文件。
對於NS_CHAINS的配置格式咱們大體列舉出關鍵要素以下:
NS_DISPATCHER本質是一個獨立的創建在Netty框架上的一個能提供http服務的獨立應用,因此框架結構此處從略。
NS_DISPATCHER是以NETTY框架爲基礎的,因此其核心類就是以下的幾個協議處理器:
NS_DISPATCHER啓動會去找ns_dispatcher.properties文件,下面介紹配置的關鍵元素:
NS_CONTROLLER本質是創建在NS_TRANSPORTER和NS_CHAINS上的獨立應用,核心就是 NS_TRANSPORTER的架構加NS_CHAINS的輔助,故再也不重複列舉其架構。
DefaultPublishCommand:這是NS_CONTROLLER對於NS_CHAINS的一個擴展,它支持同步發送消息,並等待消息的響應,並能夠設置等待響應的超時時間。同時,還支持異步發送消息,不須要等待消息的響應。
遵循NS_TRANSPORTER和NS_CHAINS的配置規則,因此再也不贅述。 注意:在NS_CONTROLLER中對於NS_CHAINS的配置作了一些功能擴展,主要是添加了publish的配置元素,這個隨後能夠提供配置模板。
若是要部署整個ns4_frame項目,請按照如下步驟進行:
ns4_frame項目將日誌大體分紅了四類:
ns4_frame系統本質是一個以消息爲通訊機制的分佈式系統,常常出現的問題分紅如下兩部分:
因爲業務自己是由底層NS_TRANSPORTER回調來執行的,當業務出現異常的時候,極可能因爲沒有合適的被catch到,從而被底層的NS_TRANSPOTER框架捕獲。 對於沒有在*biz.log和stdoout.log中查找到的問題,能夠去查看下*flow.log的日誌,看是否出現了異常被底層NS_TRANSPOTER捕獲了。
有些狀況,業務自己並無出現問題,可是因爲消息通訊出現了問題,會致使業務沒有執行,對於 這種狀況咱們須要首先從消息入口處即NS_DISPATCHER的*flow.log中查找到對應的 messageId,而後根據消息流轉路徑,一步步去對應的部署機器上查詢。
內容來源:宜信技術學院