まず、マイクロリボンにおけるサービスの役割
1.リボンとは何ですか
1.Ribbonは、HTTPとTCPに基づいてクライアントの負荷分散ツールの実装Netflixのリボン基づいており、
2.これは、スタンドアロン展開として春のクラウドサービス登録センター、物流センター、APIゲートウェイのようではありませんが、ほぼすべての春クラウドマイクロサービスに存在します。宣言型サービスコール装うは、ベースの実装のリボンを提供します。
3.Ribbonオファーの様々なロードバランシング例えばアルゴリズム:ポーリング、ランダム、というように。でも、カスタムの負荷分散アルゴリズムを含みます。
問題を解決するため2.Ribbon
このアドレスおよびマイクロサービスの提供ロードバランシングの問題を
第二に、中央集中型のプロセスと負荷分散の範囲内違い
1.分類負荷分散ソリューション
業界の主流の負荷分散スキームは、2つのカテゴリに分けることができます。
-
集中負荷分散:消費者および中間プロバイダに別個のロードバランシング機能の使用(例えばF5として、ハードウェアは、例えば、ソフトウェア、とすることができる:nginxの)、要求により施設へのアクセスが戦略を介してプロバイダに転送されます。
-
インプロセスのロードバランシング:ロードバランシングロジックが消費者に統合され、消費者のサービスレジストリは、自分自身、アドレスが利用可能なものから学び、その後、これらのアドレスから適切なプロバイダを選択します
後者のリボン、適切なプロバイダのアドレスを取得するために、消費者に統合され、消費者だけのクラスライブラリです。
2.ステートチャートの負荷分散方式
三、リボンエントリーケース
ロードバランシングクラスタサービスのリボン戦略は、デフォルトのポーリングを使用しています
1.Consumer
@Service
public class UserService {
@Autowired
private LoadBalancerClient loadBalancerClient; //ribbon:负载均衡器
public List<User> getUsers(){
//选择调用的服务的名称
//ServiceInstance:封装了服务的基本信息,如:ip、端口号
ServiceInstance si = loadBalancerClient.choose("eureka-provider");
//拼接访问服务的url
StringBuffer sb = new StringBuffer();
//http://localhost:9090/user
sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/user");
System.out.println(sb.toString());
//SpringMVC RestTemplate
RestTemplate restTemplate = new RestTemplate();
ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {
};
//ResponseEntity:封装了返回值信息
ResponseEntity<List<User>> entity = restTemplate.exchange(sb.toString(), HttpMethod.GET, null, type);
return entity.getBody();
}
}
复制代码
2.Consumerプロフィール
spring.application.name=eureka-consumer
server.port=9091
#设置服务注册中心地址,向所有注册中心做注册
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
复制代码
3.Providerクラスタの展開
3.1プロバイダのLinux環境にデプロイ、パッケージ化
3.2の起動スクリプトの作成
#!/bin/bash
cd `dirname $0`
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
JAR_NAME="springcloud-eureka-provider-0.0.1-SNAPSHOT.jar"
JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
#JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
JAVA_MEM_OPTS=""
#SPRING_PROFILES_ACTIV="-Dspring.profiles.active=eureka2"
SPRING_PROFILES_ACTIV=""
LOG_DIR=$CUR_SHELL_DIR/logs
LOG_PATH=$LOG_DIR/${JAR_NAME%..log
echo_help()
{
echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
}
if [ -z $1 ];then
echo_help
exit 1
fi
if [ ! -d "$LOG_DIR" ];then
mkdir "$LOG_DIR"
fi
if [ ! -f "$LOG_PATH" ];then
touch "$LOG_DIR"
fi
if [ "$1" == "start" ];then
# check server
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -n "$PIDS" ]; then
echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
exit 1
fi
echo "Starting the $JAR_NAME..."
# start
nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
PIDS=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
echo "${JAR_NAME} Started and the PID is ${PIDS}."
echo "You can check the log file in ${LOG_PATH} for details."
elif [ "$1" == "stop" ];then
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR:The $JAR_NAME does not started!"
exit 1
fi
echo -e "Stopping the $JAR_NAME..."
for PID in $PIDS; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps --no-heading -p $PID`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
else
echo_help
exit 1
fi
复制代码
4. [スタート]消費者
四、リボン共通負荷分散戦略
1.ポーリングポリシー(デフォルト):
使用するRoundRobinRule
クラスは、それぞれの時間は、ポーリングポリシー配列が除去プロバイダ、プロバイダ5が有するような、最初に取るために初めて、第二は、秒を取る第テイク第三に、というようにすることを示します。
2.重量ポーリングポリシー:
使用WeightedResponseTimeRule
各プロバイダーのクラスに応じて、応答時間重みを割り当てられたが、体重増加の応答時間より小さく、少なく選択します。
原理:開始ポーリングポリシー、および平均の各プロバイダの上で30秒ごといったん収集タイマー、スタート応答時間を情報は、各プロバイダの重みを追加するのに十分である、とプレス重みがランダムに選択されたときに高い重みがあり、より高い確率で選択されました。
3.ランダム戦略:
使用RandomRule
のリストからクラスプロバイダをランダムに選択するプロバイダを
4.同時戦略の最小数:
使用するとBestAvailableRule
、要求を選択することで、同時の数が少ない、プロバイダのヒューズで提供しない限り。
に基づいて、選択された「ロード・バランシング・ポリシー」5.再試行のメカニズム
使用RetryRule
クラス、「戦略のバランスを取る選択ロード」戦略があるポーリングポリシー RoundRobinRule
再試行戦略が設定した時間の閾値期間を選択したプロバイダは、この期間では成功していない場合はされている、しようとしている「戦略均衡選択された負荷:ポーリングポリシー」を採用し、最後の可能なプロバイダを選択
6.可用性敏感ポリシー
使用AvailabilityFilteringRule
クラス、貧弱な濾過性能プロバイダ2があります。
最初:エウレカが除外された接続が失敗したのプロバイダを
第二:フィルタへ出て、高い同時実行のプロバイダ
7.地域戦略感度
使用ZoneAvoidanceRule
クラス、
全領域を破棄し、地域別の利用可能性を検討するためには、選択したプロバイダの残りの領域から入手可能であり、使用できません。
到達不能または遅い応答IP 1つ以上のインスタンスのエリア内に存在する場合、両方が領域内の他のIP IP選択重みを減少させます。
五、リボンは異なる負荷分散戦略を指定します
1.変更負荷分散戦略を交換するためのコード
プロジェクトの作成1.1
springcloud-ユーレカ・消費者-LB
起動クラスでロードバランシングポリシーオブジェクトを作成するために、1.2 Addメソッド
/**
* Author: LuYi
* Date: 2019/11/5 17:32
* Description: 描述
*/
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApplication {
@Bean
public RandomRule createRule() {
return new RandomRule();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
复制代码
2.負荷分散ポリシーを置き換えるために、設定ファイルを変更します。
#设置负载均衡策略 eureka-provider 为调用的服务的名称
eureka-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
复制代码
六、リボンピアダイレクトコネクト
プロジェクトを作成します。1.
springcloud-ユーレカ・消費者の直接
ユーレカ座標を削除2.座標は、リボンを追加しました
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.luyi</groupId>
<artifactId>springcloud-eureka-consumer-direct</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-consumer-direct</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--ribbon坐标-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制代码
3.変更関連のユーレカの設定を削除するには、設定ファイルには、新しい設定項目を追加します
spring.application.name=eureka-consumer-direct
server.port=9091
#禁用 eureka
ribbon.eureka.enabled=false
#指定具体的服务实例清单
eureka-provider.ribbon.listOfServers=192.168.234.132:9090
复制代码
4.変更起動クラス、エラー・コードが除去され
@SpringBootApplication
public class ConsumerApplication {
// @Bean
// public RandomRule createRule() {
// return new RandomRule();
// }
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
复制代码