1. 程式人生 > >【微服務】之四:輕鬆搞定SpringCloud微服務-負載均衡Ribbon

【微服務】之四:輕鬆搞定SpringCloud微服務-負載均衡Ribbon

對於任何一個高可用高負載的系統來說,負載均衡是一個必不可少的名稱。在大型分散式計算體系中,某個服務在單例的情況下,很難應對各種突發情況。因此,負載均衡是為了讓系統在效能出現瓶頸或者其中一些出現狀態下可以進行分發業務量的解決方案。在SpringCloud 體系當中,加入了Netflix公司的很多優秀產品,其中一個就是針對於服務端進行負載均衡的Ribbon。

本系列博文目錄

相關簡介

負載均衡簡介

負載均衡:英文名稱為Load Balance, 建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。
負載均衡帶來的好處很明顯:

Ribbon簡介

Ribbon是Netflix開源的一款用於客戶端軟負載均衡的工具軟體。Spring Cloud對Ribbon進行了一些封裝以更好的使用Spring Boot的自動化配置理念。

Spring Cloud Ribbon 簡介

Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。它是一個基於HTTP和TCP的客戶端負載均衡器。它可以通過在客戶端中配置ribbonServerList來設定服務端列表去輪詢訪問以達到均衡負載的作用。

開始起飛

起飛之前,先說明一下,本專案前幾篇文章中已經構建了相關子專案包括:註冊中心、配置中心。本文中繼續可以使用。

建立兩個伺服器

需要建立兩個一模一樣的伺服器,讓客戶端按照不同的機制進行分發,達到負載均衡的效果。我們約定兩個子專案名稱:
cloud-hyh-service-1 埠號:8071
cloud-hyh-service-2 埠號:8072
對於服務名稱設定一樣:cloud-service ,其他業務都一樣,可以複製。【埠號不一樣】

pom.xml檔案配置

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</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>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

伺服器一引數配置

#服務註冊中心配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
  instance:
    appname: cloud-service
    lease-renewal-interval-in-seconds: 1

server:
  port: 8071

spring:
  application:
    name: cloud-service

伺服器二引數配置

#服務註冊中心配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
  instance:
    appname: cloud-service

server:
  port: 8072

spring:
  application:
    name: cloud-service

說明:與配置一其實基本一樣,只不過將埠號配置成 8072

伺服器入口配置Application.yml

/**
 * @Description : 
 * @Author hanyahong
 * @Date 2017/12/7- 17:35
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceTwoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceTwoApplication.class, args);
    }
}

新建測試API類

/**
 * @Description :測試RibbonTest API
 * @Author hanyahong
 * @Date 2017/12/7- 17:40
 */
@RestController
@RequestMapping(value = "/ribbon")
public class RibbonTestApi {

    /**
     * 獲取部落格名稱API
     *
     * @return 相關資訊
     */
    @RequestMapping(value = "name", method = RequestMethod.GET)
    public String getMyBlogNameApi() {
        return "千萬之路剛開始-www.hanyahong.com-beijing"+"該伺服器埠號:8071";
    }
}


備註:兩臺伺服器,除了返回的伺服器埠號 8071 8072不同之外,其他都相同,就是為了看到效果。

建立測試客戶端

建立一個子專案,cloud-hyh-ribbon-client ,主要用來測試ribbon客戶端負載。

pom檔案配置

在pom檔案中加入以下依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</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>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
     <plugins>
         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
     </plugins>
 </build>

配置檔案application配置

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
  instance:
    appname: ribbon-client

server:
  port: 8092

spring:
  application:
    name: ribbon-client

配置子專案啟動類

/**
 * @Description :啟動類,示範負載均衡伺服器
 * @Author hanyahong
 * @Date 2017/12/7- 17:00
 */
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonServiceApplication {

    public static void main(String[] args) {

        SpringApplication.run(RibbonServiceApplication.class, args);
    }

    /**
     * Spring提供的用於訪問Rest服務的客戶端
     * @return
     */
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

說明:

RestTemplate是Spring提供的用於訪問Rest服務的客戶端。RestTemplate提供了多種便捷訪問遠端Http服務的方法,能夠大大提高客戶端的編寫效率。呼叫RestTemplate的預設建構函式,RestTemplate物件在底層通過使用java.net包下的實現建立HTTP 請求,可以通過使用ClientHttpRequestFactory指定不同的HTTP請求方式。
ClientHttpRequestFactory介面主要提供了兩種實現方式,一種是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)建立底層的Http請求連線,還有一種方式是使用HttpComponentsClientHttpRequestFactory方式,底層使用HttpClient訪問遠端的Http服務,使用HttpClient可以配置連線池和證書等資訊。

@LoadBalanced 註解加在RestTemplate上面,這個註解會自動構造LoadBalancerClient介面的實現類並註冊到Spring容器中。

建立介面API

/**
 * @Description : 測試客戶端負載均衡的介面API
 * @Author hanyahong
 * @Date 2017/12/7- 18:01
 */
@RestController
@RequestMapping(value = "/test")
public class TestRibbonApi {
    /**
     * 注入RestTemplate
     */
    @Autowired
    RestTemplate restTemplate;


    @RequestMapping(value = "/blog/name" ,method = RequestMethod.GET)
    public String testGetNameOfBlog(){
        String url="http://CLOUD-SERVICE/ribbon/name";
        return restTemplate.getForObject(url,String.class);
    }
}

注意:這個程式碼中 url 設定的是 上面提到的伺服器的服務名。

啟動專案群進行測試

經過全面的配置,伺服器全面配置完畢,包括一個註冊中心、一個配置中心、兩個相同配置的伺服器、一臺測試客戶端負載均衡的測試伺服器。
啟動成功以後會在註冊中心看到。
image.png

通過訪問客戶端地址:http://localhost:8092/test/name 就可以訪問。效果如下:
image.png
重新整理一次:

image.png

至此所有配置成功。測試結果也成功。

本文原始碼

Github原始碼:https://github.com/hanyahong/spring-cloud-microservice

相關推薦

服務輕鬆SpringCloud服務-負載均衡Ribbon

對於任何一個高可用高負載的系統來說,負載均衡是一個必不可少的名稱。在大型分散式計算體系中,某個服務在單例的情況下,很難應對各種突發情況。因此,負載均衡是為了讓系統在效能出現瓶頸或者其中一些出現狀態下可以進行分發業務量的解決方案。在SpringCloud 體系當中,加入了Netflix公司的很多優秀產品,其中

服務輕鬆SpringCloud服務-API閘道器zuul

通過前面幾篇文章的介紹,我們可以輕鬆搭建起來微服務體系中比較重要的幾個基礎構建服務。那麼,在本篇博文中,我們重點講解一下,如何將所有微服務的API同意對外暴露,這個就設計API閘道器的概念。 本系列教程 閘道器名稱解釋 閘道器(Gateway)又稱網間聯結器、協議轉換器。閘道器在網路層以上實現網路互連,

服務輕鬆SpringCloud服務-呼叫遠端元件Feign

上一篇文章講到了負載均衡在Spring Cloud體系中的體現,其實Spring Cloud是提供了多種客戶端呼叫的元件,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、

服務輕鬆SpringCloud服務-API許可權控制

許可權控制,是一個系統當中必須的重要功能。張三隻能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定選單。這就要求對整個體系做一個完善的許可權控制體系。該體系應該具備針區分使用者、許可權、角色等各種必須的功能。 本系列教程 本系列為連載文章,閱讀本文之前強烈建議您先閱讀前面幾篇。 上一節我們講到AP

服務從零開始,輕鬆SpringCloud服務-配置中心

官方解釋 Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration

服務從零開始,輕鬆SpringCloud服務系列--註冊中心(一)

微服務體系,有效解決專案龐大、互相依賴的問題。目前SpringCloud體系有強大的一整套針對微服務的解決方案。本文中,重點對微服務體系中的服務發現註冊中心進行詳細說明。本篇中的註冊中心,採用Netflix 公司的Eureka。 註冊中心簡介 Netflix Eureka:雲端負載均衡,一個基於 RES

框架之一從零開始,輕鬆SpringCloud服務系列--開山篇(spring boot 小demo)

Spring頂級框架有眾多,那麼接下的篇幅,我將重點講解SpringCloud微框架的實現 Spring 頂級專案,包含眾多,我們重點學習一下,SpringCloud專案以及SpringBoot專案 ————————————————————main———————————————————— 一

框架之一從零開始,輕鬆SpringCloud框架系列--開山篇

