Maison  >  Article  >  développement back-end  >  Golang construit un système de passerelle léger

Golang construit un système de passerelle léger

PHPz
PHPzoriginal
2023-03-31 10:25:481433parcourir

Avec le développement d'Internet, l'architecture des microservices est devenue le choix de plus en plus d'entreprises. Dans l’architecture des microservices, la passerelle est un élément indispensable. En tant qu'élément important de l'architecture des microservices, la passerelle est responsable du routage des demandes et de l'équilibrage de charge, du contrôle de sécurité et de la conversion des protocoles, et peut effectuer efficacement une gestion unifiée et un contrôle d'accès des services back-end.

Actuellement, il existe de nombreux produits de passerelle couramment utilisés sur le marché, tels que Kong, APISIX, etc. Cependant, ces produits de passerelle présentent certains problèmes tels que des coûts d'apprentissage élevés et une configuration complexe. Ils peuvent être surqualifiés pour certains scénarios simples.

En tant que langage de programmation simple et efficace, Golang exploite pleinement ses avantages de concurrence et d'intégration élevées, et peut être utilisé pour créer un système de passerelle léger. Cet article expliquera les aspects suivants :

  • Analyse des besoins
  • Sélection technique
  • Conception de l'architecture
  • Étapes de mise en œuvre
  1. Analyse des exigences

De manière générale, un système de passerelle doit mettre en œuvre les fonctions suivantes :

  • Routage des demandes et équilibrage de charge
  • Contrôle de sécurité (tel que l'authentification de l'interface et le contrôle d'accès, etc.)
  • Logging
  • Transfert et nouvelle tentative d'interface

Nous utilisons le langage Golang pour implémenter les fonctions ci-dessus afin de garantir l'efficacité et l'efficience du système de passerelle Utilisation maximale des ressources.

  1. Sélection de la technologie

Nous utiliserons les principales piles technologiques suivantes :

  • golang
  • Gin framework
  • Etcd
  • Redis
  • JWT
  1. Conception architecturale

Ce système de passerelle adopte "inverse" Modèle d'architecture "Agent + ETCD + Redis".

Architecture à trois couches :

  • Navigateur, client et autres couches de requêtes.
  • Couche API (c'est-à-dire service back-end)
  • Couche passerelle

Plusieurs serveurs et chaque serveur dispose de plusieurs API Pour un accès simultané élevé, il doit être capable de prendre en charge des nœuds API croissants et décroissants de manière dynamique. Utilisez ETCD (un magasin de valeurs-clés hautement disponible) pour la maintenance de l'état et la découverte des nœuds d'API. Utilisez Redis comme cache de données protobuf pour l'API.

  1. Étapes de mise en œuvre

4.1 Installez golang, Gin et les dépendances associées

Une fois l'installation terminée, ajoutez les dépendances que vous devez utiliser dans le fichier govendor.yaml, comme indiqué ci-dessous :

dependencies:
  - github.com/gin-gonic/gin
  - github.com/coreos/etcd/clientv3
  - github.com/go-redis/redis
  - github.com/dgrijalva/jwt-go

Utilisez la commande go pour exécutez la commande suivante :

go get -u github.com/kardianos/govendor
govendor init
govendor add +external
govendor add github.com/gin-gonic/gin@v1.3.0

4.2 Utilisation de base de gin

Vous pouvez facilement créer un framework HTTP en utilisant gin, comme indiqué ci-dessous :

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}

4.3 Utilisation d'ETCD et Redis

ETCD est un magasin clé-valeur hautement disponible qui peut être utilisé pour la découverte de services et la configuration du partage. Dans Golang, nous utiliserons la bibliothèque clientv3 officiellement fournie pour faire fonctionner etcd.

Redis est une base de données clé-valeur hautes performances Nous utiliserons la bibliothèque go-redis pour utiliser Redis dans Golang.

4.4 Utilisation de JWT

Afin d'assurer la sécurité de l'interface, nous utiliserons JWT pour l'authentification de l'interface. JWT, JSON Web Token, est une méthode standard du Web pour transmettre des informations d'authentification et d'autorisation d'identité. Son principal scénario d'utilisation est l'autorisation et l'authentification des interfaces machine à machine.

4.5 Implémentation de la passerelle

Pour la passerelle elle-même, les principales fonctions incluent le routage des demandes et l'équilibrage de charge, le contrôle de sécurité et la journalisation, etc.

Pour le routage des requêtes et l'équilibrage de charge, nous pouvons utiliser le ReverseProxy du framework Gin pour y parvenir. La découverte de l'état et l'enregistrement de l'API doivent être mis en œuvre via ETCD.

Notre système de passerelle doit prendre en charge plusieurs nœuds API backend et effectuer un équilibrage de charge. L'algorithme d'équilibrage de charge peut utiliser la méthode d'interrogation, la méthode aléatoire, etc. Nous utilisons ici la méthode d'interrogation (RoundRobin) pour la sélection des nœuds.

En termes de contrôle de sécurité, nous pouvons passer JWT dans l'en-tête de la requête pour réaliser l'authentification de l'interface.

Enfin, insérez le journal dans la réponse et renvoyez le résultat de la réponse.

  1. Conclusion

Cet article présente brièvement le processus de création d'un système de passerelle simple utilisant le langage Golang. Ce système de passerelle implémente le routage des requêtes et l'équilibrage de charge à l'aide du framework GIN, implémente la maintenance de l'état et la découverte des nœuds d'API via ETCD, utilise Redis comme cache de données protobuf de l'API, utilise JWT pour l'authentification de l'interface et ajoute enfin une fonction de journalisation. Le système de passerelle construit à l'aide de Golang est léger, efficace, facile à apprendre et à déployer, et convient parfaitement aux scénarios légers.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn