1. 程式人生 > >springCloud-Eureka-Ribbon

springCloud-Eureka-Ribbon

1.初識SpringCloud


這裡的簡介可看可不看

微服務是一種架構方式,最終肯定需要技術架構去實施。

微服務的實現方式很多,但是最火的莫過於Spring Cloud了。為什麼?

  • 後臺硬:作為Spring家族的一員,有整個Spring全家桶靠山,背景十分強大。
  • 技術強:Spring作為Java領域的前輩,可以說是功力深厚。有強力的技術團隊支撐,一般人還真比不了
  • 群眾基礎好:可以說大多數程式設計師的成長都伴隨著Spring框架,試問:現在有幾家公司開發不用Spring?SpringCloud與Spring的各個框架無縫整合,對大家來說一切都是熟悉的配方,熟悉的味道。
  • 使用方便:相信大家都體會到了SpringBoot給我們開發帶來的便利,而SpringCloud完全支援SpringBoot的開發,用很少的配置就能完成微服務框架的搭建

1.1.簡介

SpringCloud是Spring旗下的專案之一,官網地址:http://projects.spring.io/spring-cloud/

Spring最擅長的就是整合,把世界上最好的框架拿過來,整合到自己的專案中。

SpringCloud也是一樣,它將現在非常流行的一些技術整合到一起,實現了諸如:

  • 配置管理,

  • 服務發現,

  • 智慧路由,

  • 負載均衡,

  • 熔斷器,

  • 控制匯流排,

  • 叢集狀態等等功能。

    其主要涉及的元件包括:

  • Eureka:註冊中心

  • Zuul:服務閘道器

  • Ribbon:負載均衡

  • Feign:服務呼叫

  • Hystrix:熔斷器

以上只是其中一部分,架構圖:

在這裡插入圖片描述


下面來搭建Eureka叢集+負載均衡

在這裡插入圖片描述
在這裡插入圖片描述

方法一

在這裡插入圖片描述

**在這裡插入圖片描述**

方法二

在這裡插入圖片描述
在這裡插入圖片描述
方法一和二自己選擇一個,個人傾向於一,比較簡便

這樣叢集就搭建好了

在這裡插入圖片描述

以上的叢集自己以此類推,自己想搭幾個就寫幾個


開啟負載均衡

SpringCloud中已經幫我們集成了負載均衡元件:Ribbon,簡單修改程式碼即可使用。

什麼是Ribbon:

在這裡插入圖片描述
在這裡插入圖片描述

接下來,我們就來使用Ribbon實現負載均衡。

2.1 步驟:

  • 匯入jar包:eureka註冊中心自帶ribbon負載均衡器,無需重複匯入

  • 配置yml檔案:無需額外配置

  • 開啟ribbon負載均衡器:在restTemplate建立方法上新增

    @Bean
      @LoadBalanced  // 開啟負載均衡
      public RestTemplate restTemplate() {
          return new RestTemplate();
      }
    
  • 修改程式碼:
    在這裡插入圖片描述
    在這裡插入圖片描述
    —以上負載均衡就實現好了----

但是如何實現的負載均衡呢

接下來跟蹤原始碼
在這裡插入圖片描述
在這裡插入圖片描述
繼續跟入execute方法:發現獲取了8082埠的服務
在這裡插入圖片描述
再跟下一次,發現獲取的是8081:
在這裡插入圖片描述

負載均衡策略

Ribbon預設的負載均衡策略是簡單的輪詢,我們可以測試一下:
編寫測試類,在剛才的原始碼中我們看到攔截中是使用RibbonLoadBalanceClient來進行負載均衡的,其中有一個choose方法,是這樣介紹的:
在這裡插入圖片描述
現在這個就是負載均衡獲取例項的方法。

我們對注入這個類的物件,然後對其測試:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = UserConsumerDemoApplication.class)
public class LoadBalanceTest {

    @Autowired
    RibbonLoadBalancerClient client;

    @Test
    public void test(){
        for (int i = 0; i < 100; i++) {
            ServiceInstance instance = this.client.choose("user-service");
            System.out.println(instance.getHost() + ":" + instance.getPort());
        }
    }
}

結果:
在這裡插入圖片描述
符合了我們的預期推測,確實是輪詢方式。

我們是否可以修改負載均衡的策略呢?

繼續跟蹤原始碼,發現這麼一段程式碼:
在這裡插入圖片描述
我們看看這個rule是誰:
在這裡插入圖片描述
這裡的rule預設值是一個RoundRobinRule,看類的介紹:
在這裡插入圖片描述
這不就是輪詢的意思嘛。

我們注意到,這個類其實是實現了介面IRule的,檢視一下:
在這裡插入圖片描述
定義負載均衡的規則介面。

它有以下實現:
在這裡插入圖片描述
SpringBoot也幫我們提供了修改負載均衡規則的配置入口:
在這裡插入圖片描述

user-service:  
   ribbon:    
     NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式是:{服務名稱}.ribbon.NFLoadBalancerRuleClassName,值就是IRule的實現類。
再次測試,發現結果變成了隨機:
在這裡插入圖片描述