Introduction Ă l'architecture des microservices
Partie 1 sur 10
Adaptation d'articles d'Ewan Valentine.
Il s'agit d'une série de dix parties, je vais essayer d'écrire une fois par mois sur la construction de microservices sur Golang. J'utiliserai protobuf et gRPC comme protocole de transport principal.
La pile que j'ai utilisée: golang, mongodb, grpc, docker, Google Cloud, Kubernetes, NATS, CircleCI, Terraform et go-micro.
Pourquoi ai-je besoin de ça? Puisqu'il m'a fallu beaucoup de temps pour le comprendre et résoudre les problÚmes accumulés. Je voulais également partager avec vous ce que j'ai appris sur la création, le test et le déploiement de microservices sur Go et d'autres nouvelles technologies.
Dans cette partie, je veux montrer les concepts et technologies de base pour la construction de microservices. Ăcrivons une implĂ©mentation simple. Le projet comprendra les entitĂ©s suivantes:
- cargaison
- inventaire
- essai
- les utilisateurs
- les rĂŽles
- authentification

Pour aller plus loin, vous devez installer Golang et les bibliothÚques nécessaires, ainsi que créer un référentiel git.
Théorie
Qu'est-ce que l'architecture de microservice?
Les microservices isolent une fonctionnalité distincte dans un service, autosuffisant en termes de fonction exécutée par ce service. Pour la compatibilité avec d'autres services, il possÚde une interface bien connue et prédéfinie.
Les microservices communiquent entre eux à l'aide de messages transmis par un intermédiaire, un courtier de messages.

GrĂące Ă l'architecture de microservice, l'application ne peut pas ĂȘtre mise Ă l'Ă©chelle en totalitĂ©, mais en partie. Par exemple, si le service d'autorisation «tressaute» plus souvent que d'autres, nous pouvons augmenter le nombre d'instances. Ce concept est conforme aux concepts du cloud computing et de la conteneurisation en gĂ©nĂ©ral.
Pourquoi Golang
Les microservices sont pris en charge dans presque toutes les langues, aprÚs tout, les microservices sont un concept, pas une structure ou un outil spécifique. Cependant, certaines langues sont mieux adaptées et, en outre, prennent mieux en charge les microservices que d'autres. Une langue avec un grand soutien est le Golang.
Rencontrez protobuf / gRPC
Comme mentionné précédemment, les microservices sont divisés en bases de code distinctes, l'un des problÚmes importants associés aux microservices est la communication. Si vous avez un monolithe, vous pouvez simplement appeler le code directement depuis un autre endroit de votre programme.
Pour résoudre le problÚme de communication, nous pouvons utiliser l'approche REST traditionnelle et transférer des données au format JSON ou XML via HTTP. Mais cette approche a ses inconvénients, par exemple, qu'avant d'envoyer un message, vous devez coder vos données et les décoder à nouveau du cÎté de la réception. Et cela est une surcharge et augmente la complexité du code.
Il y a une solution! Il s'agit du protocole gRPC - un protocole binaire lĂ©ger qui Ă©limine la transmission des en-tĂȘtes HTTP, et cela nous fera Ă©conomiser quelques octets. Le futur HTTP2 implique Ă©galement l'utilisation de donnĂ©es binaires, ce qui parle Ă nouveau en faveur de gRPC. HTTP2 permet une communication bidirectionnelle, et c'est gĂ©nial!
GRPC vous permet également de définir l'interface de votre service dans un format convivial - c'est> protobuf .
Pratique
Créez le fichier /project/consigment.proto.
Documentation officielle de protobuf
consigment.proto//consigment.proto syntax = "proto3"; package go.micro.srv.consignment; service ShippingService { rpc CreateConsignment(Consignment) returns (Response) {} } message Consignment { string id = 1; string description = 2; int32 weight = 3; repeated Container containers = 4; string vessel_id = 5; } message Container { string id = 1; string customer_id = 2; string origin = 3; string user_id = 4; } message Response { bool created = 1; Consignment consignment = 2; }
Il s'agit d'un exemple simple qui contient le service que vous souhaitez fournir à d'autres services: le service ShippingService, puis nous définirons nos messages. Protobuf est un protocole typé statiquement, et nous pouvons créer des types personnalisés (similaires aux structures de golang). Ici, le conteneur est imbriqué dans le lot.
Installez les bibliothĂšques, le compilateur et compilez notre protocole:
$ go get -u google.golang.org/grpc $ go get -u github.com/golang/protobuf/protoc-gen-go $ sudo apt install protobuf-compiler $ mkdir consignment && cd consignment $ protoc -I=. --go_out=plugins=grpc:. consignment.proto
La sortie doit ĂȘtre un fichier:
consignment.pb.go
Si, alors quelque chose s'est mal passĂ©. Faites attention aux arguments -I est le chemin oĂč le compilateur recherche les fichiers, --go_out oĂč un nouveau fichier sera créé. Il y a toujours de l'aide
$ protoc -h
Il s'agit du code généré automatiquement par les bibliothÚques gRPC / protobuf afin que vous puissiez associer votre définition de protobuf à votre propre code.
Nous écrirons main.go
main.go package seaport import ( "log" "net"
Veuillez lire attentivement les commentaires laissés dans le code. Apparemment, nous créons ici une logique d'implémentation dans laquelle nos méthodes gRPC interagissent en utilisant les formats générés, créant un nouveau serveur gRPC sur le port 50051. Maintenant, notre service gRPC y vivra.
Vous pouvez l'exécuter avec $ go run main.go , mais vous ne verrez rien et vous ne pourrez pas l'utiliser ... Alors, créons un client pour le voir en action.
Créons une interface de ligne de commande qui prend un fichier JSON et interagit avec notre service gRPC.
Dans le répertoire racine, créez un nouveau sous-répertoire de $ mkdir consignment-cli . Dans ce répertoire, créez un fichier cli.go avec le contenu suivant:
cli.go package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" )
Créez maintenant un lot (consignment-cli / consignment.json):
{ "description": " ", "weight": 100, "containers": [ { "customer_id": "_001", "user_id": "_001", "origin": " " } ], "vessel_id": "_001" }
Maintenant, si vous exécutez $ go run main.go à partir du package seaport , puis exécutez $ go run cli.go dans un panneau de terminal séparé. Vous devriez voir le message «Créé: vrai».
Mais comment vérifier exactement ce qui a été créé? Mettons à jour notre service à l'aide de la méthode GetConsignments afin que nous puissions afficher tous nos lots créés.
Donc, ici, nous avons créé une nouvelle méthode sur notre service appelée GetConsignments , nous avons également créé une nouvelle GetRequest , qui ne contient encore rien. Nous avons également ajouté un champ de lots envoyés à notre message de réponse. Vous remarquerez que le type ici a le mot-clé répété jusqu'au type. Comme vous l'avez probablement deviné, cela signifie simplement de traiter ce champ comme un tableau de ces types.
Ne vous précipitez pas pour exécuter le programme, l'implémentation de nos méthodes gRPC est basée sur la correspondance de l'interface créée par la bibliothÚque protobuf, nous devons nous assurer que notre implémentation correspond à notre définition de proto.
Ici, nous avons inclus notre nouvelle méthode GetConsignments, mis à jour notre référentiel et notre interface, respectivement créés dans la définition consignments.proto. Si vous exécutez à nouveau $ go run main.go , le programme devrait fonctionner à nouveau.
Mettons à jour notre outil cli pour inclure la possibilité d'appeler cette méthode et il est possible de lister nos parties:
cli.go package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" )
Ajoutez le code ci-dessus à cli.go et exécutez $ go run cli.go à nouveau . Le client exécutera CreateConsignment puis appellera GetConsignments. Et vous devriez voir que dans la liste des réponses contient la composition du parti.
Ainsi, nous avons le premier microservice et le premier client Ă interagir avec lui en utilisant protobuf et gRPC.
La prochaine partie de cette série comprendra l'intégration go-micro, qui est une base puissante pour la création de microservices basés sur gRPC. Nous allons également créer notre deuxiÚme service. Considérez le travail de nos services dans les conteneurs Docker, dans la prochaine partie de cette série d'articles.