【SpringCloud】【Hoxton】Ribbon

1 基礎環境準備
2 一文讀懂Eureka
3 Zookeeper註冊中心
4 Consule註冊中心
5 Ribbon
6 OpenFegin
7 Hystrix全面解析

1 Ribbon介紹

Spring Cloud Ribbon是基於 Netflix Ribbon實現的一套客戶端負載均衡的工具。簡單的說, Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟件負載均衡算法和服務調用。 Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出 Load Balancer(簡稱LB)後面所有的機器, Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨機連接等)去連接這些機器。我們很容易使用 Ribbon實現自定義的負載均衡算法。

2 LB負載均衡( Load Balance)是什麼

簡單的說就是將用戶的請求平雄的分配到多個服務上,從而達到系統的HA(高可用)。常見的負載均衡有軟件 Nginx,LVS,硬件F5等。

3 Ribbon本地負載均衡客戶端 VS Nginx服務端負載均衡區別

Nginx是服務器負載均衡,客戶端所有請求都會交給 nginx,然後由 nginx實現轉發請求。即負載均衡是由服務端實現的。Ribbon本地負載均衡,在調用微服務接口時候,會在註冊中心上獲取註冊信息服務列表之後存到JVM本地,從而在本地實現RPC遠程服務調用技術。

4 引入包

<!--eureka 客戶端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在這裏插入圖片描述

5 演示

5.1 修改eureka-server

(1) 修改application.yml

server:
  port: 7000
eureka:
  instance:
    #服務名稱
    hostname: eureka-server-master
  client:
    serviceUrl:
      #eureka註冊中心地址
      defaultZone: http://localhost:7000/eureka/  #配置URL
    #不註冊自己
    register-with-eureka: false
    #服務發現,false表示自己不從Eureka服務中獲取註冊信息
    fetch-registry: false

(2) 啓動Eureka-server
在這裏插入圖片描述

5.2 修改provider-payment服務

(1) application.yml

server:
  port: 9000
spring:
  application:
    name: provider-payment-service
  datasource:
    url:  jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
eureka:
  client:
    #是否將自己註冊到EurekaServer
    register-with-eureka: true
    #是否從EurekaServer獲取已有的註冊服務
    fetch-registry: true
    #註冊地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: provider-payment
    prefer-ip-address: true

(2) 新建RibbonServerController

@RestController
@RequestMapping("/ribbon")
public class RibbonServerController {
 
    @Value("${server.port}")
    private String port;
    @GetMapping("/server")
    public String server(){
        return "ribbon server port is "+port;
    }
}

(3) 啓動服務
在這裏插入圖片描述

5.3 修改provider-payment-slave服務

(1) 修改application.yml

server:
  port: 9001
spring:
  application:
    name: provider-payment-service
  datasource:
    url:  jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
eureka:
  client:
    #是否將自己註冊到EurekaServer
    register-with-eureka: true
    #是否從EurekaServer獲取已有的註冊服務
    fetch-registry: true
    #註冊地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: provider-payment-slave
    prefer-ip-address: true

(2) 新建RibbonServerController

@RestController
@RequestMapping("/ribbon")
public class RibbonServerController {
    @Value("${server.port}")
    private String port;
    @GetMapping("/server")
    public String server(){
        return "ribbon server port is "+port;
    }
}

(3) 啓動服務
在這裏插入圖片描述

5.4 修改customer-order服務

(1) application.yml

server:
  port: 8000
spring:
  application:
    name: customer-order-service
eureka:
  client:
    #是否將自己註冊到EurekaServer
    register-with-eureka: true
    #是否從EurekaServer獲取已有的註冊服務
    fetch-registry: true
    #註冊地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: order-service
    prefer-ip-address: true

(2) RibbonClientController

@RestController
@RequestMapping("/ribbon")
public class RibbonClientController {
    @Autowired
    private RestTemplate restTemplate;
    private static final String RIBBON_SERVER_URL = "http://provider-payment-service/ribbon/server";
    @GetMapping("/client")
    public String client() {
        ResponseEntity<String> response =
                restTemplate.getForEntity(RIBBON_SERVER_URL, String.class);
        return response.getBody();
    }
}

(3) 啓動主類
在這裏插入圖片描述

在這裏插入圖片描述
(4) 測試
在這裏插入圖片描述

在這裏插入圖片描述

6 負載均衡算法

6.1 算法介紹

RoundRobinRule(輪詢算法)
RandomRule(隨機算法)
AvailabilityFilteringRule():會先過濾由於多次訪問故障而處於斷路器跳閘狀態的服務,還有併發的連接數量超過閾值的服務,然後對剩餘的服務列表按照輪詢策略進行訪問
WeightedResponseTimeRule():根據平均響應的時間計算所有服務的權重,響應時間越快服務權重越大被選中的概率越高,剛啓動時如果統計信息不足,則使用RoundRobinRule策略,等統計信息足夠會切換到WeightedResponseTimeRule
RetryRule():先按照RoundRobinRule的策略獲取服務,如果獲取失敗則在制定時間內進行重試,獲取可用的服務。
BestAviableRule():會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務
ZoneAvoidanceRule():默認規則,符合判斷server所在區域的性能和server的可用性選擇服務器

6.2 隨機算法,修改配置文件

@Configuration
public class ApplicationConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    @Bean
    public IRule  rule(){
        return new RandomRule();
    }
}

6.3 測試略

GITHUB

#分支Ribbon-enviroment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章