Ribbon は、HTTP および TCP クライアントの動作を適切に制御するクライアント ロード バランサーです。 Feign はデフォルトでリボンを使用しています (参考記事)
まず、リボン
1 のいくつかのコアクラスを見てみましょう。主に使用される IClientConfig
のデフォルト実装クラス DefaultClientConfigImpl
リボン クライアントの関連する属性構成を構成するにはIClientConfig
默认实现类DefaultClientConfigImpl
,主要用来配置ribbon客户端的相关属性配置
2、ServerListUpdater
默认实现类PollingServerListUpdater
,主要负责动态更新服务器列表
start方法调用后会启动一个定时任务,延时1s开始执行,以每30s的时间间隔周期执行
周期时间间隔可以通过ribbon.ServerListRefreshInterval=1000
或者ribbonClientName.ribbon.ServerListRefreshInterval=1000
来设置
start方法的启动由DynamicServerListLoadBalancer
初始化的时候执行调用
3、ServerList
获取服务器列表
默认实现类ConfigurationBasedServerList
,默认是从配置文件取服务器列表,这样配置[ribbonClinetName].ribbon.listOfServers=xxx,xxx
ConsulServerList
引入consul作服务发现的实现类,主要负责获取注册中心的服务器列表
备注:可以通过配置来扩展自己的ServerList
实现,像这样:[ribbonClient].ribbon.NIWSServerListClassName=类名
4、ServerListFilter
服务器列表过滤器
默认实现类ZonePreferenceServerListFilter
主要根据分区来过滤服务器列表
HealthServiceServerListFilter
引入consul服务发现的实现类,主要负责过滤consul健康检查通过的服务器列表(在ConsulServerList中会获取所有的服务器列表,包括健康检查没有通过的服务器)
备注:可以通过配置来扩展自己的ServerList
实现,像这样[ribbonClient].ribbon.NIWSServerListFilterClassName=类名
5、IPing
检查服务器是否或者
默认实现DummyPing
,这是一个假的检测着,永远返回是true
ConsulPing
,引入consul服务发现的实现类,主要根据consul返回的checks参数来判断服务器是否活着,跟HealthServiceServerListFilter
的过滤判断一样
备注:可以通过配置来扩展自己的ServerList
实现,像这样:[ribbonClient].ribbon.NFLoadBalancerPingClassName=类名
6、IRule
负载均衡选择器
默认实现ZoneAvoidanceRule
,复合判断server所在区域的性能和server的可用性选择server
RandomRule
:随机选择一个server
RoundRobinRule
:roundRobin方式轮询选择server
RetryRule
:对选定的负载均衡策略机上重试机制。
WeightedResponseTimeRule
:根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。
AvailabilityFilteringRule
:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
BestAvailableRule
:选择一个最小的并发请求的server
7、ILoadBalancer
负载均衡总控制器,默认实现类ZoneAwareLoadBalancer
,其启动了整个负载均衡客户端
可以通过配置来扩展自己的ServerList
实现,像这样:[ribbonClient].ribbon.NFLoadBalancerClassName=类名
ServerListUpdater
デフォルトの実装クラス PollingServerListUpdater
は主にサーバー リストを動的に更新します
サイクル時間間隔は、ribbon.ServerListRefreshInterval=1000
または ribbonClientName.ribbon.ServerListRefreshInterval= で設定できます。 1000
DynamicServerListLoadBalancer
が初期化されるときに start メソッドが呼び出されます
ServerList
がサーバー リストを取得します🎜ConfigurationBasedServerList
は、デフォルトでは設定ファイルからサーバー リストを取得し、この [ribbonClinetName] のように設定します。リボン.listOfServers=xxx,xxx
🎜🎜ServerList
実装を拡張できます: [ribbonClient].ribbon.NIWSServerListClassName=クラス名
🎜🎜🎜🎜4, ServerListFilter code>サーバー リスト フィルター🎜<ul class=" list-paddingleft-2">
<li>🎜Default 実装クラス <code>ZonePreferenceServerListFilter
は主に、パーティションに従ってサーバー リストをフィルタリングする役割を果たします 🎜🎜HealthServiceServerListFilter
は、領事サービス検出の実装クラスを導入します。これは主に、領事ヘルスチェックに合格したサーバーリストをフィルタリングする役割を果たします (すべてのサーバーのリストは、ConsulServerList で取得されます。ヘルスチェックに失敗しました)🎜🎜🎜🎜🎜注: [ribbonClient].ribbon.NIWSServerListFilterClassName =クラス名
🎜🎜🎜🎜5のように、構成を通じて独自のServerList
実装を拡張できます。 IPing
サーバーか 🎜DummyPing
code> を確認します。これは誤検出であり、常に返されます。 true🎜🎜ConsulPing
は、主に consul から返される checks パラメータに基づいて、サーバーが生きているかどうかを判断する consul サービス検出の実装クラスを導入します。これは、 のフィルタリング判定と同じです。 HealthServiceServerListFilter
🎜🎜🎜🎜🎜注: 次のように、構成を通じて独自の ServerList
実装を拡張できます: [ribbonClient].ribbon.NFLoadBalancerPingClassName=クラス名
🎜🎜 🎜🎜6、IRule
負荷分散セレクター🎜ZoneAvoidanceRule
のデフォルト実装、サーバーエリアとサーバーの可用性を確認してサーバーを選択します🎜🎜RandomRule
: サーバーをランダムに選択します🎜🎜RoundRobinRule
: ラウンドロビンモードホイールクエリサーバーを選択します🎜🎜RetryRule
: 選択した負荷分散ポリシーのオンマシン再試行メカニズム。 🎜🎜WeightedResponseTimeRule
: 応答時間に基づいて重みを割り当てます。応答時間が長いほど重みが小さくなり、選択される可能性が低くなります。 🎜🎜AvailabilityFilteringRule
: 接続に失敗し続けるため回線トリップとしてマークされているバックエンド サーバーをフィルタリングし、同時実行性の高いバックエンド サーバー (アクティブな接続が設定された数を超えている) をフィルタリングします。しきい値)🎜🎜BestAvailableRule
: 同時リクエストが最も少ないサーバーを選択します🎜🎜🎜🎜🎜🎜7. ILoadBalancer
負荷分散マスター コントローラー、デフォルト実装クラス ZoneAwareLoadBalancer は、負荷分散クライアント全体を開始します 🎜<ul class=" list-paddingleft-2"><li>🎜次のように、構成を通じて独自の <code>ServerList
実装を拡張できます。 >[ribbonClient].ribbon.NFLoadBalancerClassName=クラス名初期化時には、スケジュールされたタスクが最初に初期化され、30 秒ごとに実行されます。キャッシュには、登録センターから取得したすべてのインスタンス リスト allServerList と、正常に ping されたインスタンス リスト upServerList が保存されます。ロードバランシング中に取得されるリストは、upServerList ではなく、allServerList です。この ping の意味がわかりません
定期的に登録センターからサービスリストを取得するスケジュールされたタスクを開始し、30 秒ごとに実行します
サービスリストを取得するために初期化し、サービスリストをプルする ServiceFilterでフィルタリングした後、キャッシュに保存する
クライアントが呼び出しを開始すると、ILoadBalancerのchooseServerメソッドが呼び出され、インスタンスが生成されますIRule の負荷分散アルゴリズムに基づいて選択され、呼び出し元に返されます。
関連記事:
以上がスプリング、クラウド、リボンの原理の分析: リボンのいくつかのコア クラスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。