ホームページ バックエンド開発 Golang go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

Nov 26, 2019 pm 01:19 PM
go フレーム

go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

プロジェクトの設立から開発、発売に至るまでの、製品に関わる小さなプロジェクトは、時間と需要が急増するにつれてますます複雑になり、大規模なプロジェクトに変わります。初期のプロジェクト アーキテクチャが適切に設計されていない場合、コードはますます肥大化して保守が困難になり、その後の製品の反復ごとにシステム全体に影響を及ぼします。

マイクロサービスベースのプロジェクトとモジュール間の疎結合関係は良い選択であり、メンテナンスコストは増加しますが、それでも価値があります。

go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

マイクロサービス プロジェクトの安定性に加えて、私はいくつかの問題についても個人的に懸念しています:

1: サービス間のデータ送信の効率とセキュリティ。

2: サービスの動的な拡張、つまりサービスの登録と検出、およびサービスのクラスタリング。

3: マイクロサービス機能はカスタマイズ可能ですが、すべての機能がニーズを満たすわけではないため、必要に応じていくつかの機能を開発する必要があります。

go-micro は、go 言語 での優れた RPC マイクロサービス フレームワークです。完璧な機能を備えており、私が懸念していたいくつかの問題も解決しています。

1:サービス間の送信形式は protobuf であり、非常に効率的で高速かつ安全です。

2: go-micro のサービスの登録と検出は多様です。個人的には etcdv3 のサービス検出と登録の方が好きです。

3: 主要な機能には対応するインターフェイスがあり、対応するインターフェイスが実装されていれば、必要に応じてプラグインをカスタマイズできます。

暇なときに go-micro のソースコードを体系的に読みましたが、読めば読むほどこのフレームワークはよくできていると感じ、多くのことを学びました。一連の投稿をまとめて、go-micro を学習した私の経験を皆さんと共有したいと思っています。

go-micro の通信プロセスは次のとおりです。

go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

サーバーはクライアントの呼び出しを監視し、Brocker によってプッシュされた情報を処理します。そして、サーバーは、クライアントがそのステータスを知ることができるように、その存在または終了を Register に登録する必要があります。

サービス登録の検出を登録します。

クライアントはRegisterからServer情報を取得し、呼び出しごとのアルゴリズムに基づいて通信するServerを選択しますが、当然ながら通信にはエンコード/デコードや伝送プロトコルの選択などの一連の処理が必要です。

すべてのサーバーに通知する必要がある場合は、Brocker を使用して情報をプッシュできます。

ブロッカー情報キューは情報を受信して​​公開します。

go-micro が高度にカスタマイズできる理由は、そのフレームワーク構造と切り離すことができません。go-micro は 8 つの主要なインターフェイスで構成されています。各インターフェイスは、独自のニーズに応じて再実装できます。この 8 つの主要なインターフェイスgo-micro のフレームワーク構造も構成します。

go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

これらのインターフェイス go-micir には独自のデフォルト実装があり、これらのインターフェイスの実装の代替となる go-plugins もあります。ニーズに応じて独自のプラグインを実装することもできます。

go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

この記事では、主に go-micro の主な構造とこれらのインターフェイスの機能を紹介します。具体的な詳細については、今後の記事で説明します。

#Transort#サービス間の通信のためのインターフェイス。つまり、サービスの送受信の最終的な実装は、これらのインターフェイスによってカスタマイズされます。

ソース コード:

type Socket interface {
    Recv(*Message) error
    Send(*Message) error
    Close() error
}

type Client interface {
    Socket
}

type Listener interface {
    Addr() string
    Close() error
    Accept(func(Socket)) error
}

type Transport interface {
    Dial(addr string, opts ...DialOption) (Client, error)
    Listen(addr string, opts ...ListenOption) (Listener, error)
    String() string
}
ログイン後にコピー

Transport の Listen メソッドは通常、サーバーによって呼び出され、ポートをリッスンしてクライアントからの呼び出しを待ちます。

Transport の Dial は、クライアントがサービスに接続するために使用する方法です。これは、クライアント インターフェイスを返し、クライアント インターフェイスはクライアント インターフェイスを返します。このクライアントはソケット インターフェイスに組み込まれており、このインターフェイスのメソッドは、具体的には通信情報の送受信を行うためのものです。

http 送信は、go-micro のデフォルトの同期通信メカニズムです。もちろん、他にも grpc、nats、tcp、udp、rabbitmq、nats などのプラグインが多数あり、これらはすべてこれまでに実装されています。 go-plugins で見つけることができます。

Codec

送信方法に関して、次に解決すべきは送信のエンコードとデコードの問題です。go-micro には多くのエンコードとデコードの方法があります。デフォルトの実装もちろんprotobufですが、json、protobuf、jsonrpc、mercuryなど他の実装方法もあります。

ソース コード

type Codec interface {
    ReadHeader(*Message, MessageType) error
    ReadBody(interface{}) error
    Write(*Message, interface{}) error
    Close() error
    String() string
}

type Message struct {
    Id     uint64
    Type   MessageType
    Target string
    Method string
    Error  string
    Header map[string]string
}
ログイン後にコピー

Codec インターフェイスの Write メソッドはエンコード プロセスであり、2 つの Read はデコード プロセスです。

レジストリ

サービスの登録と検出、現在実装されている consul、mdns、etcd、etcdv3、zookeeper、kubernetes など、

type Registry interface {
    Register(*Service, ...RegisterOption) error
    Deregister(*Service) error
    GetService(string) ([]*Service, error)
    ListServices() ([]*Service, error)
    Watch(...WatchOption) (Watcher, error)
    String() string
    Options() Options
}
ログイン後にコピー

に簡単に言うと、サービスが登録され、クライアントは監視のために watch メソッドを使用します。サービスが追加または削除されると、このメソッドがトリガーされて、クライアントにサービス情報の更新を通知します。

デフォルトのサービス登録と検出は consul ですが、consul クラスターを直接使用できないため、個人的にはお勧めしません。

go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介

我个人比较喜欢etcdv3集群。大家可以根据自己的喜好选择。

Selector

以Registry为基础,Selector 是客户端级别的负载均衡,当有客户端向服务发送请求时, selector根据不同的算法从Registery中的主机列表,得到可用的Service节点,进行通信。目前实现的有循环算法和随机算法,默认的是随机算法。

源码:

type Selector interface {
    Init(opts ...Option) error
    Options() Options
    // Select returns a function which should return the next node
    Select(service string, opts ...SelectOption) (Next, error)
    // Mark sets the success/error against a node
    Mark(service string, node *registry.Node, err error)
    // Reset returns state back to zero for a service
    Reset(service string)
    // Close renders the selector unusable
    Close() error
    // Name of the selector
    String() string
}
ログイン後にコピー

默认的是实现是本地缓存,当前实现的有blacklist,label,named等方式。

 Broker

Broker是消息发布和订阅的接口。很简单的一个例子,因为服务的节点是不固定的,如果有需要修改所有服务行为的需求,可以使服务订阅某个主题,当有信息发布时,所有的监听服务都会收到信息,根据你的需要做相应的行为。

源码

type Broker interface {
    Options() Options
    Address() string
    Connect() error
    Disconnect() error
    Init(...Option) error
    Publish(string, *Message, ...PublishOption) error
    Subscribe(string, Handler, ...SubscribeOption) (Subscriber, error)
    String() string
}
ログイン後にコピー

Broker默认的实现方式是http方式,但是这种方式不要在生产环境用。go-plugins里有很多成熟的消息队列实现方式,有kafka、nsq、rabbitmq、redis,等等。

 Client

Client是请求服务的接口,他封装Transport和Codec进行rpc调用,也封装了Brocker进行信息的发布。

源码

type Client interface {
    Init(...Option) error
    Options() Options
    NewMessage(topic string, msg interface{}, opts ...MessageOption) Message
    NewRequest(service, method string, req interface{}, reqOpts ...RequestOption) Request
    Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error
    Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error)
    Publish(ctx context.Context, msg Message, opts ...PublishOption) error
    String() string
}
ログイン後にコピー

当然他也支持双工通信 Stream 这些具体的实现方式和使用方式,以后会详细解说。

默认的是rpc实现方式,他还有grpc和http方式,在go-plugins里可以找到

Server

Server看名字大家也知道是做什么的了。监听等待rpc请求。监听broker的订阅信息,等待信息队列的推送等。

源码 

type Server interface {
    Options() Options
    Init(...Option) error
    Handle(Handler) error
    NewHandler(interface{}, ...HandlerOption) Handler
    NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber
    Subscribe(Subscriber) error
    Register() error
    Deregister() error
    Start() error
    Stop() error
    String() string
}
ログイン後にコピー

 默认的是rpc实现方式,他还有grpc和http方式,在go-plugins里可以找到

Service

Service是Client和Server的封装,他包含了一系列的方法使用初始值去初始化Service和Client,使我们可以很简单的创建一个rpc服务。

源码:

type Service interface {
    Init(...Option)
    Options() Options
    Client() client.Client
    Server() server.Server
    Run() error
    String() string
}
ログイン後にコピー

以上がgo マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java フレームワークの商用サポートの費用対効果を評価する方法 Java フレームワークの商用サポートの費用対効果を評価する方法 Jun 05, 2024 pm 05:25 PM

Java フレームワークの商用サポートのコスト/パフォーマンスを評価するには、次の手順が必要です。 必要な保証レベルとサービス レベル アグリーメント (SLA) 保証を決定します。研究サポートチームの経験と専門知識。アップグレード、トラブルシューティング、パフォーマンスの最適化などの追加サービスを検討してください。ビジネス サポートのコストと、リスクの軽減と効率の向上を比較検討します。

PHP フレームワークの軽量オプションはアプリケーションのパフォーマンスにどのような影響を与えますか? PHP フレームワークの軽量オプションはアプリケーションのパフォーマンスにどのような影響を与えますか? Jun 06, 2024 am 10:53 AM

軽量の PHP フレームワークは、サイズが小さくリソース消費が少ないため、アプリケーションのパフォーマンスが向上します。その特徴には、小型、高速起動、低メモリ使用量、改善された応答速度とスループット、および削減されたリソース消費が含まれます。 実際のケース: SlimFramework は、わずか 500 KB、高い応答性と高スループットの REST API を作成します。

PHP フレームワークの学習曲線は他の言語フレームワークと比較してどうですか? PHP フレームワークの学習曲線は他の言語フレームワークと比較してどうですか? Jun 06, 2024 pm 12:41 PM

PHP フレームワークの学習曲線は、言語熟練度、フレームワークの複雑さ、ドキュメントの品質、コミュニティのサポートによって異なります。 PHP フレームワークの学習曲線は、Python フレームワークと比較すると高く、Ruby フレームワークと比較すると低くなります。 Java フレームワークと比較すると、PHP フレームワークの学習曲線は中程度ですが、開始までの時間は短くなります。

Golang 単体テストのアサーションに gomega を使用するにはどうすればよいですか? Golang 単体テストのアサーションに gomega を使用するにはどうすればよいですか? Jun 05, 2024 pm 10:48 PM

Golang 単体テストでアサーションに Gomega を使用する方法 Golang 単体テストでは、Gomega は、開発者がテスト結果を簡単に検証できるように、豊富なアサーション メソッドを提供する人気のある強力なアサーション ライブラリです。 Gomegagoget-agithub.com/onsi/gomega をインストールする アサーションに Gomega を使用する アサーションに Gomega を使用する一般的な例をいくつか示します。 1. 等価アサーション import "github.com/onsi/gomega" funcTest_MyFunction(t*testing.T){

Go WebSocket はどのようにデータベースと統合しますか? Go WebSocket はどのようにデータベースと統合しますか? Jun 05, 2024 pm 03:18 PM

GoWebSocket をデータベースと統合する方法: データベース接続をセットアップする: データベースに接続するには、database/sql パッケージを使用します。 WebSocket メッセージをデータベースに保存する: INSERT ステートメントを使用して、メッセージをデータベースに挿入します。データベースから WebSocket メッセージを取得する: データベースからメッセージを取得するには、SELECT ステートメントを使用します。

さまざまなアプリケーションシナリオに最適な Golang フレームワークを選択する方法 さまざまなアプリケーションシナリオに最適な Golang フレームワークを選択する方法 Jun 05, 2024 pm 04:05 PM

アプリケーションのシナリオに基づいて最適な Go フレームワークを選択します。アプリケーションの種類、言語機能、パフォーマンス要件、エコシステムを考慮します。一般的な Go フレームワーク: Jin (Web アプリケーション)、Echo (Web サービス)、Fiber (高スループット)、gorm (ORM)、fasthttp (速度)。実際のケース: REST API (Fiber) の構築とデータベース (gorm) との対話。フレームワークを選択します。主要なパフォーマンスには fasthttp、柔軟な Web アプリケーションには Jin/Echo、データベース インタラクションには gorm を選択してください。

Golang フレームワークの学習プロセスでよくある誤解は何ですか? Golang フレームワークの学習プロセスでよくある誤解は何ですか? Jun 05, 2024 pm 09:59 PM

Go フレームワークの学習には、フレームワークへの過度の依存と柔軟性の制限という 5 つの誤解があります。フレームワークの規則に従わない場合、コードの保守が困難になります。古いライブラリを使用すると、セキュリティと互換性の問題が発生する可能性があります。パッケージを過度に使用すると、コード構造が難読化されます。エラー処理を無視すると、予期しない動作やクラッシュが発生します。

Java フレームワーク学習ロードマップ: さまざまな分野のベスト プラクティス Java フレームワーク学習ロードマップ: さまざまな分野のベスト プラクティス Jun 05, 2024 pm 08:53 PM

さまざまな分野の Java フレームワーク学習ロードマップ: Web 開発: SpringBoot と PlayFramework。永続層: Hibernate と JPA。サーバー側のリアクティブ プログラミング: ReactorCore と SpringWebFlux。リアルタイム コンピューティング: ApacheStorm および ApacheSpark。クラウド コンピューティング: AWS SDK for Java および Google Cloud Java。

See all articles