Boa tarde, Habr!Costumo começar a manhã dando uma olhada no Habr e finalmente decidi contribuir para esse processo de aprender coisas interessantes. Se tudo correr bem, então este é o meu primeiro artigo do ciclo de uso da linguagem
GO em sistemas de produção. Quero lhe contar algumas das sutilezas da criação de aplicativos e servidores, a conveniência do idioma e a velocidade de desenvolvimento nele. Talvez para os profissionais, este artigo pareça entediante e pouco interessante, mas ao ler a literatura, não encontrei uma imagem geral da solução de problemas de produção. Embora a maioria das tarefas seja resolvida da mesma maneira. Neste artigo, descreverei os princípios gerais da construção de um servidor e, como exemplo, utilizarei o servidor para validar e exibir os códigos postais do Russian Post. Este artigo abordará problemas e sutilezas metodológicas mais gerais que encontrei ao criar este sistema. Não vou descrever as configurações gerais, existem muitas delas na rede, só quero focar nas pequenas coisas que impediram o lançamento do projeto.

Em vez de se juntar
Ao ler Habr, muitas vezes enfrentei a tarefa de validação - verificar a exatidão da entrada de informações do usuário. Cada autor resolveu esse problema à sua maneira. Eu usei um serviço externo ou escrevi meu servidor. Proponho outra solução para esse problema - a criação de um serviço de diretório. Diretórios são servidores que contêm informações de uma determinada direção e que podem ser distinguidas em um subsistema independente e separado. Normalmente, os diretórios são usados para ajudar o usuário a preencher e validar as informações inseridas. Um exemplo desses diretórios são os serviços de solicitações regionais, solicitações de cidades, KLADR, códigos postais, diretórios GAIS (sistemas de informações automatizadas do estado). Quase todos os sistemas existentes trocam dados REST usando json ou soap. Vou tentar definir um modelo para o desenvolvimento desses diretórios, que criará rapidamente esses sistemas. E colocar no github as fontes do meu projeto interno.
A escolha dos sistemas. Surge imediatamente a pergunta por que GO? Por que Linux? E qual Linux?
E então vamos começar em ordem. Nosso sistema atual é construído com produtos da 1C, a saber, o BUS e o portal corporativo. Para unificar o sistema operacional, escolhemos a instalação recomendada 1C - ou seja, Linux OS CentOS. Os scripts para iniciar o ambiente da web 1C são executados neste sistema operacional. O sistema operacional Windows não foi considerado. Não posso dizer que gosto da escolha, escolheria o debian, mas aconteceu. Precisávamos de unificação, porque, historicamente, temos um grande sistema operacional de zoológico, várias versões do SO Linux, OS FreeBSD e OS VxWorks. E, na minha opinião, o sistema operacional Linux CRUX mais rápido.
Como muitos projetos, o sistema criado no 1C tornou-se um grande portal e tornou-se necessário isolar o sistema e / ou suplementar o sistema com vários serviços - livros de referência. Analisando as ofertas e os recursos dos serviços já criados, bem como nossas necessidades para esses diretórios, chegamos à conclusão de que o diretório:
- Serviço de servidor autônomo;
- A troca de dados ocorre no REST;
- Tem a capacidade de escalar horizontalmente;
- Deve fornecer rapidamente dados, embora redundantes, processamento nos produtos 1C;
- Reconstrua rapidamente a lógica com base em novos desafios de negócios;
De acordo com os critérios acima e sua facilidade de entrada, o Go foi escolhido para escrever livros de referência. Opcional:
- Ir a linguagem com um compilador e permite incluir trechos de código em C;
- O programa é um arquivo único com todas as bibliotecas (não há problema com a compatibilidade das bibliotecas após a montagem);
- grande comunidade (muitos exemplos e soluções chave na mão);
Ou seja, o Go é adequado para criar diretórios. Por mim mesmo, acrescentarei que o php e o Go são um pouco semelhantes, o que permite que você suporte sistemas escritos nesses idiomas. A Go também já possui um grande número de soluções que permitem montar rapidamente essas soluções para suas tarefas, ou seja, como montar um modelo da casa a partir dos cubos no designer. E então vamos seguir praticando.
GO Instale e pesquise bibliotecas ou soluções
Para instalar, você precisa baixar o arquivo da
página de download e descompactá-lo na pasta de instalação, usarei
/ 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
Quero prestar atenção, o Go é dividido em duas categorias, a primeira é a própria linguagem de compilação e as bibliotecas incluídas no assembly (
GOROOT ), a segunda são as bibliotecas adicionais que você instalou e onde criará seu projeto (
GOPATH ). Configurando o ambiente e preparando a pasta de desenvolvimento, usarei
/ home / gouser / . Adicione
/ etc / profile ou ao seu
.profile personalizado.
export GOPATH=/home/gouser export GOROOT= /user/local/go/ export PATH=$PATH:/usr/local/go/bin
Preparando uma pasta para o seu projeto:
mkdir -p /home/gouser/{bin,pkg,src}
Então tudo é simples para o nosso projeto, crie uma pasta no src, crie arquivos com a extensão go e compile o projeto:
go build
Recomendações para criar um projeto. Recomendações gerais
- Para um projeto do github, é mais fácil criar uma pasta para o projeto src / github.com / <nome do projeto>;
- projetar o projeto como um pacote, comentar sobre cada procedimento é o caminho para obter comodamente a documentação do programa pronta em godoc;
- Retire as variáveis globais em um módulo separado e conecte-o, se necessário (se assemelha apenas a um modelo);
Exemplos e bibliotecas pré-criados podem ser encontrados em
libs.garden . Instalação de exemplos encontrados
go get < > , github.com/labstack/echo
Depois de instalar o
Go, vamos para um exemplo. Você pode fazer o download e instalá-lo para compilação usando os comandos:
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
Declaração do problema
É necessário criar um diretório para trabalhar com códigos postais por correio russo, que resolverá os seguintes problemas:
- Validação de códigos postais;
- A capacidade de obter uma lista de todos os objetos de contabilidade (regiões, cidades etc.);
- Obtenção de todos os índices no objeto de contabilização de cidades, distritos, regiões ...
- Do exposto, para trocar dados via REST na forma de json.
Pesquisa de tarefas
Primeiro, você precisa inicializar o banco de dados e, em seguida, criar um servidor de solicitações para esse banco de dados. Precisa de um banco de dados de código postal. A pesquisa é
vinfo.russianpost.ru/database/ops.html . Base no FoxPro e no arquivo zip. Os seguintes objetos de contabilidade estão localizados no banco de dados:
- região
- obla autônomo;
- distrito;
- liquidação;
- CEP.
Para a inicialização no
libs.garden , encontramos componentes e exemplos de trabalho com o banco de dados e o zip. Tomamos o
initprouter como um
roteador de solicitação. Nós nos conectamos ao projeto.
Ao examinar o arquivo do banco de dados, verificou-se que
nem todos os objetos contábeis estão especificados , ou seja, zero valor está presente na amostra.
Solução e implementação
Eu configuro objetos de contabilidade em uma hierarquia quando o banco de dados é inicializado, se o objeto de contabilidade é zero, o nome é retirado do pai. Ideologia do servidor - as solicitações chegam ao
principal (aqui o roteador de solicitações) e são redirecionadas para os
manipuladores (aqui todas as verificações de dados, conversão, etc.). Dos
manipuladores, todas as solicitações ao
banco de dados e os cálculos são realizados e os manipuladores realizam a retirada das informações recebidas. Essa
decomposição permite separar consultas no banco de dados, cálculos, verificação das informações inseridas e resultados encontrados. Em princípio, tudo.
Em vez de um total
A referência funcional acabou sendo mais complicada que o
KLADR . Ele não apenas permite que você crie um validador ou diretório no site, mas também cria um algoritmo para negócios regionais.
Se houver um negócio regional distribuído que venda serviços ou mercadorias. Os revendedores nas regiões estão registrados no portal, indicam a área em que prestam o serviço ou vendem os produtos e recebem uma série de códigos postais. Ao solicitar um serviço ou produto, o cliente indica o CEP e o aplicativo é enviado ao revendedor regional (aqui você pode criar um algoritmo complexo). Uma lista de solicitações
REST está no
github na documentação do projeto.
E um pouco de bitrix
Essa referência pode ser conectada a qualquer projeto ou estrutura, mas como temos o bitrix, coloquei um módulo para adicionar um validador aos formulários da Web de componentes padrão.
A instalação do
PS Server é especialmente dividida em 3 etapas. Isso é feito devido à obsolescência do banco de dados no site vinfo.russianpost.ru e a restrições de licenciamento. O banco de dados em si não é de minha propriedade. Ao usá-lo, você aceita a política de licenciamento acima do site anunciado.
Os servidores
PSS criados em meus projetos para o segmento corporativo e nas condições não devem ficar online. O código pode ser modificado para suas tarefas específicas. Não usamos acesso externo para nossos projetos. Os seguintes projetos que eu gostaria de descrever são um CLADR completo e um analisador de protocolo de rádio por fluxo. O próximo da fila é o asterisco Bitrix24 +. Por favor, comente quem é mais interessante.