导语:宜信于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
项目开源地址:github.com/newsettle/n…github
ns4_frame本质上是两个应用加三套开发框架组合起来的分布式业务框架。redis
ns4_frame分布式框架主要适用于业务类型为消息流或者业务核心模型为流式业务的业务系统。它支持消息分发、传递、追踪,支持分步骤、分批次的消息处理,对于信息流、数据流等消息驱动型的业务尤其契合。缓存
ns4_frame框架是一套MAVEN父子项目,由五个项目组成:tomcat
开发语言:JAVAbash
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,而后根据消息流转路径,一步步去对应的部署机器上查询。
内容来源:宜信技术学院