下午好,哈伯!我经常从早上开始观察哈伯(Habr),最后决定为学习有趣事物的这一过程做出贡献。 如果一切顺利,那么这是我在生产系统上使用
GO语言的第一篇文章。 我想告诉您一些创建应用程序和服务器的精妙之处,语言的便利性以及基于它的开发速度。 也许对于专业人士而言,这篇文章看起来很无聊且没有意思,但是阅读文献后,我并没有找到解决生产问题的一般情况。 尽管大多数任务都以相同的方式解决。 在本文中,我将描述构建服务器的一般原理,并以一个示例为例,我将使用服务器来验证和查看Russian Post的邮政编码。 本文将介绍我在创建此系统时遇到的更一般的方法论问题和微妙之处。 我将不介绍一般设置,网络上有许多这样的设置,我只想关注阻碍项目启动的小事情。

而不是加入
在阅读Habr时,我经常面临验证的任务-检查用户输入信息的正确性。 每个作者都以自己的方式解决了这个问题。 我使用了外部服务或编写了服务器。 我提出了解决此问题的另一种方法-创建目录服务。 目录是包含特定方向信息的服务器,可以将其区分为单独的独立子系统。 通常,目录用于帮助用户填写并验证输入的信息。 这样的目录的一个例子是区域请求,城市请求,KLADR,邮政编码,GAIS(州自动信息系统)目录的服务。 几乎所有现有系统都使用json或soap交换REST数据。 我将尝试介绍用于此类目录开发的模板,该模板将快速创建此类系统。 并把我内部项目的资源放在github上。
系统的选择。 问题立即出现,为什么要去? 为什么选择Linux? 以及哪个Linux?
因此,让我们按顺序开始。 我们当前的系统基于1C产品,即BUS和公司门户。 为了统一操作系统,我们从推荐的1C安装中进行选择-Linux OS CentOS。 在此OS上运行用于启动1C Web环境的脚本。 不考虑Windows操作系统。 我不能说我喜欢这个选择,我会选择debian,但这确实发生了。 我们需要统一,因为从历史上看我们有一个大型的动物园操作系统,各种版本的OS Linux,OS FreeBSD和OS VxWorks。 我认为,这是最快的Linux CRUX操作系统。
像许多项目一样,在1C上创建的系统已经成长为一个大型门户网站,因此有必要隔离系统和/或为系统添加各种服务-参考书。 通过分析已经创建的服务的报价和功能以及我们对这些目录的需求,我们得出以下结论:
- 自主服务器服务;
- 数据交换在REST上进行;
- 具有水平缩放的能力;
- 必须快速提供数据,即使有冗余,也要在1C产品上进行处理;
- 根据新的业务挑战快速重建逻辑;
根据上述标准及其易于输入的要求,选择了Go作为编写参考书的依据。 可选的:
- 使用编译器使用语言,并允许您在C中包含代码段;
- 该程序是具有所有库的单个文件(汇编后库的兼容性没有问题);
- 大型社区(许多示例和交钥匙解决方案);
也就是说,Go非常适合创建目录。 从我本人来说,我会补充说php和Go有点相似,它使您可以支持使用这些语言编写的系统。 Go还已经拥有大量解决方案,可让您快速完成任务所需的这些解决方案,即如何从设计器中的多维数据集组装房屋模型。 因此,让我们继续练习。
去吧 安装和搜索库或解决方案
要安装,您需要从
下载页面下载档案并将其解压缩到安装文件夹,我将使用
/ usr / local 。
wget https://dl.google.com/go/go1.12.1.linux-amd64.tar.gz tar -C /usr/local -xvzf go1.12.1.linux-amd64.tar.gz
我要注意,Go分为两类,第一类是编译语言本身以及程序
集中包含的库(
GOROOT ),第二类是您安装的附加库,您将在其中创建项目(
GOPATH )。 设置环境并准备开发文件夹,我将使用
/ home / gouser / 。 添加
/ etc / profile或您的自定义
.profile 。
export GOPATH=/home/gouser export GOROOT= /user/local/go/ export PATH=$PATH:/usr/local/go/bin
为您的项目准备一个文件夹:
mkdir -p /home/gouser/{bin,pkg,src}
然后,对于我们的项目而言,一切都很简单,在src中创建一个文件夹,使用go扩展名创建文件并编译该项目:
go build
有关创建项目的建议。 一般建议
- 对于github项目,为src / github.com project / <项目名称>创建文件夹更加容易;
- 将项目设计为一个包,对每个过程进行注释是非常方便地在godoc中获取现成程序文档的方式;
- 在单独的模块中取出全局变量,并在必要时将其连接(仅类似于模板);
可以在
libs.garden中找到预构建的示例和库。 安装发现的示例
go get < > , github.com/labstack/echo
安装
Go之后,让我们继续一个示例。 您可以使用以下命令下载并安装它以进行编译:
go get github.com/julienschmidt/httprouter go get github.com/LindsayBradford/go-dbf/godbf go get github.com/go-sql-driver/mysql go get github.com/julienschmidt/httprouter cd /home/gouser/go/src/github.com/ git clone https://github.com/Theo730/postcode.git postcode
问题陈述
必须创建一个目录来处理俄罗斯邮政的邮政编码,这将解决以下问题:
- 邮政编码验证;
- 获得所有会计对象(地区,城市等)列表的能力;
- 获取以城市,地区,地区为核算对象的所有指标...
- 从上面开始,通过JSON形式的REST交换数据。
任务研究
首先,您需要初始化数据库,然后为该数据库创建一个请求服务器。 需要一个邮政编码数据库。 搜索是
vinfo.russianpost.ru/database/ops.html 。 在FoxPro和zip存档中。 以下会计对象位于数据库中:
对于
libs.garden上的初始化,我们找到使用数据库和zip的组件和示例。 我们将
httprouter作为请求
路由器 。 我们连接到项目。
检查数据库文件时,发现
并非所有记帐对象都已指定 ,也就是说,样本中存在零值。
解决方案与实施
初始化数据库时,我在层次结构中设置了记帐对象,如果记帐对象为零,则名称取自父对象。 服务器意识形态-请求到达
主服务器(此处为请求路由器),并重定向至
处理程序 (此处为所有数据检查,转换等)。 从
处理程序到
数据库的所有请求都将进行计算,处理程序将对收到的信息进行提取。 通过这种
分解 ,您可以分离数据库中的查询,计算,输入信息的验证和找到的输出。 原则上,一切。
而不是总数
事实证明,功能参考比
KLADR更复杂。 它不仅允许您在站点上创建验证器或目录,还可以为区域业务创建算法。
是否有分布区域的企业销售服务或商品。 该地区的经销商在门户网站上注册,指出他们将提供服务或出售商品的区域,并为他们分配了一系列邮政编码。 当请求服务或产品时,客户指示邮政编码,并将其应用程序发送给其区域经销商(您可以在此处构建复杂的算法)。
REST请求的列表在项目文档的
github上。
还有一点痛苦
该参考可以连接到任何项目或框架,但是由于我们有bitrix,因此我放置了一个模块,以将验证器添加到标准组件的Web表单中。
PS Server的安装特别分为3个阶段。 这样做是由于vinfo.russianpost.ru网站上的数据库已过时以及许可限制。 数据库本身不是我的财产,使用该数据库即表示您接受声明站点上方的许可政策。
在我的项目中为公司部门创建的
PSS服务器,在这种情况下,不应联机。 可以针对您的特定任务修改代码。 我们不对项目使用外部访问。 我要描述的以下项目是成熟的CLADR和流无线协议分析器。 接下来的一行是Bitrix24 +星号。 请评论谁更有趣。