SpringCloud無廢話入門02:Ribbon負載均衡

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中不停的切換了~~

        感謝關注「碼農星球」。本文版權屬於「碼農星球」。咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系咱們。

相關文章
相關標籤/搜索