要約バックエンドGolang-

値によって渡されるポインタは、構造は、特に、ポインタ渡されたパケットと同期する場合、軽量で、いくつかのデータは、その値を変更しない値を使用して転送することができ、
反射を避けるため、高性能使用して反射を除去するためのサービス
sync.Poolを用いたマルチ多重


オンライン最適化問題:
一括読み込みと書き込み、主な問題:CPU占有率は、アプリケーションによって引き起こされる大量のリソースを解放する主な原因は高すぎます。

溶液:使用"sync.Pool"、オブジェクトのプールを実装
P:= {sync.Pool
新:新しい新しいBUFF()
}
。P.Get()(* BUFF)
p.Put(buff.clean())


さらにゴルーチン同時読み取りを使用して書きます。

ピークPCT99サービスは、15msのに100msのから減少します。

 

 

 


マイクロサービス、各サービスは、独自のデータベース、マイクロサービス部門を持っている:メンバーシップ認証モジュール、コメントモジュール、およびその他のモジュールは、親指。

gRPCは、HTTP / 2プロトコルを使用して、GoogleのRPCリーディングフレームによって開発され、配列いるProtobufツールとして使用します。

重要:
集中管理設定
サービス発見
ジャーナル
探索する分散型
ヒューズ
ロードバランシング
エッジ
監視
安全性を

 

サービスの登録と発見、API GATEWAY、REST API、メッセージセンター、RPCのAPI、つまり、外部サービスRESTfulなJSONの使用であり、内部使用のいるProtobuf

 

センターの構成:etcd


サービス検出:APIサービスのIPアドレスを知るために、ゲートウェイに到達するための要求は数であり、生産の練習では、2つの主要なサービス発見メカニズムがあります。クライアントの発見とサーバー検出。
クライアントは、見つかった:
測定(自己登録ハートビートモード)の設定登録されたクライアントサービスに例えば3つの例を、利用可能なサービスのデータベースであるサービス登録フォームにアクセスすることができるサービス、およびクライアントは、ロードバランシングアルゴリズムを(使用します一貫したハッシング)、利用可能なサービスインスタンスを選択し、要求を開始します。
またetcd使用

 

HTTP、grpc様々な伝送を使用することができるキットのパッケージを行く;分散探る:並列計算分割ルールと、ログ:GRPCまたは凝集カフカ;統計:各メソッドの接続数、GCの四分位など;


ヒューズ:hystrixのキットを行く、主に含まれています:1.要求のタイムアウトを、同時要求の2.最大許容数、要求を起動する3.どのくらいの頻度で吹きオープンの試み。


ロードバランシング:3台のマシンへのサービスコードとの分散処理は、すべての要求は、サーバーの負荷分散を進めました


ネットワーク伝送3層構造:
HTTPパケット:WWW ... GET
TCPパケットを:送信元アドレス:3345(クライアント)、デスティネーション:80(SLB)
IPパケット:ソースアドレス:IP-クライアント、目的To:IP-サーバロードバランシング

サーバーの負荷分散では、TCPポートは、IPアドレスは、宛先都市RS1サービスのアドレスを変更します。


7階建ての構造は3、プラスURL、ブラウザと言語の基礎となっている。
しかし、問題がある:ショート要求は、しかし、応答は、HTMLファイルを返し、ロードバランサが唯一の要求に対処しましょう、各サーバーように直接クライアントへの応答。


ソリューション:
(115.39.19.22に示すように)まず、すべてのサーバーの同じIPを持って、我々はVIPバーに彼を呼びました。

ネットワーク伝送4層構造:
イーサネットフレーム:送信元アドレス:11:27:F5 ..先:???
HTTPパケット:GETのWWW ...
TCPパケット:送信元アドレス:3345(クライアント)の目的VIP 80:への
IPパケット:送信元アドレス:IP-クライアント、送信先:115.39.19.22 VIP


放送115.39.19.22 VIPが出て行くと、自身のMACアドレスを元に戻します。このIPマシンを持っているだろうARPプロトコルを使用してください。


このような要求を配っすることができ、VIPをクライアントに直接応答することができるようになります。

 

 

 

 

 

 

TCPは説明:
今、代表的なモデル、非ブロック+ I / Oの多重化を。
移動して、ソケットが非ブロックであり、個人的にちょうどソケットは各ゴルーチン対応する接続するために「ブロックI / O」方法で処理することができ、治療、記述子コールバックが登録されたファイルする必要がないかどうかを開発者が心配する必要はありません。


リットル、ERR:= net.Listen( "TCP"、 ":8888")//サーバは、このポートを監視します

{ために
C、ERR:l.Acceptは=()//ここで読むフラグに待機遮断相当します;
}

処理後handleConn(C)//が接続取りに行きます

 

TCPソケット接続は、クライアントとサーバのプロセスを経るための3ウェイハンドシェイクを確立します。接続の確立は、サーバが標準受け入れる+聞いた構造です。

//クライアントが接続しようとする:
CONN、ERR:= net.DialTimeout( "TCP"、 ":8080"、2 * time.Second)

ハンドシェーク中に以下のことを経験します:
1.ネットワーク到達不能または他のサービスが開始されていません。すぐにエラーを返します。

2.サーバー側は、バックログキューがいっぱいになっている聞きます。

3.ネットワークの遅延が大きい場合、ダイヤルタイムアウトをブロック

 

CONN接続後、読み取りおよび書き込みするために使用することができ、conn.Read()、conn.Write()
TCPは、全二重通信で各方向の独立したデータバッファでそう。送信者がバッファの他の側面を受け取り、自身の送信バッファがいっぱいになると、書き込みがブロックされます。
読み込みと書き込みは、完全な書き込みロック、安全、そして読むためにロックをフルに活用しています。

 

 

 

 

 

 

 

 

 

RPCについて説明します。

追加のネットワークトラフィック関連する書き込みせずに別のコンピュータ上で直接発信者を許可する、UDPまたはTCP、またはHTTP上に構築されたRPC(リモートProcedureCall、リモートプロシージャコール)、呼び出し元のプロシージャのコード。

用途:
RPCサーバーでは、オブジェクトは、オブジェクトの開示された方法は、リモート道へのアクセスを提供することができるようになります後にアクセス可能なサービスとして登録することができます。RPCサーバーは、異なるタイプの複数のオブジェクトを登録することができますが、同じタイプの複数のオブジェクトの登録を許可していません。

FUNC(T *のT)のMethodName( argType T1、replyType * T2)は誤差
クライアントRPCパラメータによって渡される最初のパラメータは、RPCクライアントに結果を返すための第2のパラメータは、この方法は、最後のエラータイプAを返します値。

同期クライアントのコールへのRPCコール()、; RPCクライアントは、ゴー()、非同期呼び出します。

RPCの輸送時に使用されるどのようなコーデックを指定しない場合は、Goがデフォルトの標準ライブラリのエンコード/ゴブパケットデータ伝送を使用します。ゴブは、言語のみのために行くバイナリデータストリームをエンコードされました。

 


ARITH:クライアントは、int型またはインタフェース{}のような、非常に単純であることができる、ことが重要である出力方法。

服务端:
rpc.Register(ARITH)
rpc.HandleHTTP()
L、E:= net.Listen( "TCP"、 ":1234")
に行くhttp.Serve(L、ゼロ)


客户端:
クライアント、ERR = rpc.DialHTTP( "TCP"、serverAddressで+ ":1234")
引数:=&server.Args {7,8}
VAR応答INT
ERR = client.Call( "Arith.Multiply"、引数、&回答)//使用同步


商:=(商)新しい
divCall:= client.Go( "Arith.Divide"、引数、&商はnil)//使用异步
replyCall:= <-divCall.Done

 

 


RPCプログラムのロード・バランシング:

サーバー:
VAR(
// ETCDサービスアドレス
etcdServer = "127.0.0.1:2379"
//ディレクトリサービスの
接頭辞= "Arith.Multiply"
//現在対応サービスインスタンスを起動する
インスタンス= "127.0.0.1:50052"
/ /登録サービスインスタンス・パス
キー=接頭辞+インスタンス
//サービスインスタンス登録ヴァルの
値=インスタンス
CTX = context.Background()
//サービスのアドレスリッスン
= serviceAddressを「:50052」

 

//リーダーに書き込まれた接続情報は、etcd;
//レジストラ作成
レジストラを:= etcdv3.NewRegistrar(クライアント、etcdv3.Service {
キー:キー、
値:値
}、log.NewNopLogger())


//開始登録登録
(registrar.Registerを)

 

//メソッドRPC、TCPポートに加え、
ARITH:=新しい新しい(ARITH)
rpc.Register(ARITH)
rpc.HandleHTTP()
L、E:= net.Listen( "TCP"、serviceAddress)//サービス登録を使用対処
E {nilに= IF!
fmt.Print( "聞くエラー:"、E)
}
http.Serve(L、ゼロ)



ARITHのint型

FUNC(のT *のARITH)乗算(*引数Argsは、返信* INT)エラー{
*返信= args.A * args.B
リターンゼロ
}

 


クライアント:

// etcdアドレス、および必要なサービスの名前を追加します。
VAR(
//登録センター住所
etcdServer = "127.0.0.1:2379"
//リスニングサービスプレフィックス
プレフィックス= "Arith.Multiply"
CTX = context.Background()

//インスタンスマネージャーを作成し、このマネージャーは、キャッシュサービスインスタンスのデータ更新の接頭辞にetcディレクトリのモニタの変更を監視します
インスタンサを、ERR:= etcdv3.NewInstancer(クライアント 、接頭辞、ロガー)


//エンドポイント・マネージャーを作成してエンドポイントファクトリーを作成して、聞いて、インスタンサ話題なendPoint工場に応じて変更をサブスクライブするには、このマネージャーのインスタンスが作成され
endpointerを:= sd.NewEndpointer(インスタンサ、reqFactory、ロガー)
//は、ロードバランサの作成
バランサを:= lb.NewRoundRobin(endpointer)

クライアントで// FUNCのreqFactory(instanceAddr文字列)、ERR:= rpc.DialHTTP( "TCP"、instanceAddr)、client.Call( "Arith.Multiply"、引数、および返信)メソッド特定のコール。

 

 

 


MQTT契約:
MQTT(メッセージキューテレメトリ交通、メッセージキューテレメトリー転送プロトコル)は、パブリッシュ/モード「軽量」の通信プロトコルはTCP / IPプロトコル上に構築された(パブリッシュ/サブスクライブ)購読基づいています。

サービス品質QoS:
「高々度」、基盤となるTCP / IPネットワークに完全に依存ニュースリリース。メッセージの損失が発生します。
「少なくとも一回」のメッセージが到達することを確実にするが、繰り返されるメッセージが発生する可能性があります。
「一度だけ」というメッセージが一度に達することを保証するために。課金システムのより厳格な要件の一部で。

特徴:小型の送信、唯一の2バイト;続く:同じテーマの下で他の機器に通知、デバイスが切断されています。

コンポーネント:エージェント(ブローカー)出版(公開)、加入者(購読)、
パブリッシャとサブスクライバがクライアントである、出版社が同時に加入することができ、
プロキシサーバです。


メッセージに送信MQTT:二つの部分に話題(トピック)と負荷(ペイロード)。

加入する加入者のテーマ、負荷は、メッセージの内容として理解することができます。

MQTTクライアント:1.加入することができる他のクライアントに関する情報を公開; 2.他のクライアントによって公開されたニュースを購読、
MQTTサーバー(ブローカー):2。受け入れるように1から、ニュースの出版社と契約者との間に位置しています顧客のネットワーク接続; 2.顧客が発表した情報の適用を受け入れます。


プロセス接続:
接続後、セッションを確立するために、各クライアントとサーバは、サブスクリプションは、セッション(セッション)に関連付けされますされています。セッションでは、複数のサブスクリプションを含めることができます。

MQTTプロトコルパケット構造:
固定ヘッダ(固定ヘッダ)は三つの部分の主情報、最初の変数(変数ヘッダ)、メッセージボディ(ペイロード)に接続されています。
MQTT契約は相互の信頼関係ではない、それはクライアント側の検証サービス機構のアイデンティティを提供していません。

 


インストールブローカーサーバー:
nginxの:nginxの-1.11.0.tar.gz
EMQ:emqx-centos6.8-V3.0-beta.4.x86_64.rpm単一ノードは、1,000,000への接続500,000受け取ることができます。


EMR:
クラスタモードに自動的に基づいて、静的クラスタノードリスト:
cluster.static.seeds emqx1 @ = 192.168.1.2、192.168.1.3 emqx2 @

LDAP認証:証明書をインストールし、サービスが開始emqx。


nginxの:
HTTP {
サーバー192.168.1.2:18083。
サーバー192.168.1.3:18083;
}

 

クライアントをインストールします。

连接ブローカー:clinetOptions:= mqtt.NewClientOptions()AddBroker( "TCP:// XXXXX:1883")。.SetUsername( "管理者").SetPassword( "パブリック")
订阅消息:トークン:= client.Subscribe( "行きます-test-トピック」、1、messageSubHandler)token.Wait()
发布消息:トークン:= client.Publish( "ゴーテストトピック"、1、偽の、テキスト)token.Wait()

 

 





##いくつかの思考の練習:


マシンデータ- >ブローカーappoll(SSL双方向の暗号化) - >生;
データの損失を防ぐための戦略のうちの少なくとも一つは、サーバー上の簡単なETL。

ブロックされたキューの崩壊を防ぐために、メモリを制限し、サービスを制限し、災害復旧、災害復旧:ステートマシン、ハートビート、再接続の戦略関与;分布の電子メールのダウンタイムの状態を、状態から最大負荷を実行し始めました。


ヒューズ - >制限 - > appoll - >サービス壊れた状態を復元する - > nigix - > VUE

 

 

概念
サービスアバランシェ効果の
理由:時間や負荷が要求のバックログの結果として高すぎるので、パフォーマンスのボトルネックを達成するために、システムリソース、サーバーの多くを取る、サービスプロバイダが使用できない
現象:アップストリームサービスの障害が発生する不具合をカスケード接続し、下流サービスの麻痺につながる
戦略を対処:
拡張
コントロール交通
吹き
サービス低下


hystrix.ConfigureCommand( "AAA"、{hystrix.CommandConfig
タイムアウト:5000、
MaxConcurrentRequests :. 5
})
。1、タイムアウト] [タイムアウト要求

2、ErrorPercentThreshold [許可]誤り率が発生します

3、SleepWindow [要求を起動しようとするどのくらいのオープン吹き飛ばさ]

4、MaxConcurrentRequests [並行要求の最大許容数]

5、RequestVolumeThreshold [要求最小周期変動、デフォルト10Sの変動]

 

おすすめ

転載: www.cnblogs.com/ruili07/p/11459267.html