1.白話負載均衡web
在上一篇的介紹中,咱們建立了兩個如出一轍的服務提供者:Provider1和Provider2,而後它們提供的服務也如出一轍,都叫Hello-Service。爲何同樣的服務咱們要部署兩遍?其實理由很簡單:算法
好比,在一個電商網站中,一開始的時候,用戶並無那麼多,咱們只須要把網站部署在一臺服務器上就能夠了。可是隨着用戶量愈來愈大,一臺服務器就再也知足不了要求了,這樣,咱們就須要把這個如出一轍的網站部署在多臺服務器上,可是對外它們提供的服務卻都是同樣的,包括域名(或者說IP地址)也必須是惟一的。spring
因此,上一篇中的兩個provider,在實際生產環境中,甚至是同一個項目的複製而已,僅僅只是改了配置文件。在咱們的介紹中,咱們只是爲了介紹方便,或者說便於調試,才建立了兩個項目。固然,裏面的服務和代碼都是如出一轍的。apache
以上,若是用白話來說就是:將相同的服務部署在多臺服務器上,對外又只暴露一個惟一的地址,這種實現就叫作:負載均衡。服務器
若是必定要畫一個圖來表示,那麼它大體長這樣,架構
2.Ribbonapp
那咱們怎麼把負載均衡引入到咱們的軟件架構中呢?一種當時是本身寫代碼實現。另外一種固然是利用前人已經寫好的框架了。Ribbon就是這樣一個框架。負載均衡
Ribbon是Netflix發佈的開源項目,主要功能就是提供客戶端的軟件負載均衡算法,將其它服務提供者鏈接在一塊兒。Ribbon經過在配置文件中列出Load Balancer(簡稱LB)後面全部的服務提供者,而後幫助咱們基於某種規則(如簡單輪詢,隨即鏈接等)去鏈接這些機器。框架
3.Ribbon負載均衡實現maven
要讓ribbon實現負載均衡,首先就須要將ribbon自己當成一個服務引入到eureka中。
建立一個web的子模塊,以下:
它跟其它的項目,從類型上來講沒什麼區別。
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
能夠看到,在這個配置文件中,咱們幹了兩件事情,
1:將本身註冊都eureka中;
2:在listOfServers中,將要負載的兩個服務地址配置出來;
如今,讓咱們建立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 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」
* @Author 碼農星球
**/
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
全部代碼都跟其它的provider同樣,惟獨多了一個bean的配置。咱們先不說這個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 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」
* @Author 碼農星球
**/
@RestController
public class HelloService {
@Autowired RestTemplate restTemplate;
@RequestMapping(value = "/hello")
public String getHelloContent() {
return restTemplate.getForObject("http://hello-service/hello",String.class);
}
}
在這個HelloService中,咱們要完成一件事情,就是將http://localhost:9291/hello的請求,隨機分發到兩個provider。而這個分發,在代碼層面就是經過RestTemplate去實現的。
注意這個getForObject的方法中的第一個參數是個url,這個url中的hello-service就是咱們配置正在eureka中的服務名。
如今,讓咱們啓動這個ribbon application,首先能夠看到eureka中有個這個ribbon服務,
其次,讓咱們打開地址:http://localhost:9291/hello,就能夠看到ribbon的這個服務,是在provider1和provider2中不停的切換了~~
感謝關注「碼農星球」。本文版權屬於「碼農星球」。咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系咱們。