使用ribbon實現負載均衡


使用ribbon之前的准備工作:

  1.你要有兩個服務,一個是服務消費方(下圖的xing-movie是消費方),一個是服務提供方(xing-user是服務提供者),並且服務提供方要有兩個實例,也就是xing-user有兩個實例,分別運行在8070和8071端口。

  2.所有服務注冊到eureka server中。

    

接下來我們在movie服務使用ribbon實現負載均衡調用中調用user服務,spring cloud使用ribbon很簡單

  1.引入依賴,因為user服務的pom.xml中引入了eureka的依賴,eureka的依賴包含了ribbon的依賴所以這一步省略

  2.在movie服務的啟動類中加入標紅的代碼,加入是為了在之后調用的時候可以直接@Autowired  restTemplate,順便提醒一下,@Autowired是 byType的,不是byName:

  

package com.xing.movie;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class SpringDemoApplication {

    @Bean @LoadBalanced public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }
}

 

  啟動類寫好之后我們去controller類中寫調用user服務的方法:

 

     @Autowired
    private RestTemplate restTemplate;

   @ApiOperation(value = "查詢用戶", notes = "查詢用戶")//方法說明
    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Movie.class)})//響應數據說明,可以有多個
    @ApiImplicitParam(name = "name", value = "用戶名", paramType = "path", required = true, dataType = "String")
    @GetMapping(value = "/findUerByName/{name}",produces = { "application/json;charset=UTF-8" })
    public User findUserByName(@PathVariable String name) {
        return this.restTemplate.getForObject("http://xing-user/user/findByName/"+name, User.class);
    }

 

  標紅的地方要注意使用的是user服務的spring.application.name,這里使用到的user服務在上一篇博客中有具體的代碼,最后一行代碼中的User.class是返回類型,如果報錯那就去user服務中把User類拷貝過來,到目前為止ribbon的簡答的負載均衡就搞定了,查看結果

可以看到已經成功的調用到了user服務,並返回了數據,這個時候我們只能說服務調用成功並不能說負載均衡。這個網頁我們多刷新幾遍,多做幾次請求,之后去查看后台數據會發現user1中的控制台打印了數據,user2的控制台也打印了數據,說明負載均衡成功。

簡單提一下spring cloud中ribbon的負載均衡算法默認是輪詢。那么我們不想使用輪詢怎么自定義呢?

我們首先需要創建一個class,根據官方文檔這個類必須在啟動類能掃描的范圍之外,所以這個class定義的位置如下:

RibbonConfig.java:

package com.xing.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

/**
* Copyright: Copyright (c) 2018 LanRu-Caifu
* @ClassName: RibbonConfig.java
* @Description: 自定義ribbon配置類
* @version: v1.0.0
* @author: zjx
* @date: 2018年11月2日 上午10:08:36
 */

@Configuration
public class RibbonConfig {
    
    @Autowired
    IClientConfig config;
    
    @Bean
    @ConditionalOnMissingBean
    public IRule ribbonRule(IClientConfig config) {
        System.out.println("-------ribbon自定義隨機------");
        return new RandomRule();
    }
}
RibbonConfig.java

movie服務的啟動類修改之后如下:

package com.xing.movie;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

import com.xing.config.RibbonConfig;

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "xing-user" , configuration = RibbonConfig.class)
public class SpringDemoApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }
}
SpringDemoApplication

最后啟動類測試,做了4次請求,user1打印了3次,user2打印了1次

 

還有其他的很多種配置方式,這里只簡單寫出這種,以后有空還會補充配置文件的方式等等

 源碼地址:https://github.com/OnlyXingxing/SpringCloud


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM