Ribbon簡介
Ribbon是Netflix發(fā)布的負載均衡器提完,它可以幫我們控制HTTP和TCP客戶端的行為乡括。只需為Ribbon配置服務(wù)提供者地址列表泪电,Ribbon就可基于負載均衡算法計算出要請求的目標服務(wù)地址弊知。
Ribbon默認為我們提供了很多的負載均衡算法握牧,例如輪詢容诬、隨機、響應(yīng)時間加權(quán)等——當然沿腰,為Ribbon自定義負載均衡算法也非常容易览徒,只需實現(xiàn) IRule 接口即可。
Ribbon入門
新建提供者模塊spring-cloud-provider:
pom:
<?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>com.example</groupId>
<artifactId>spring-cloud-wsl</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-provider</name>
<description>Demo project for Spring Cloud Provider</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka服務(wù)端依賴jar包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
application.yml配置文件:
server:
port: 8880
spring:
application:
name: provider
#eureka客戶端連接配置
eureka:
client:
service-url:
#注冊中心地址
defaultZone: http://localhost:8761/eureka/
instance:
#將ip注冊到eureka上
prefer-ip-address: true
controller:
@RestController
public class TestController {
@Value("${server.port}")
private String port;
// 注入配置文件上下文
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/test/{name}")
public String test(@PathVariable String name) {
return "success! hello: " + name + " i am from port " + port;
}
// 從上下文中讀取配置
@GetMapping(value = "/hi")
public String sayHi() {
return "Hello " + applicationContext.getEnvironment().getProperty("user.name");
}
}
啟動spring-cloud-provider模塊
先啟動spring-cloud-eureka颂龙,再啟動spring-cloud-provider
打開http://localhost:8761/:
輸入http://localhost:8880/test/wangshilin
創(chuàng)建消費者模塊spring-cloud-consumer-ribbon:
pom:
<?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>com.example</groupId>
<artifactId>spring-cloud-wsl</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-consumer-ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-consumer-ribbon</name>
<description>Demo project for Spring Cloud Consumer Ribbon</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka客戶端依賴jar包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
配置文件application.yml:
server:
port: 8882
spring:
application:
name: consumer-ribbon
#eureka客戶端連接配置
eureka:
client:
service-url:
#注冊中心地址
defaultZone: http://localhost:8761/eureka/
instance:
#將ip注冊到eureka上
prefer-ip-address: true
配置RestTemplate:
@Configuration
public class ConsumerConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
controller:
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping(value = "/test/app/name")
public String test() {
return restTemplate.getForObject("http://provider/test/{name}", String.class, appName);
}
}
啟動spring-cloud-consumer-ribbon模塊:
瀏覽器輸入地址http://localhost:8882/test/app/name
先啟動eureka习蓬、provider模塊
為了測試負載均衡纽什,我們修改provider啟動配置
在Allow parallel run處打√
修改provider端口號為8881
再啟動provider模塊
目前啟動了兩個provider模塊,一個是8880端口躲叼,一個是8881端口
啟動consumer模塊:
瀏覽器中輸入:http://localhost:8882/test/app/name
刷新瀏覽器發(fā)現(xiàn)端口號變化
ribbon其實還有很多負載均衡的策略芦缰,在此不多說,網(wǎng)上教程一大堆枫慷,這里只講各個模塊如何搭建