Bonjour, Habr!Je commence souvent la matinée par un regard sur le Habr et décide finalement de contribuer à ce processus d'apprentissage de choses intéressantes. Si tout se passe bien, alors c'est mon premier article du cycle d'utilisation du langage
GO sur les systèmes de production. Je veux vous dire quelques-unes des subtilités de la création d'applications et de serveurs, la commodité du langage et la vitesse de développement sur celui-ci. Peut-être pour les professionnels, cet article vous paraîtra ennuyeux et pas intéressant, mais à la lecture de la littérature je n'ai pas trouvé de tableau général de résolution des problèmes de production. Bien que la plupart des tâches soient résolues de la même manière. Dans cet article, je décrirai les principes généraux de la construction d'un serveur et, à titre d'exemple, j'utiliserai le serveur pour valider et afficher les codes postaux de la poste russe. Cet article couvrira des problèmes et des subtilités méthodologiques plus généraux que j'ai rencontrés lors de la création de ce système. Je ne décrirai pas les paramètres généraux, il y en a beaucoup sur le réseau, je veux juste me concentrer sur les petites choses qui ont empêché le lancement du projet.

Au lieu de rejoindre
En lisant Habr, j'ai souvent été confronté à la tâche de validation - vérifier l'exactitude de la saisie d'informations par l'utilisateur. Chaque auteur a résolu ce problème à sa manière. J'ai utilisé un service externe ou écrit mon serveur. Je propose une autre solution à ce problème - la création d'un service d'annuaire. Les répertoires sont des serveurs qui contiennent des informations d'une certaine direction et qui peuvent être distingués en un sous-système séparé et indépendant. En règle générale, les répertoires sont utilisés pour aider l'utilisateur à remplir et à valider les informations saisies. Un exemple de tels répertoires est les services des demandes régionales, des demandes des villes, du KLADR, des codes postaux, des répertoires GAIS (systèmes automatisés d'information de l'État). Presque tous les systèmes existants échangent des données REST à l'aide de json ou de soap. J'essaierai de définir un modèle pour le développement de ces répertoires, qui permettra de créer rapidement de tels systèmes. Et mettre sur github les sources de mon projet interne.
Le choix des systèmes. La question se pose immédiatement pourquoi GO? Pourquoi Linux? Et quel Linux?
Et commençons donc dans l'ordre. Notre système actuel est construit sur des produits de 1C, à savoir le BUS et le portail d'entreprise. Pour unifier le système d'exploitation, nous avons choisi l'installation 1C recommandée, à savoir Linux OS CentOS. Les scripts de lancement de l'environnement Web 1C sont exécutés sur ce système d'exploitation. Le système d'exploitation Windows n'a pas été pris en compte. Je ne peux pas dire que j'aime le choix, je choisirais Debian, mais c'est arrivé. Nous avions besoin d'unification, car historiquement, nous avons un grand OS de zoo, différentes versions d'OS Linux, OS FreeBSD, OS VxWorks. Et, à mon avis, le système d'exploitation Linux CRUX le plus rapide.
Comme de nombreux projets, le système créé sur 1C est devenu un grand portail et il est devenu nécessaire d'isoler le système et / ou de compléter le système avec divers services - ouvrages de référence. En analysant les offres et les capacités des services déjà créés, ainsi que nos besoins pour ces répertoires, nous sommes arrivés à la conclusion que le répertoire:
- Service de serveur autonome;
- L'échange de données a lieu sur REST;
- A la capacité d'évoluer horizontalement;
- Doit fournir rapidement des données, bien que redondantes, sur les produits 1C;
- Reconstruisez rapidement la logique en fonction des nouveaux défis commerciaux;
Selon les critères ci-dessus et sa facilité d'accès, Go a été choisi pour la rédaction d'ouvrages de référence. Facultatif:
- Allez langage avec un compilateur et vous permet d'inclure des extraits de code en C;
- Le programme est un fichier unique avec toutes les bibliothèques (il n'y a aucun problème avec la compatibilité des bibliothèques après l'assemblage);
- grande communauté (nombreux exemples et solutions clé en main);
Autrement dit, Go est bien adapté pour créer des répertoires. J'ajouterai moi-même que php et Go sont un peu similaires, ce qui vous permet de prendre en charge des systèmes écrits dans ces langues. Go a également déjà un grand nombre de solutions qui vous permettent d'assembler rapidement ces solutions pour vos tâches, c'est-à -dire comment assembler un modèle de la maison à partir des cubes dans le concepteur. Et donc passons à la pratique.
Allez Installer et rechercher des bibliothèques ou des solutions
Pour installer, vous devez télécharger l'archive à partir de la
page de téléchargement et décompressez-la dans le dossier d'installation, j'utiliserai
/ 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
Je veux faire attention, Go est divisé en deux catégories, la première - le langage de compilation lui-même et les bibliothèques incluses dans l'assemblage (
GOROOT ), la seconde - ce sont des bibliothèques supplémentaires que vous avez installées et où vous allez créer votre projet (
GOPATH ). Configuration de l'environnement et préparation du dossier de développement, j'utiliserai
/ home / gouser / . Ajoutez
/ etc / profile ou Ă votre
.profile personnalisé.
export GOPATH=/home/gouser export GOROOT= /user/local/go/ export PATH=$PATH:/usr/local/go/bin
Préparer un dossier pour votre projet:
mkdir -p /home/gouser/{bin,pkg,src}
Ensuite, tout est simple pour notre projet, créez un dossier dans src, créez des fichiers avec l'extension go et compilez le projet:
go build
Recommandations pour la création d'un projet. Recommandations générales
- Pour un projet github, il est plus facile de créer un dossier pour le projet src / github.com / <nom du projet>;
- concevoir le projet sous forme de package, commenter chaque procédure est le moyen d'obtenir très facilement une documentation de programme prête à l'emploi dans godoc;
- Retirez les variables globales dans un module séparé et connectez-le si nécessaire (ressemble à un modèle seul);
Des exemples et des bibliothèques
prédéfinis peuvent être trouvés sur
libs.garden . Installation d'exemples trouvés
go get < > , github.com/labstack/echo
Après avoir installé
Go, passons à un exemple. Vous pouvez le télécharger et l'installer pour la compilation en utilisant les commandes:
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
Énoncé du problème
Il est nécessaire de créer un répertoire pour travailler avec les codes postaux par la poste russe, ce qui résoudra les problèmes suivants:
- Validation des codes postaux;
- La possibilité d'obtenir une liste de tous les objets comptables (régions, villes, etc.);
- Obtention de tous les indices dans le but de comptabiliser les villes, quartiers, régions ...
- De ce qui précède, pour échanger des données via REST sous la forme de json.
Recherche de tâches
Vous devez d'abord initialiser la base de données, puis créer un serveur de requêtes pour cette base de données. Besoin d'une base de données de code postal. La recherche est
vinfo.russianpost.ru/database/ops.html . Base dans FoxPro et dans l'archive zip. Les objets comptables suivants se trouvent dans la base de données:
- région
- obla autonome;
- quartier;
- règlement;
- code postal.
Pour l'initialisation sur
libs.garden, nous trouvons des composants et des exemples d'utilisation de la base de données et du zip. Nous prenons
httprouter comme
routeur de demande. Nous nous connectons au projet.
Lors de l'examen du fichier de base de données, il a été constaté que
tous les objets de comptabilité ne sont pas spécifiés , c'est-à -dire que des valeurs nulles sont présentes dans l'échantillon.
Solution et implémentation
J'ai mis en place des objets de comptabilité dans une hiérarchie lorsque la base de données est initialisée, si l'objet de comptabilité est nul, le nom est emprunté au parent. Idéologie du serveur - les demandes viennent au
principal (ici le routeur de demande) et sont redirigées vers les
gestionnaires (ici toutes les vérifications de données, la conversion, etc.). Des
gestionnaires toutes les demandes Ă la
base de données et les calculs sont effectués et les gestionnaires effectuent le retrait des informations reçues. Une telle
décomposition vous permet de séparer les requêtes dans la base de données, les calculs, la vérification des informations saisies et les résultats trouvés. En principe, tout.
Au lieu d'un total
La référence fonctionnelle s'est avérée plus compliquée que
KLADR . Il vous permet non seulement de créer un validateur ou un annuaire sur le site, mais également de créer un algorithme pour les entreprises régionales.
S'il existe une entreprise régionale distribuée vendant des services ou des biens. Les concessionnaires des régions sont enregistrés sur le portail, indiquent la zone où ils fourniront le service ou vendront les marchandises et ils se verront attribuer une série de codes postaux. Lorsqu'il demande un service ou un produit, le client indique le code postal et sa demande est envoyée à son revendeur régional (ici vous pouvez construire un algorithme complexe). Une liste des demandes
REST est sur
github dans la documentation du projet.
Et un peu de bitrix
Cette référence peut être connectée à n'importe quel projet ou framework, mais comme nous avons du bitrix, j'ai mis un module pour ajouter un validateur aux formulaires web des composants standards.
L' installation du serveur
PS est spécialement divisée en 3 étapes. Cela est dû à l'obsolescence de la base de données du site vinfo.russianpost.ru et à des restrictions de licence. La base de données elle-même n'est pas ma propriété. En l'utilisant, vous acceptez la politique de licence au-dessus du site annoncé.
Les serveurs
PSS créés dans mes projets pour le segment entreprise et dans les conditions ne doivent pas être mis en ligne. Le code peut être modifié pour vos tâches spécifiques. Nous n'utilisons pas d'accès externe pour nos projets. Les projets suivants que je voudrais décrire sont un CLADR à part entière et un analyseur de protocole radio de flux. Le prochain en ligne est Bitrix24 + astérisque. Veuillez indiquer qui est le plus intéressant.