一、SpringCloud專案簡介   Spring Cloud:     微服務工具包,為開發者提供了在分散式系統的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排等開發工具包。   Spring Boot:     旨在簡化建立產品級的 Spring

服務輕松SpringCloud服務-API權限控制

cat https lte urn 錯誤碼 netflix req ons 體系 權限控制,是一個系統當中必須的重要功能。張三只能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定菜單。這就要求對整個體系做一個完善的權限控制體系。該體系應該具備針區分用戶、權限、角色等各種

服務輕松SpringCloud服務-API網關zuul

公司 create lan ice 子項目 專題 系統 如果 rose 通過前面幾篇文章的介紹,我們可以輕松搭建起來微服務體系中比較重要的幾個基礎構建服務。那麽,在本篇博文中,我們重點講解一下,如何將所有微服務的API同意對外暴露,這個就設計API網關的概念。 本系列教

深入Java虛擬機器類初始化

    類初始化是類載入過程的最後一個階段,到初始化階段,才真正開始執行類中的Java程式程式碼。虛擬機器規範嚴格規定了有且只有四種情況必須立即對類進行初始化: 遇到new、getstatic、putstatic、invokestatic這四條位元組碼指令時,

深入Java虛擬機器類載入機制

    我們來看得到該結果的步驟。首先在準備階段為類變數分配記憶體並設定類變數初始值,這樣A和B均被賦值為預設值0,而後再在呼叫<clinit>()方法時給他們賦予程式中指定的值。當我們呼叫Child.b時,觸發Child的<clinit>()方法,根據規則2,在此之前,要先執行完其父

JAVA進階架構師指南垃圾回收GC

前言   在【JAVA進階架構師指南】系列二和三中,我們瞭解了JVM的記憶體模型以及類載入機制,其中在記憶體模型中,我們說到,從執行緒角度來說,JVM分為執行緒私有的區域(虛擬機器棧/本地方法棧/程式計數器)和執行緒公有區域(方法區和java堆),其中執行緒私有區域記憶體隨著執行緒的結束而跟著被回收,GC主要

如何安裝和配置打印服務使用組策略部署打印機

fff shadow 賬號 hat 對話框 除了 c4c alt main 如何安裝和配置打印服務器之四:使用組策略部署打印機 ?Lander Zhang 專註外企按需IT基礎架構運維服務,IT Helpdesk 實戰培訓踐行者http://blog.51cto.com/l

spring系列6bean的初始化和銷燬方法

bean的生命週期:bean建立---初始化----銷燬的過程 容器管理bean的生命週期:我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法 構造(物件建立): 單例項:在容器啟動的時候建立物件 多例項:在每次獲

spring系列8屬性賦值

一:使用@Value賦值     基本數值     可以寫SpEL; #{}     可以寫${};取出配置檔案【properties】中的值(在執行環境變數裡面的值) demo:set,get省略 @Value("張三") private String na

spring系列14spring宣告式事務實現原理剖析

通過上一節事務環境搭建,我們知道,在搭建的5個步驟中,有兩個是spring為我們提供底層去稍作配置,然後使用的, 這兩個操作涉及的便是: @EnableTransactionManagement PlatformTransactionManager 其中,Platfor

spring系列7生命週期-BeanPostProcessor原理以及在spring底層中的運用

本章節重點說一下我們自定義的BeanPostProcessor的執行機制和呼叫棧。 事前準備: 1.自定義beanPostProcessor 2.註冊自定義的beanPostProcessor到容器中 1.自定義beanPostProcessor @Componen

[原創]unity3D學習功能實現圖片的旋轉/2d物體的旋轉

目標:滑鼠點選後,圖片朝向滑鼠點選的地方 涉及到:Mathf.Atan2(反正是計算角度的),rotation,Quaternion.Slerp 思路:下面的圖片是x軸對稱的,所以這個旋轉也是以圖片箭頭開始旋轉的。(為什麼?可能跟Atan2有關),根據滑鼠點選的位置與圖片的位置計算旋轉角度,在Quaterni

[原創]unity3D學習功能實現例項化

用處:一般當場景出現兩個及兩個以上,或者會出現重複的物體的時候,用例項化比較方便 目標:滑鼠點選後,在滑鼠點選的位置出現一個小球 涉及到:預製件,Instantiate(預製件,newVector(