go マイクロサービス フレームワーク go-micro の全体的なアーキテクチャの紹介
プロジェクトの設立から開発、発売に至るまでの、製品に関わる小さなプロジェクトは、時間と需要が急増するにつれてますます複雑になり、大規模なプロジェクトに変わります。初期のプロジェクト アーキテクチャが適切に設計されていない場合、コードはますます肥大化して保守が困難になり、その後の製品の反復ごとにシステム全体に影響を及ぼします。
マイクロサービスベースのプロジェクトとモジュール間の疎結合関係は良い選択であり、メンテナンスコストは増加しますが、それでも価値があります。
マイクロサービス プロジェクトの安定性に加えて、私はいくつかの問題についても個人的に懸念しています:
1: サービス間のデータ送信の効率とセキュリティ。
2: サービスの動的な拡張、つまりサービスの登録と検出、およびサービスのクラスタリング。
3: マイクロサービス機能はカスタマイズ可能ですが、すべての機能がニーズを満たすわけではないため、必要に応じていくつかの機能を開発する必要があります。
go-micro は、go 言語 での優れた RPC マイクロサービス フレームワークです。完璧な機能を備えており、私が懸念していたいくつかの問題も解決しています。
1:サービス間の送信形式は protobuf であり、非常に効率的で高速かつ安全です。
2: go-micro のサービスの登録と検出は多様です。個人的には etcdv3 のサービス検出と登録の方が好きです。
3: 主要な機能には対応するインターフェイスがあり、対応するインターフェイスが実装されていれば、必要に応じてプラグインをカスタマイズできます。
暇なときに go-micro のソースコードを体系的に読みましたが、読めば読むほどこのフレームワークはよくできていると感じ、多くのことを学びました。一連の投稿をまとめて、go-micro を学習した私の経験を皆さんと共有したいと思っています。
go-micro の通信プロセスは次のとおりです。
サーバーはクライアントの呼び出しを監視し、Brocker によってプッシュされた情報を処理します。そして、サーバーは、クライアントがそのステータスを知ることができるように、その存在または終了を Register に登録する必要があります。
サービス登録の検出を登録します。
クライアントはRegisterからServer情報を取得し、呼び出しごとのアルゴリズムに基づいて通信するServerを選択しますが、当然ながら通信にはエンコード/デコードや伝送プロトコルの選択などの一連の処理が必要です。
すべてのサーバーに通知する必要がある場合は、Brocker を使用して情報をプッシュできます。
ブロッカー情報キューは情報を受信して公開します。
go-micro が高度にカスタマイズできる理由は、そのフレームワーク構造と切り離すことができません。go-micro は 8 つの主要なインターフェイスで構成されています。各インターフェイスは、独自のニーズに応じて再実装できます。この 8 つの主要なインターフェイスgo-micro のフレームワーク構造も構成します。
これらのインターフェイス go-micir には独自のデフォルト実装があり、これらのインターフェイスの実装の代替となる go-plugins もあります。ニーズに応じて独自のプラグインを実装することもできます。
この記事では、主に 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 クラスターを直接使用できないため、個人的にはお勧めしません。
我个人比较喜欢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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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