Maison > développement back-end > Golang > Quelles exigences de base les microservices peuvent-ils développer sur la base de la prise en charge de Golang ?

Quelles exigences de base les microservices peuvent-ils développer sur la base de la prise en charge de Golang ?

王林
Libérer: 2023-09-18 12:49:49
original
1259 Les gens l'ont consulté

Quelles exigences de base les microservices peuvent-ils développer sur la base de la prise en charge de Golang ?

Les microservices développés sur la base de Golang peuvent prendre en charge plusieurs exigences de base, notamment une concurrence élevée, une mise à l'échelle élastique, un déploiement distribué, une communication asynchrone et un traitement tolérant aux pannes. Cet article démontrera la mise en œuvre de ces exigences fondamentales dans les microservices Golang à travers des exemples de code détaillés.

Concurrence élevée : 

Le modèle de concurrence de Golang est basé sur les concepts de threads légers (goroutine) et de processus séquentiels communicants (CSP), rendant la programmation simultanée plus simple et plus efficace. Voici un exemple de code permettant d'utiliser goroutine pour obtenir une simultanéité élevée :

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            fmt.Printf("goroutine %d started
", i)
            time.Sleep(1 * time.Second)
            fmt.Printf("goroutine %d finished
", i)
        }(i)
    }

    wg.Wait()
    fmt.Println("All goroutines finished")
}
Copier après la connexion

Le code ci-dessus utilise WaitGroup dans le package de synchronisation pour attendre la fin de toutes les goroutines. En exécutant ce programme, vous pouvez voir que 10 goroutines seront exécutées en même temps et toutes se termineront après 1 seconde.

Mise à l'échelle élastique :

Les microservices de Golang peuvent être mis à l'échelle de manière élastique en fonction des conditions de charge pour répondre à des demandes de différentes tailles. Voici un exemple de code simple :

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
    "os/signal"
    "syscall"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/hello", helloHandler)

    server := &http.Server{
        Addr:    ":8080",
        Handler: router,
    }

    go func() {
        if err := server.ListenAndServe(); err != nil {
            log.Fatal(err)
        }
    }()

    // 监听系统信号,如Ctrl+C
    stop := make(chan os.Signal, 1)
    signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)

    <-stop

    if err := server.Shutdown(nil); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Server gracefully stopped")
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, World!"))
}
Copier après la connexion

Le code ci-dessus utilise la bibliothèque gorilla/mux pour créer un service HTTP simple et écoute les signaux du système pour arrêter le service en douceur. En exécutant le programme, vous pouvez accéder à « http://localhost:8080/hello » dans le navigateur pour afficher les résultats en cours d'exécution.

Déploiement distribué :

Les microservices Golang peuvent facilement mettre en œuvre un déploiement distribué pour répondre aux besoins de plusieurs clusters, de plusieurs centres de données et d'autres scénarios. Voici un exemple de code qui utilise Consul comme centre de découverte et de configuration de service :

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/hashicorp/consul/api"
    "github.com/gorilla/mux"
)

func main() {
    consulConfig := api.DefaultConfig()
    consul, err := api.NewClient(consulConfig)
    if err != nil {
        log.Fatal(err)
    }

    agent := consul.Agent()

    registration := &api.AgentServiceRegistration{
        ID:      "microservice-example",
        Name:    "microservice",
        Address: "localhost",
        Port:    8080,
    }

    if err := agent.ServiceRegister(registration); err != nil {
        log.Fatal(err)
    }

    router := mux.NewRouter()
    router.HandleFunc("/hello", helloHandler)

    server := &http.Server{
        Addr:    ":8080",
        Handler: router,
    }

    go func() {
        if err := server.ListenAndServe(); err != nil {
            log.Fatal(err)
        }
    }()

    fmt.Println("Server started")
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, World!"))
}
Copier après la connexion

Lors du démarrage du service, le code ci-dessus utilise l'API de Consul pour enregistrer le service et enregistre les informations du service, notamment l'ID, le nom, l'adresse et le port. Consul. En exécutant ce programme, vous pouvez afficher les microservices enregistrés dans la liste des services de Consul.

Communication asynchrone :

Dans les microservices Golang, les files d'attente de messages peuvent être utilisées pour mettre en œuvre une communication asynchrone et améliorer la fiabilité et les performances du système. Voici un exemple de code utilisant RabbitMQ comme middleware de message :

package main

import (
    "fmt"
    "log"

    "github.com/streadway/amqp"
)

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }

    channel, err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }

    queue, err := channel.QueueDeclare(
        "hello",
        false,
        false,
        false,
        false,
        nil,
    )
    if err != nil {
        log.Fatal(err)
    }

    body := "Hello, World!"

    err = channel.Publish(
        "",
        queue.Name,
        false,
        false,
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(body),
        },
    )

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Message sent")
}
Copier après la connexion

Le code ci-dessus se connecte à RabbitMQ via la bibliothèque amqp et envoie un message à la file d'attente nommée "hello". En exécutant ce programme, vous pouvez afficher les messages envoyés dans l'interface de gestion RabbitMQ.

Tolérance aux pannes :

La tolérance aux pannes est un aspect important de l'architecture des microservices. Les microservices de Golang peuvent atteindre la tolérance aux pannes en ajoutant un disjoncteur. Voici un exemple de code qui utilise le disjoncteur de la bibliothèque go-kit pour implémenter un traitement tolérant aux pannes :

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/afex/hystrix-go/hystrix"
)

const commandName = "myCommand"

func main() {
    hystrix.ConfigureCommand(commandName, hystrix.CommandConfig{Timeout: 1000})

    for i := 0; i < 10; i++ {
        output := make(chan string, 1)
        hystrix.Go(commandName, func() error {
            // 模拟请求
            time.Sleep(200 * time.Millisecond)
            output <- "success"
            return nil
        }, func(err error) error {
            // 处理断路器打开后的逻辑
            output <- "failure"
            return nil
        })

        select {
        case res := <-output:
            fmt.Printf("Response: %s
", res)
        case <-time.After(time.Second * 1):
            fmt.Println("Timeout")
        }
    }

    // 关闭断路器
    hystrix.Flush()
}
Copier après la connexion

Le code ci-dessus utilise la bibliothèque hystrix pour configurer un disjoncteur nommé "myCommand" et l'exécute via hystrix. Allez fonctionner dans le bloc de code de protection du disjoncteur ci-dessous. Dans le bloc de code, nous simulons une opération qui prend 200 millisecondes et renvoyons le résultat via le canal de sortie. En exécutant ce programme, vous pouvez voir que lorsque le disjoncteur est désactivé, toutes les demandes reçoivent une réponse réussie ; lorsque le disjoncteur est activé, les demandes échouent rapidement et renvoient une erreur.

Cet article présente les principales exigences de la prise en charge des microservices développés sur la base de Golang à travers des exemples de code détaillés, notamment une concurrence élevée, une mise à l'échelle élastique, un déploiement distribué, une communication asynchrone et un traitement tolérant aux pannes. Grâce à ces exemples, les lecteurs peuvent mieux comprendre et appliquer l'architecture des microservices Golang.

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