SpringCloud入門(2)Ribbon

Ribbon是客戶端的負載均衡器,消費者能夠經過服務別名調用服務時,須要Ribbon作負載均衡來以某種機制訪問實際的服務調用地址。java

簡單類比,咱們去找Tony老師,通常理髮店都會有多個Tony老師。可是也會有一個相似前臺的工做人員爲咱們安排有空的Tony老師理髮。工做人員就是相似Ribbon,是按照順序安排呢,仍是隨機安排呢。算法

Ribbon + Eureka

建立項目

一樣建立一個Ribbon的空模塊,而後在Ribbon空模塊下建立一個ribbon-consume9101 子模塊。在父類也就是空模塊的pom文件中加入依賴spring

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>

當你引入了Eureka相關的依賴的時候其實就已經把Ribbon的依賴引入進來了,因此若是使用的是Ribbon + Eureka,能夠不用寫上面的依賴也能運行。服務器

建立完成後總體的項目結構如圖所示app

配置文件

application.yml負載均衡

server:
  port: 9101

spring:
  application:
    name: ribbon-consume
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
  instance:
    instance-id: ribbon-consume9101

啓動和業務類

注意咱們的服務的提供者是eureka-provide 服務,這個服務名字可能單取provide 更準確點,之後項目重構的時候可能會修改。dom

涉及到服務與服務之間的調用,通常會選擇使用RestTemplate ,同時須要把它注入Spring容器中,因此選擇使用配置類ide

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced       //負載均衡須要的註解
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

接下來就是主啓動類測試

@SpringBootApplication
@EnableEurekaClient
@RestController
public class RibbonConsume9101 {
    final String PROVIDE_URL = "http://eureka-provide";

    RestTemplate restTemplate;

    public RibbonConsume9101(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/ribbon/consume")
    public String getInfo() {
        return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]";
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsume9101.class, args);
    }
}

測試

  1. 開啓Eureak註冊中心EurekaServer8001
  2. 開啓3個不一樣端口的服務提供者EurekaProvide7001EurekaProvide7002 , EurekaProvide7003
  3. 開啓剛剛創建的Ribbon消費者RibbonConsume9101

首先看下Eureka註冊中心,能夠看到3個服務提供者,1個消費者都已經註冊到Eureka。fetch

接着消費端訪問接口輪詢,也是默認規則)。>http://localhost:9101/ribbon/...

自定義配置類

上述調用服務的時候明顯是輪詢的方式,那若是想要其它方式去調用呢,這時候就須要自定義配置類。

Ribbon主要有6個組件

  • ServerList: 定義獲取服務器列表
  • ServerListFilter: 對ServerList列表進行二次過濾
  • ServerListUpdater: 定義服務更新策略
  • Iping: 檢查服務列表是否存活
  • IRlue: 根據算法選擇調用服務列表中的某一個服務
  • ILoadBalancer: 軟件負載均衡器入口,整合以上全部的組件實現負載功能
@Configuration
public class RibbonCustomConfig {
    @Bean
   public IRule ribbonRule() {
       return new RandomRule();
   }
}

IRlue 接口就是以什麼樣的規則調用服務提供者,能夠看下該接口的實現類

怎麼讓這個配置文件被Ribbon感知到呢,就須要利用@RibbonClient 註解。創建一個空的註解類,加上註解和配置類就可以自定義Ribbon配置。

@Configuration
@RibbonClient(name = "eureka-provide", configuration = RibbonCustomConfig.class)
public class RibbonConfig {
}

這裏的名字就是咱們須要調用的服務端的配置文件中的springcloud.application.name 的值。須要注意的是,在官方文檔裏面有這樣一段話

在這個例子中翻譯過來就是RibbonCustomConfig 若是和主啓動類在同一個包下,就會被掃描進Spring中,這樣會致使配置文件會被全部的@RibbonClients 所共享。固然也能夠用@ComponentScan 把配置文件排除在外。

重啓RibbonConsume9101 服務,其它的不用動,一樣調用消費端訪問接口http://localhost:9101/ribbon/...

點的時候,啥,怎麼一直調用的是7001端口,難道其它服務掛掉了,能夠看到後面明顯加快了點的速度,最後還好沒有翻車,確實是改爲了隨機規則。

自定義配置文件

除了經過配置類來自定義Ribbon外,還能夠經過配置文件來自定義

這裏clientName 一樣是須要調用的服務端的配置文件中的springcloud.application.name 的值。 若是是徹底本身寫的類呢,須要實現對應的接口,這裏一樣採用Netflix寫好的RandomRule 類。

RibbonCustomConfigRibbonConfig刪掉或者所有註釋掉均可以,修改配置文件

server:
  port: 9101

spring:
  application:
    name: ribbon-consume
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
  instance:
    instance-id: ribbon-consume9101

#其實就是加了下面的內容
eureka-provide:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

其中eureka-provide 就是clientName。接着同樣重啓RibbonConsume9101 服務,其它的不用動,一樣調用消費端訪問接口http://localhost:9101/ribbon/...

值得注意的是,在配置文件中配置的變量是要比配置類中的優先級要高的。

Ribbon

上面是消費者端和服務端都註冊進了Eureka,至關於消費者經過Eureka去找到了其它服務提供者的服務。那在真正業務中接受了新的消費者端,並無註冊進Eureka,怎麼解決這個問題呢?

先來看看沒有註冊進去會發生什麼狀況,想都不用想確定是直接報錯了

建立項目

一樣在Ribbon父模塊下面創建一個子模塊

配置文件

由於不用註冊進Eureka,因此配置文件也要作相應的修改

server:
  port: 9102

spring:
  application:
    name: ribbon-consume-without-eureka

#禁用掉Eureka,其實禁用不由用都不影響,由於根本就沒導入
ribbon:
  eureka:
    enabled: false

啓動和業務類

一樣須要導入RestTemplate 因此能夠直接複製上一個子模塊

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

主啓動類也能夠直接複製,不須要用到Eureka,去掉@EnableEurekaClient 註解並修改類名便可

@SpringBootApplication
@RestController
public class RibbonConsumeWithoutEureka9102 {
    final String PROVIDE_URL = "http://eureka-provide";

    RestTemplate restTemplate;
    
    public RibbonConsumeWithoutEureka9102(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/ribbon/consume")
    public String getInfo() {
        return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]";
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumeWithoutEureka9102.class, args);
    }
}

那怎樣消費者調用的時候怎麼知道去哪找提供者的服務呢,就須要動配置文件了

server:
  port: 9102

spring:
  application:
    name: ribbon-consume-without-eureka
ribbon:
  eureka:
    enabled: false

#如下爲增長內容
eureka-provide:
  ribbon:
    listOfServers: localhost:7001, localhost:7002, localhost:7003

其中eureka-provide 就是須要調用的服務端的配置文件中的springcloud.application.name 的值

開啓RibbonConsume9102 服務,其它的不用動,調用消費端訪問接口http://localhost:9102/ribbon/... ,能夠看到也是可以按照默認輪詢的方式調用服務。

創做不易,若是對你有幫助,歡迎點贊,收藏和分享啦!

下面是我的公衆號,有興趣的能夠關注一下,說不定就是你的寶藏公衆號哦,基本2,3天1更技術文章!!!

相關文章
相關標籤/搜索