在一个项目中,需要将数据从第三方系统的导入过程转移到微服务体系结构。选择了Apache NiFi作为工具。作为第一个实验,选择了联邦税收服务注册的导入。
USRLE数据以XML文件形式发布,并打包在ZIP存档中。存档每天在https://ftp.egrul.nalog.ru/
相应日期的单独目录中的资源上进行布局。要进行访问,密钥为#PKCS12。
NiFi需要解决的任务是从联邦税务局下载文件,并准备将下载的数据导入我们的服务。本文介绍如何实现文件下载。
数据源
从USRLE获得数据是作为联邦税收服务“集成和访问法律实体和USRIP统一州注册簿”数据库的一部分进行的。这里介绍了交互模型。
这是联邦税收服务的资源,您想从中下载文件。

后缀为FULL的目录是在相应年份开始时卸载完整寄存器的目录。其余目录是寄存器中的每日更新。我们有兴趣下载每日更新。
Apache NiFi中的流设置
流的任务是收集昨天上传的目录文件列表,获取这些文件并解压缩。
NiFi :
- FlowFile,
- HTML
- HTML ,

FlowFile
FlowFile GenerateFlowFile.
24 FlowFile fnsEgrulURL. https://ftp.egrul.nalog.ru/?dir=EGRUL/14.04.2020
. NiFi Expression Language:
${literal('https://ftp.egrul.nalog.ru/?dir=EGRUL/'):append(${now():toNumber():minus(86400000):format('dd.MM.yyyy')})}
那些。当前日期被采用并转换为日期的数字表示形式。从中减去86,400,000毫秒。结果将转换为日期的字符串表示形式,格式为dd.MM.yyyy。结果日期将添加到链接的永久部分。在输出中,我们获得以下形式的FlowFile:
检索目录内容
InvokeHTTP处理器用于获取目录的内容。他使用昨天上传的目录链接执行GET请求。作为响应,处理器接收目录HTML代码,并将此HTML代码作为内容添加到FlowFile。
:
HTTPMethod — GET;
Remote URL — , URL . ${fnsEgrulURL}
— FlowFile fnsEgrulURL;
SSL Context Service — SSLContextService , .. HTTPS. #PKCS12 .
FlowFile , , — HTML- .
SSLContextService
SSLContexService #PKCS12 , , .
cacerts JDK. . https://fns.egrul.nalog.ru
, #PKCS12. .

在证书链中,您必须选择俄罗斯DPC税务服务证书并以DER编码.CER格式导出。接下来,您需要使用keytool实用程序将证书从接收到的文件导入cacerts存储库。例如,像这样:
C:\Program Files\Java\jdk1.8.0_121\bin> keytool -importcert -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts" -file { .CER}
cacerts
的默认密码为changeit。cacerts , NiFi . , Persistent Volume. SSLContextService. PKSC12, cacerts — JKS.
GetHTMLElement, HTML- FlowFile-. ZIP-.
<div id="page-content" class="container">
<div id="directory-list-header">
<div class="row">
<div class="col-md-7 col-sm-6 col-xs-10"></div>
<div class="col-md-2 col-sm-2 col-xs-2 text-right"></div>
<div class="col-md-3 col-sm-4 hidden-xs text-right"> </div>
</div>
</div>
<ul id="directory-listing" class="nav nav-pills nav-stacked">
<li data-name=".." data-href="https://ftp.egrul.nalog.ru/?dir=EGRUL">
<a href="https://ftp.egrul.nalog.ru/?dir=EGRUL" class="clearfix" data-name="..">
<div class="row">
<span class="file-name col-md-7 col-sm-6 col-xs-9">
<i class="fa fa-level-up fa-fw"></i>
.. </span>
<span class="file-size col-md-2 col-sm-2 col-xs-3 text-right">
- </span>
<span class="file-modified col-md-3 col-sm-4 hidden-xs text-right">
2020-04-05 22:00:00 </span>
</div>
</a>
</li>
<li data-name="EGRUL_2020-04-05_1.zip" data-href="EGRUL/05.04.2020/EGRUL_2020-04-05_1.zip">
<a href="EGRUL/05.04.2020/EGRUL_2020-04-05_1.zip" class="clearfix" data-name="EGRUL_2020-04-05_1.zip">
<div class="row">
<span class="file-name col-md-7 col-sm-6 col-xs-9">
<i class="fa fa-file-archive-o fa-fw"></i>
EGRUL_2020-04-05_1.zip </span>
<span class="file-size col-md-2 col-sm-2 col-xs-3 text-right">
528.78KB </span>
<span class="file-modified col-md-3 col-sm-4 hidden-xs text-right">
2020-04-05 22:00:24 </span>
</div>
</a>
<a href="javascript:void(0)" class="file-info-button">
<i class="fa fa-info-circle"></i>
</a>
</li>
</ul>
</div>
:
URL — URL HTML-;
CSS Selector — . li[data-name^=EGRUL]
— li
, data-name
, EGRUL
;
Output Type — Attribute
— HTML-;
Destination — flowfile-attribute
— FlowFile- ( HTMLElement);
Attribute Name — , . abs:${literal('data-href')}
— URL (abs:
) + data-href
, CSS-.
, CSS- FlowFile ZIP- HTMLElement.
InvokeHTTP , HTML- . URL HTMLElement, ZIP-. SSLContextService .
ZIP- FlowFile .
UnpackContent. — ZIP.
在输出处,处理器为从ZIP存档解压缩的每个XML文件创建一个FlowFile。
进一步...
此外,每个XML需要转换为JSON并按组织细分,因为 每个XML包含1到1000个寄存器语句。并且将来会通过JSON将数据加载到SQL或NoSQL存储中。
下一篇文章将XML转换为JSON和AVROSchema。