①Ribbon是什麼。
Ribbon負載均衡是什麼?
Spring Cloud Ribbon是基于Netflix Ribbon實作的一套用戶端 負載均衡的工具。
簡單的說,Ribbon是Netflix釋出的開源項目,主要功能是提供用戶端的軟體負載均衡算法,将Netflix的中間層服務連接配接在一起。Ribbon用戶端元件提供一系列完善的配置項如連接配接逾時,重試等。簡單的說,就是在配置檔案中列出Load Balancer(簡稱LB)後面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,随機連接配接等)去連接配接這些機器。我們也很容易使用Ribbon實作自定義的負載均衡算法。
Ribbon負載均衡能幹嗎?
LB(負載均衡)
LB,即負載均衡(Load Balance),在微服務或分布式叢集中經常用的一種應用。
負載均衡簡單的說就是将使用者的請求平攤的配置設定到多個服務上,進而達到系統的HA。
常見的負載均衡有軟體Nginx,LVS,硬體 F5等。
相應的在中間件,例如:dubbo和SpringCloud中均給我們提供了負載均衡,SpringCloud的負載均衡算法可以自定義
LB有集中式LB和程序内LB兩種。
集中式LB(偏硬體)即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬體,如F5, 也可以是軟體,如nginx), 由該設施負責把通路請求通過某種政策轉發至服務的提供方;
程序内LB(偏軟體),将LB邏輯內建到消費方,消費方從服務注冊中心獲知有哪些位址可用,然後自己再從這些位址中選擇出一個合适的伺服器。Ribbon就屬于程序内LB,它隻是一個類庫,內建于消費方程序,消費方通過它來擷取到服務提供方的位址。
②Ribbon配置初步。
第一步:修改microservicecloud-consumer-dept-80工程pom.xml檔案。
pom檔案修改的内容是:
<!-- Ribbon相關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
spring-cloud-starter-eureka
eureka後面沒有帶server
說明是用戶端。ribbon需要和eureka整合使用。
pom檔案最後全部内容是:
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lss.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-consumer-dept-80</artifactId>
<description>部門微服務消費者</description>
<dependencies>
<dependency><!-- 自己定義的api -->
<groupId>com.lss.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- Ribbon相關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
</project>
然後update以下。需要等一段時間。
看一下maven本地倉庫相關ribbon的jar包下載下傳好了:
第二步:修改microservicecloud-consumer-dept-80子工程的application.yml 追加eureka的服務注冊位址。
microservicecloud-consumer-dept-80子工程的yml修改的内容是:
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
microservicecloud-consumer-dept-80子工程的yml全部内容是:
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
第三步:對ConfigBean類進行新注解@LoadBalanced 獲得Rest時加入Ribbon的配置。
ConfigBean.java的全部内容是:
package com.lss.springcloud.cfgbeans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
//boot 優化了spring架構,spring架構用的配置檔案是 applicationContext.xml
//而在springboot裡面,已經沒有applicationContext.xml這個檔案了。
//隻有加了@Configuration的注解版類。
@Configuration
public class ConfigBean{
@Bean
@LoadBalanced //Spring Cloud Ribbon是基于Netflix Ribbon實作的一套用戶端 負載均衡的工具。
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
//在spring架構裡面的applicationContext.xml檔案裡面,一定會寫:
//<bean id="userService" class="com.lss.tmall.UserServiceImpl"> </bean>
//那麼在springboot裡面沒有applicationContext.xml檔案,則在@Configuration類裡面寫:
/*
* @Bean
* public UserService getUserService(){
* return new UserServiceImpl();
* }
*/
第四步:主啟動類DeptConsumer80_App添加@EnableEurekaClient。
DeptConsumer80_App.java的全部内容是:
package com.lss.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer80_App.class, args);
}
}
第五步:修改DeptController_Consumer用戶端通路類。
DeptController_Consumer類的修改部分:
// private static final String REST_URL_PREFIX = "http://localhost:8001";
private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
DeptController_Consumer類的全部内容:
package com.lss.springcloud.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.lss.springcloud.entities.Dept;
@RestController
public class DeptController_Consumer {
// private static final String REST_URL_PREFIX = "http://localhost:8001";
private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
@Autowired
private RestTemplate restTemplate;
/*
* 使用: 使用restTemplate通路restful接口非常的簡單粗暴無腦。 (url, requestMap,
* ResponseBean.class)這三個參數分别代表 REST請求位址、請求參數、HTTP響應轉換被轉換成的對象類型。
*/
@RequestMapping(value = "/consumer/dept/add")
public boolean add(Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
}
@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/consumer/dept/list")
public List<Dept> list() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
}
// 測試@EnableDiscoveryClient,消費端可以調用服務發現
@RequestMapping(value = "/consumer/dept/discovery")
public Object discovery() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/discovery", Object.class);
}
}
服務提供者,注冊在eureka裡面的名字。如下圖所示:
第六步:先啟動3個eureka叢集後,再啟動microservicecloud-provider-dept-8001并注冊進eureka。
啟動7001、7002、7003
在啟動8001
即最後注冊成功顯示
第七步:啟動microservicecloud-consumer-dept-80。
第八步:測試。
http://localhost/consumer/dept/get/1
http://localhost/consumer/dept/list
http://localhost/consumer/dept/add?dname=大資料部
Ribbon和Eureka整合後Consumer可以直接調用服務而不用再關心位址和端口号
③Ribbon負載均衡。
第一步:了解架構。架構說明。
Ribbon在工作時分成兩步
一、先選擇 EurekaServer ,它優先選擇在同一個區域内負載較少的eureka server.
二、再根據使用者指定的政策,在從eureka server取到的服務注冊清單中選擇一個位址。
其中Ribbon提供了多種政策:比如輪詢、随機和根據響應時間權重。
第二步:參考microservicecloud-provider-dept-8001,建立兩份,分别命名為8002,8003。服務提供者建立兩份。
如下圖,等待progress進度條完成。
将8001的pom檔案相關内容拷貝進8002和8003。
需要拷貝的内容是:
<dependencies>
<dependency><!-- 引入自己定義的api通用包,可以使用Dept部門Entity -->
<groupId>com.lss.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 将微服務provider側注冊進eureka,注意,沒有-server,說明是client端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- actuator監控資訊完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<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>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
8002的pom檔案完整内容是:
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lss.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-provider-dept-8002</artifactId>
<dependencies>
<dependency><!-- 引入自己定義的api通用包,可以使用Dept部門Entity -->
<groupId>com.lss.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 将微服務provider側注冊進eureka,注意,沒有-server,說明是client端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- actuator監控資訊完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<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>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
8003的pom完整内容是:
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lss.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-provider-dept-8003</artifactId>
<dependencies>
<dependency><!-- 引入自己定義的api通用包,可以使用Dept部門Entity -->
<groupId>com.lss.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 将微服務provider側注冊進eureka,注意,沒有-server,說明是client端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- actuator監控資訊完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<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>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
然後分别對8002和8003進行update。
拷貝8001目錄下的src/main/java目錄下的内容:
選中以上所有内容,複制。
然後分别更改主啟動類的名字。不改也行,但為了好區分,最好更改。
拷貝8001工程對應的src/main/resources目錄下的内容。
第三步:建立8002/8003資料庫,各自微服務分别連各自的資料庫。
8002的sql腳本如下:
DROP DATABASE IF EXISTS cloudDB02;
CREATE DATABASE cloudDB02 CHARACTER SET UTF8;
USE cloudDB02;
CREATE TABLE dept
(
deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(60),
db_source VARCHAR(60)
);
INSERT INTO dept(dname,db_source) VALUES('開發部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('财務部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('市場部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('運維部',DATABASE());
SELECT * FROM dept;
8003的sql腳本如下:
DROP DATABASE IF EXISTS cloudDB03;
CREATE DATABASE cloudDB03 CHARACTER SET UTF8;
USE cloudDB03;
CREATE TABLE dept
(
deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(60),
db_source VARCHAR(60)
);
INSERT INTO dept(dname,db_source) VALUES('開發部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('财務部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('市場部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('運維部',DATABASE());
SELECT * FROM dept;
第四步:修改8002/8003各自YML。
8001的yml完整内容是:
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis所在路徑
type-aliases-package: com.atguigu.springcloud.entities #entity别名類
mapper-locations:
- classpath:mybatis/mapper/**/*.xml #mapper映射檔案
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/cloudDB01
username: root
password: lss19881218
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
eureka:
client: #用戶端注冊進eureka服務清單内
service-url:
defaultZone: http://eureka7001.com:7001/eureka/#,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8001 #自定義服務名稱資訊
prefer-ip-address: true #通路路徑可以顯示IP位址
info:
app.name: lss-microservicecloud
company.name: www.lss.com
build.artifactId: $project.artifactId$
build.version: $project.version$
8002的yml完整内容是:
server:
port: 8002
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis所在路徑
type-aliases-package: com.atguigu.springcloud.entities #entity别名類
mapper-locations:
- classpath:mybatis/mapper/**/*.xml #mapper映射檔案
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/cloudDB02
username: root
password: lss19881218
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
eureka:
client: #用戶端注冊進eureka服務清單内
service-url:
defaultZone: http://eureka7001.com:7001/eureka/#,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8002 #自定義服務名稱資訊
prefer-ip-address: true #通路路徑可以顯示IP位址
info:
app.name: lss-microservicecloud
company.name: www.lss.com
build.artifactId: $project.artifactId$
build.version: $project.version$
8003的yml完整内容是:
‘
server:
port: 8003
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis所在路徑
type-aliases-package: com.atguigu.springcloud.entities #entity别名類
mapper-locations:
- classpath:mybatis/mapper/**/*.xml #mapper映射檔案
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/cloudDB03
username: root
password: lss19881218
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
eureka:
client: #用戶端注冊進eureka服務清單内
service-url:
defaultZone: http://eureka7001.com:7001/eureka/#,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8003 #自定義服務名稱資訊
prefer-ip-address: true #通路路徑可以顯示IP位址
info:
app.name: lss-microservicecloud
company.name: www.lss.com
build.artifactId: $project.artifactId$
build.version: $project.version$
’
第五步:啟動3個eureka叢集配置區。
第六步:啟動3個Dept服務提供者微服務并各自測試通過。即分别啟動8001、8002、8003。
http://localhost:8001/dept/list
http://localhost:8002/dept/list
http://localhost:8003/dept/list
第七步:啟動microservicecloud-consumer-dept-80。
第八步:用戶端即服務消費者consumer端,通過Ribbo完成負載均衡,并通路上一步的Dept服務提供者微服務。
注意觀察看到傳回的資料庫名字,各不相同,負載均衡實作
http://localhost/consumer/dept/list
然後重新整理。
然後再重新整理。
預設算法是輪詢。
總結:Ribbon其實就是一個軟負載均衡的用戶端元件,他可以和其他所需請求的用戶端結合使用,和eureka結合隻是其中的一個執行個體。
④Ribbon核心元件IRule。
IRule:根據特定算法中從服務清單中選取一個要通路的服務
RoundRobinRule:輪詢
RandomRule:随機
AvailabilityFilteringRule:會先過濾掉由于多次通路故障而處于斷路器跳閘狀态的服務,還有并發的連接配接數量超過門檻值的服務,然後對剩餘的服務清單按照輪詢政策進行通路。
WeightedResponseTimeRule:根據平均響應時間計算所有服務的權重,響應時間越快服務權重越大被選中的機率越高。剛啟動時如果統計資訊不足,則使用RoundRobinRule政策,等統計資訊足夠,會切換到WeightedResponseTimeRule。
RetryRule:先按照RoundRobinRule的政策擷取服務,如果擷取服務失敗則在指定時間内會進行重試,擷取可用的服務。
BestAvailableRule:會先過濾掉由于多次通路故障而處于斷路器跳閘狀态的服務,然後選擇一個并發量最小的服務。
ZoneAvoidanceRule:預設規則,複合判斷server所在區域的性能和server的可用性選擇伺服器。
第一步:在microservicecloud-consumer-dept-80子子產品修改com.lss.springcloud.cfgbeans包下的ConfigBean.java類:
修改内容是:
@Bean
public IRule myRule() {
//return new RoundRobinRule();
return new RandomRule();
//達到的目的:用我們重新選擇的随機算法替代預設的輪詢。
}
最後ConfigBean.java類的完整内容是:
package com.lss.springcloud.cfgbeans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
//boot 優化了spring架構,spring架構用的配置檔案是 applicationContext.xml
//而在springboot裡面,已經沒有applicationContext.xml這個檔案了。
//隻有加了@Configuration的注解版類。
@Configuration
public class ConfigBean{
@Bean
@LoadBalanced //Spring Cloud Ribbon是基于Netflix Ribbon實作的一套用戶端 負載均衡的工具。
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean
public IRule myRule() {
//return new RoundRobinRule();
return new RandomRule();
//達到的目的:用我們重新選擇的随機算法替代預設的輪詢。
}
}
//在spring架構裡面的applicationContext.xml檔案裡面,一定會寫:
//<bean id="userService" class="com.lss.tmall.UserServiceImpl"> </bean>
//那麼在springboot裡面沒有applicationContext.xml檔案,則在@Configuration類裡面寫:
/*
* @Bean
* public UserService getUserService(){
* return new UserServiceImpl();
* }
*/
如果想換成相對應的算法:則ConfigBean.java類的内容如下:
package com.lss.springcloud.cfgbeans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import com.netflix.loadbalancer.AvailabilityFilteringRule;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;
//boot 優化了spring架構,spring架構用的配置檔案是 applicationContext.xml
//而在springboot裡面,已經沒有applicationContext.xml這個檔案了。
//隻有加了@Configuration的注解版類。
@Configuration
public class ConfigBean{
@Bean
@LoadBalanced //Spring Cloud Ribbon是基于Netflix Ribbon實作的一套用戶端 負載均衡的工具。
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean
public IRule myRule() {
//return new RoundRobinRule();
//return new RandomRule();//達到的目的:用我們重新選擇的随機算法替代預設的輪詢。
//return new AvailabilityFilteringRule();
//return new WeightedResponseTimeRule();
//return new RetryRule();
//return new BestAvailableRule();
return new ZoneAvoidanceRule();
}
}
//在spring架構裡面的applicationContext.xml檔案裡面,一定會寫:
//<bean id="userService" class="com.lss.tmall.UserServiceImpl"> </bean>
//那麼在springboot裡面沒有applicationContext.xml檔案,則在@Configuration類裡面寫:
/*
* @Bean
* public UserService getUserService(){
* return new UserServiceImpl();
* }
*/
return new 換成對應的方法即可。