Maison > développement back-end > Golang > Utiliser le framework Gin pour implémenter des fonctions de déploiement et de gestion conteneurisées

Utiliser le framework Gin pour implémenter des fonctions de déploiement et de gestion conteneurisées

WBOY
Libérer: 2023-06-22 18:58:43
original
915 Les gens l'ont consulté

À l’ère actuelle du cloud computing, la conteneurisation est devenue une méthode très populaire de déploiement et de gestion d’applications. Le framework Gin est un framework Web léger du langage GO. Il présente les caractéristiques de hautes performances, de faible consommation de mémoire et de maintenance facile. Il est donc devenu l'un des frameworks préférés pour le développement Web utilisant le langage GO. Cet article expliquera comment utiliser le framework Gin pour implémenter des fonctions de déploiement et de gestion conteneurisées. Apprenons-en ensemble.

1. Introduction à Docker

Docker est actuellement la technologie de conteneur la plus populaire, qui peut regrouper des applications et leurs dépendances dans des conteneurs afin qu'elles puissent facilement s'exécuter n'importe où. Docker est open source et est devenu de facto la solution de conteneur standard du secteur.

2. Exemple de packaging Docker du framework Gin

Ce qui suit est un exemple simple d'utilisation de Docker pour empaqueter le framework Gin :

  1. Créez et entrez le répertoire d'ingénierie du projet :

mkdir docker-gin && cd docker-gin

  1. Créer un fichier Docker :

FROM golang:1.13

Définir le répertoire de travail

WORKDIR /go/src/app

Installer le framework Gin

RUN aller chercher github.com/gin-gonic/gin

Ajouter tous les fichiers dans le répertoire de travail

ADD ./go/src/app

Exécuter la commande

CMD ["go", "run", "main.go"]

  1. Créez un fichier main.go :

package main

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

func main() {
r := gin.Default()
r.GET("/", func (c *gin.Context) {

c.JSON(200, gin.H{
  "message": "Hello World",
})
Copier après la connexion

})
r.Run(":8080")
}

  1. Construisez l'image et exécutez le conteneur :

docker build -t docker-gin .
docker run -p 8080:8080 docker-gin

Vous pouvez le faire maintenant Accédez à notre application via http://localhost:8080.

Mais après cela, nous écrivons davantage une logique pour atteindre nos objectifs de déploiement et de gestion.

3. Déploiement et gestion de la conteneurisation

Sur la base de l'exemple ci-dessus, nous ajoutons les deux API suivantes pour implémenter les fonctions de déploiement et de gestion de la conteneurisation :

  1. POST /deploy : implémentez la fonction de déploiement de la conteneurisation

en téléchargeant un fichier zip, décompressez et créez une nouvelle image, et enfin déployez ce nouveau conteneur via la planification Kubernetes.

Ce qui suit est une implémentation simplifiée :

func handleDeploy(c *gin.Context) {
file, header, err := c.Request.FormFile("file")
if err != nil {

c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
Copier après la connexion

}
defer file.Close()

// Enregistrez le fichier téléchargé dans le
nom de fichier local := "deploy/" + header.Filename
out, err := os.Create(filename)
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
reporter out.Close()
_, err = io.Copy(out, file)
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}

// Décompresser le fichier téléchargé
zipReader, err := zip. OpenReader(filename)
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
reporter zipReader.Close()
for _, zipFile := range zipReader.File {

srcObj, err := zipFile.Open()
if err != nil {
  c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
  return
}
defer srcObj.Close()

dstPath := "deploy/" + zipFile.Name
if !strings.HasPrefix(dstPath, "deploy/") {
  c.JSON(http.StatusBadRequest, gin.H{"error": "invalid file"})
  return
}
if zipFile.FileInfo().IsDir() {
  os.MkdirAll(dstPath, zipFile.Mode())
} else {
  dstObj, err := os.Create(dstPath)
  if err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
    return
  }
  defer dstObj.Close()

  _, err = io.Copy(dstObj, srcObj)
  if err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
    return
  }
}
Copier après la connexion

}

// Créer une nouvelle image et appeler le déploiement de Kubernetes
cmd: = exec.Command("bash", "-c", "docker build -t docker-gin-"+strconv.FormatInt(time.Now().Unix(), 10)+" . && kubectl apply -f déployer .yml")
cmd.Dir = "./deploy"
out, err = cmd.CombinedOutput()
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
c.JSON(http.StatusOK, gin.H {"message ": string(out)})
}

  1. DELETE /stop : ferme le conteneur actuel

Ce qui suit est une implémentation simplifiée :

func handleStop(c *gin.Context) {
// Get l'ID du conteneur actuel
nom d'hôte, err := os.Hostname()
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
cmd := exec.Command("bash", "-c", "kubectl get pod -o jsonpath ='{.items [0].metadata.name}'")
cmdOutput, err := cmd.Output()
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
podName := strings.TrimSpace(string(cmdOutput) )

// Fermez le conteneur actuel
cmd = exec.Command("bash", "-c", "kubectl delete pod "+podName)
cmdOutput, err = cmd.CombinedOutput()
if err != nil {

c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
c .JSON(http.StatusOK, gin.H{"message": string(cmdOutput)})
}

L'implémentation des deux API ci-dessus est basée sur Kubernetes pour la gestion des conteneurs. ne sera pas présenté en détail ici.

4. Résumé

Cet article explique comment utiliser Docker pour encapsuler le framework Gin et implémenter des fonctions de déploiement et de gestion conteneurisées. En pratique, nous pouvons mettre en œuvre des implémentations plus détaillées basées sur les besoins réels. Voici juste un exemple simple. En bref, l'utilisation de la technologie de conteneurisation pour le déploiement et la gestion des applications peut améliorer l'efficacité du développement, éviter les problèmes de configuration de l'environnement et réduire les difficultés d'exploitation et de maintenance.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal