ホームページ > バックエンド開発 > Golang > Zookeeper と Dubbo を使用して Beego に分散サービス ガバナンスを実装する

Zookeeper と Dubbo を使用して Beego に分散サービス ガバナンスを実装する

王林
リリース: 2023-06-22 08:43:50
オリジナル
1267 人が閲覧しました

インターネット ビジネスの継続的な発展に伴い、単一のサービス ノードではもはや高い同時実行性と高可用性のニーズを満たすことができなくなりました。したがって、分散アーキテクチャは現代の開発手法となり、習得しなければならないテクノロジーの 1 つとなっています。

分散アーキテクチャでは、サービス ガバナンスは複雑かつ重要な問題です。サービスの高可用性、品質、パフォーマンスを保証するために、サービス ガバナンスはサービスの登録、検出、負荷分散、フェイルオーバー、監視などの複数の機能を実装する必要があります。 Zookeeper と Dubbo は分散サービス ガバナンスのリーダーであり、連携してサービス ガバナンスのプロセス全体を実現できます。

この記事では、Zookeeper と Dubbo を使用して、Beego フレームワークに分散サービス ガバナンスを実装する方法を紹介します。

1. Zookeeper

Zookeeper はオープンソースの分散調整サービスで、元々は Yahoo によって開発され、現在では Apache のトップレベル プロジェクトとなっています。多数のノードを管理し、それらを調整、同期、監視して、高可用性とサービス検出機能を実現できます。

  1. Zookeeper のインストールと起動

まず、Zookeeper の公式 Web サイト https://zookeeper.apache.org/ から Zookeeper の安定バージョンをダウンロードする必要があります。解凍して、zoo.cfg ファイルを設定します。 Zookeeper をスタンドアロン モードで起動するには、zoo.cfg ファイルに設定の行を追加するだけです:

server.1=localhost:2888:3888
ログイン後にコピー

このうち、1 は Zookeeper クラスター内の番号を表し、localhost:2888:3888 は表します。 IP、ポート、および Zookeeper ノードによって監視されるポート 選択ポート。

次に、次のコマンドを実行して Zookeeper を起動します:

./zkServer.sh start
ログイン後にコピー

次のコマンドを使用して、Zookeeper が正常に起動したかどうかを確認できます:

echo ruok | nc localhost 2181
ログイン後にコピー

Zookeeper が正常に実行されている場合は、起動が成功したことを示す「imok」が返されます。

  1. Zookeeper の操作に ZkGo を使用する

Go 言語では複数の Zookeeper ライブラリから選択できますが、その中でより人気があり安定しているのは ZkGo です。 ZkGo を使用すると、Zookeeper への接続、ノードの作成、ノードの変更の監視などが簡単に行えます。

Go 言語の Beego フレームワークで ZkGo を使用するには、最初に ZkGo 依存関係をインストールする必要があります:

go get github.com/samuel/go-zookeeper/zk
ログイン後にコピー

その後、コード内で Zookeeper ノードを操作できます。例:

package main

import (
    "fmt"
    "time"
    "github.com/samuel/go-zookeeper/zk"
)

func main() {
    // 连接Zookeeper服务器
    conn, _, err := zk.Connect([]string{"localhost:2181"}, time.Second*5)
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    // 创建一个节点
    path, err := conn.Create("/test", []byte("hello world"), 0, zk.WorldACL(zk.PermAll))
    if err != nil {
        panic(err)
    }
    fmt.Println("Created znode:", path)

    // 获取该节点的值
    data, _, err := conn.Get(path)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Get znode %s: %s
", path, data)

    // 删除该节点
    err = conn.Delete(path, -1)
    if err != nil {
        panic(err)
    }
    fmt.Println("Deleted znode:", path)
}
ログイン後にコピー

In 上記の例では、まず zk.Connect メソッドを通じて Zookeeper サーバーに接続し、次に zk.Create メソッドを使用して「」という名前のノードを作成します。 /test」を実行し、ノードデータとして「hello world」の文字列を追加します。次に、zk.Get メソッドを使用して「/test」ノードのデータを取得し、zk.Delete メソッドを使用してノードを削除します。

2. Dubbo

Dubbo は、高性能分散サービス フレームワークであり、Alibaba のオープンソース プロジェクトの 1 つです。 Dubbo は、サービス登録、検出、負荷分散、フェイルオーバーなどの複数の機能を提供し、複数の RPC 通信プロトコルをサポートします。

  1. Dubbo のインストールと起動

まず、Dubbo フレームワークをダウンロードする必要があります。公式 Web サイトは https://github.com/apache/dubbo-go です。解凍後、 dubbo /go-server/demo ディレクトリに入り、次のコマンドを使用して Dubbo を起動します。

go run main.go
ログイン後にコピー

起動後、Dubbo の Web 管理コンソールを通じて Dubbo の実行ステータスを表示できます。

  1. Dubbo を使用してサービスの登録と呼び出しを行う

Beego フレームワークと Dubbo を統合するには、次のコマンドでインストールできる DubboGo SDK の使用が必要です。

go get github.com/apache/dubbo-go
ログイン後にコピー

DubboGo を使用する SDK は、Dubbo が提供する RPC サービスに簡単にアクセスできます。 Beego フレームワークでは、次のコードを通じて Dubbo によって提供されるサービスを登録して呼び出すことができます:

import (
    "github.com/apache/dubbo-go/config"
    "github.com/apache/dubbo-go/registry"
)

// 注册Dubbo服务
func RegisterDubboService() {
    // 配置Dubbo服务注册中心
    config.GetApplicationConfig().Name = "my-application"
    config.GetProviderConfig().Registry = registry.NewZookeeperRegistry("127.0.0.1:2181")
    // 注册服务
    err := config.RegisterProvider(
        &config.ServiceConfig{
            InterfaceName: "org.apache.dubbo.DemoService",
            Protocol:      "dubbo",
            Ip:            "127.0.0.1",
            Port:          20880,
            MethodConfigs: []*config.MethodConfig{
                &config.MethodConfig{
                    Name: "SayHello",
                },
            },
            Registry: config.GetProviderConfig().Registry,
        },
        new(DemoServiceImpl),
    )
    if err != nil {
        panic(err)
    }
}

// 调用Dubbo服务
func CallDubboService() {
    // 配置Dubbo服务发现中心
    config.GetConsumerConfig().Registry = registry.NewZookeeperRegistry("127.0.0.1:2181")
    // 调用服务
    reference, err := config.NewReference(&config.ReferenceConfig{
        InterfaceName: "org.apache.dubbo.DemoService",
        Urls:          []string{"dubbo://127.0.0.1:20880/org.apache.dubbo.DemoService"},
        Registry:      config.GetConsumerConfig().Registry,
    })
    if err != nil {
        panic(err)
    }
    demoService := reference.(*DemoService)
    res, err := demoService.SayHello("Dubbo")
    if err != nil {
        panic(err)
    }
    fmt.Println(res)
}
ログイン後にコピー

上記のコードでは、最初に DubboGo SDK を使用してサービスを登録し、次に DubboGo SDK を使用してサービスを呼び出します。 。サービスを登録するときは、まず Dubbo サービス登録センターを構成し、次にサービスのインターフェイス名、プロトコル、IP アドレス、ポート、メソッド構成、およびその他の情報を定義する必要があります。サービスを呼び出すときは、Dubbo サービス検出センターを構成し、Dubbo によって提供されるサービス URL とインターフェイス名を使用して Dubbo サービス参照を作成する必要があります。

3. Zookeeper と Dubbo の統合

Zookeeper と Dubbo を Beego フレームワークに統合するには、まず Dubbo サービスを登録し、次に Dubbo によって提供されるサービス URL を使用して Dubbo を登録する必要があります。 Zookeeper のノード。これは、次のコードで実現できます。

import (
    "github.com/apache/dubbo-go/config"
    "github.com/apache/dubbo-go/registry"
    "github.com/samuel/go-zookeeper/zk"
)

// 集成Zookeeper和Dubbo
func IntegrateZkDubbo() {
    // 配置Dubbo服务注册中心
    config.GetApplicationConfig().Name = "my-application"
    config.GetProviderConfig().Registry = registry.NewZookeeperRegistry("127.0.0.1:2181")

    // 注册Dubbo服务
    err := config.RegisterProvider(
        &config.ServiceConfig{
            InterfaceName: "org.apache.dubbo.DemoService",
            Protocol:      "dubbo",
            Ip:            "127.0.0.1",
            Port:          20880,
            MethodConfigs: []*config.MethodConfig{
                &config.MethodConfig{
                    Name: "SayHello",
                },
            },
            Registry: config.GetProviderConfig().Registry,
        },
        new(DemoServiceImpl),
    )
    if err != nil {
        panic(err)
    }

    // 将Dubbo服务URL注册到Zookeeper
    conn, _, err := zk.Connect([]string{"localhost:2181"}, time.Second*5)
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    serviceURL := fmt.Sprintf("dubbo://127.0.0.1:20880/org.apache.dubbo.DemoService?anyhost=true&application=my-application&dubbo=2.0.2&generic=false&interface=org.apache.dubbo.DemoService&loadbalance=random&methods=SayHello&pid=1&side=provider&timeout=1000000")
    _, err = conn.Create("/dubbo/org.apache.dubbo.DemoService/providers/"+serviceURL, nil, zk.FlagEphemeral, zk.WorldACL(zk.PermAll))
    if err != nil {
        panic(err)
    }
}
ログイン後にコピー

上記のコードでは、最初に DubboGo SDK を使用してサービスを登録し、次に Dubbo サービス URL を取得して、Dubbo サービス URL 情報を Zookeeper に登録します。まず zk.Connect メソッドを使用して Zookeeper サーバーに接続し、次に zk.Create メソッドを使用して「/dubbo/org.apache.dubbo.DemoService」という名前のサービス URL を作成します。 Zookeeper ノードの /providers/service URL"。ノード データは空で、ノード タイプは zk.FlagEphemeral で、これが一時ノードであることを示します。ノードが正常に作成されると、Dubbo サービスが Zookeeper に登録されます。

4. テスト

Beego フレームワークを使用して Zookeeper と Dubbo を統合した後、HTTP リクエストを通じて Dubbo サービスをテストし、サービス ガバナンス機能の実装を検証できます。 Postman などの HTTP ツールを使用して、Dubbo サービス URL を使用して HTTP 要求ヘッダーを構築し、メッセージ本文に要求パラメータを追加して Dubbo サービス呼び出しを開始できます。たとえば、Dubbo サービスの URL が次のとおりであるとします。

dubbo://127.0.0.1:20880/org.apache.dubbo.DemoService?anyhost=true&application=my-application&dubbo=2.0.2&generic=false&interface=org.apache.dubbo.DemoService&loadbalance=random&methods=SayHello&pid=1&side=provider&timeout=1000000
ログイン後にコピー

Postman を使用して Dubbo サービス呼び出しをシミュレートする場合、HTTP リクエスト本文に次のパラメーターを追加できます (Content-Type は application/json)。 ##

{
    "methodName": "SayHello",
    "parameterTypes": [
        "java.lang.String"
    ],
    "arguments": [
        "Dubbo"
    ]
}
ログイン後にコピー
HTTP リクエストを送信すると、サービスの呼び出し結果を取得できます。

要約

分散サービス ガバナンスは複雑かつ重要な問題です。Zookeeper と Dubbo を Beego フレームワークに統合することで、サービスの登録、検出、負荷分散、フェイルオーバーなどの機能を実現し、分散システムの信頼性と高可用性を向上させることができます。強力な保護を提供します。この記事で提供されているコード例を学習して使用し、分散サービス ガバナンスのコア テクノロジを習得し、実際のプロジェクトに適用することができます。

以上がZookeeper と Dubbo を使用して Beego に分散サービス ガバナンスを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート