1.白話負(fù)載均衡
? ? ? ??在上一篇的介紹中司倚,我們創(chuàng)建了兩個(gè)一模一樣的服務(wù)提供者:Provider1和Provider2枫疆,然后它們提供的服務(wù)也一模一樣馍惹,都叫Hello-Service燎猛。為什么一樣的服務(wù)我們要部署兩遍曹抬?其實(shí)理由很簡(jiǎn)單:
? ? ? ??比如溉瓶,在一個(gè)電商網(wǎng)站中,一開(kāi)始的時(shí)候谤民,用戶并沒(méi)有那么多堰酿,我們只需要把網(wǎng)站部署在一臺(tái)服務(wù)器上就可以了。但是隨著用戶量越來(lái)越大张足,一臺(tái)服務(wù)器就再也滿足不了要求了触创,這樣,我們就需要把這個(gè)一模一樣的網(wǎng)站部署在多臺(tái)服務(wù)器上为牍,但是對(duì)外它們提供的服務(wù)卻都是一樣的哼绑,包括域名(或者說(shuō)IP地址)也必須是唯一的顺饮。
? ? ? ??所以,上一篇中的兩個(gè)provider凌那,在實(shí)際生產(chǎn)環(huán)境中兼雄,甚至是同一個(gè)項(xiàng)目的復(fù)制而已,僅僅只是改了配置文件帽蝶。在我們的介紹中赦肋,我們只是為了介紹方便,或者說(shuō)便于調(diào)試励稳,才創(chuàng)建了兩個(gè)項(xiàng)目佃乘。當(dāng)然,里面的服務(wù)和代碼都是一模一樣的驹尼。
? ? ? ??以上趣避,如果用白話來(lái)講就是:將相同的服務(wù)部署在多臺(tái)服務(wù)器上,對(duì)外又只暴露一個(gè)唯一的地址新翎,這種實(shí)現(xiàn)就叫做:負(fù)載均衡程帕。
? ? ? ??如果一定要畫(huà)一個(gè)圖來(lái)表示,那么它大致長(zhǎng)這樣地啰,
2.Ribbon
? ? ? ??那我們?cè)趺窗沿?fù)載均衡引入到我們的軟件架構(gòu)中呢愁拭?一種當(dāng)時(shí)是自己寫(xiě)代碼實(shí)現(xiàn)。另一種當(dāng)然是利用前人已經(jīng)寫(xiě)好的框架了亏吝。Ribbon就是這樣一個(gè)框架岭埠。
? ? ? ??Ribbon是Netflix發(fā)布的開(kāi)源項(xiàng)目,主要功能就是提供客戶端的軟件負(fù)載均衡算法蔚鸥,將其它服務(wù)提供者連接在一起惜论。Ribbon通過(guò)在配置文件中列出Load Balancer(簡(jiǎn)稱(chēng)LB)后面所有的服務(wù)提供者,然后幫助我們基于某種規(guī)則(如簡(jiǎn)單輪詢止喷,隨即連接等)去連接這些機(jī)器馆类。
3.Ribbon負(fù)載均衡實(shí)現(xiàn)
? ? ? ??要讓ribbon實(shí)現(xiàn)負(fù)載均衡,首先就需要將ribbon本身當(dāng)成一個(gè)服務(wù)引入到eureka中启盛。
? ? ? ??創(chuàng)建一個(gè)web的子模塊蹦掐,如下:
? ? ? ??它跟其它的項(xiàng)目,從類(lèi)型上來(lái)說(shuō)沒(méi)什么區(qū)別僵闯。
? ? ? ??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 http://maven.apache.org/maven-v4_0_0.xsd">
? ? <parent>
? ? ? ? <artifactId>springcloud.parent</artifactId>
? ? ? ? <groupId>com.zuikc</groupId>
? ? ? ? <version>1.0-SNAPSHOT</version>
? ? </parent>
? ? <modelVersion>4.0.0</modelVersion>
? ? <packaging>war</packaging>
? ? <name>ribbon</name>
? ? <artifactId>ribbon</artifactId>
? ? <dependencyManagement>
? ? ? ? <dependencies>
? ? ? ? ? ? <dependency>
? ? ? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? ? ? <artifactId>spring-cloud-dependencies</artifactId>
? ? ? ? ? ? ? ? <version>Greenwich.RELEASE</version>
? ? ? ? ? ? ? ? <type>pom</type>
? ? ? ? ? ? ? ? <scope>import</scope>
? ? ? ? ? ? </dependency>
? ? ? ? </dependencies>
? ? </dependencyManagement>
? ? <dependencies>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-eureka</artifactId>
? ? ? ? ? ? <version>1.4.6.RELEASE</version>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-test</artifactId>
? ? ? ? ? ? <scope>test</scope>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-web</artifactId>
? ? ? ? </dependency>
? ? </dependencies>
</project>
? ? ? ??application.yml,
server:
? port: 9291
spring:
? application:
? ? name: Ribbon-Consumer
eureka:
? client:
? ? service-url:
? ? ? defaultZone: http://localhost:9091/eureka/
providers:
? ribbon:
? ? listOfServers: http://localhost:9191/eureka,http://localhost:9192/eureka
? ? ? ??可以看到藤滥,在這個(gè)配置文件中鳖粟,我們干了兩件事情,
? ? ? ??1:將自己注冊(cè)都eureka中拙绊;
? ? ? ??2:在listOfServers中向图,將要負(fù)載的兩個(gè)服務(wù)地址配置出來(lái)泳秀;
? ? ? ??現(xiàn)在,讓我們創(chuàng)建ServiceRibbonApplication榄攀,
package com.zuikc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
?* @ClassName ServiceRibbonApplication
?* @Description 我們提供咨詢和培訓(xùn)服務(wù)嗜傅,關(guān)于本文有任何困惑,請(qǐng)關(guān)注并聯(lián)系“碼農(nóng)星球”
?* @Author 碼農(nóng)星球
?**/
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {
? ? public static void main(String[] args) {
? ? ? ? SpringApplication.run(ServiceRibbonApplication.class, args);
? ? }
? ? @Bean
? ? @LoadBalanced
? ? RestTemplate restTemplate() {
? ? ? ? return new RestTemplate();
? ? }
}
? ? ? ??所有代碼都跟其它的provider一樣檩赢,唯獨(dú)多了一個(gè)bean的配置吕嘀。我們先不說(shuō)這個(gè)RestTemplate是什么,我們先看我們的HelloService贞瞒,
package com.zuikc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
?* @ClassName HelloService
?* @Description 我們提供咨詢和培訓(xùn)服務(wù)偶房,關(guān)于本文有任何困惑,請(qǐng)關(guān)注并聯(lián)系“碼農(nóng)星球”
?* @Author 碼農(nóng)星球
?**/
@RestController
public class HelloService {
? ? @Autowired RestTemplate restTemplate;
? ? @RequestMapping(value = "/hello")
? ? public String getHelloContent() {
? ? ? ? return restTemplate.getForObject("http://hello-service/hello",String.class);
? ? }
}
? ? ? ??在這個(gè)HelloService中军浆,我們要完成一件事情棕洋,就是將http://localhost:9291/hello的請(qǐng)求,隨機(jī)分發(fā)到兩個(gè)provider乒融。而這個(gè)分發(fā)掰盘,在代碼層面就是通過(guò)RestTemplate去實(shí)現(xiàn)的。
? ? ? ??注意這個(gè)getForObject的方法中的第一個(gè)參數(shù)是個(gè)url赞季,這個(gè)url中的hello-service就是我們配置正在eureka中的服務(wù)名忘伞。
? ? ? ??現(xiàn)在,讓我們啟動(dòng)這個(gè)ribbon application钮追,首先可以看到eureka中有個(gè)這個(gè)ribbon服務(wù)痹升,
? ? ? ??其次,讓我們打開(kāi)地址:http://localhost:9291/hello典蜕,就可以看到ribbon的這個(gè)服務(wù)断盛,是在provider1和provider2中不停的切換了~~
? ? ? ??感謝關(guān)注“碼農(nóng)星球”。本文版權(quán)屬于“碼農(nóng)星球”愉舔。我們提供咨詢和培訓(xùn)服務(wù)钢猛,關(guān)于本文有任何困惑,請(qǐng)關(guān)注并聯(lián)系我們轩缤。