1. 程式人生 > 實用技巧 >ribbo--eureka註冊中心消費者

ribbo--eureka註冊中心消費者

ribbo--eureka註冊中心消費者

Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕鬆地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務呼叫。Spring Cloud Ribbon雖然只是一個工具類框架,它不像服務註冊中心、配置中心、API閘道器那樣需要獨立部署,但是它幾乎存在於每一個Spring Cloud構建的微服務和基礎設施中。因為微服務間的呼叫,API閘道器的請求轉發等內容,實際上都是通過Ribbon來實現的,包括後續我們將要介紹的Feign,它也是基於Ribbon實現的工具。所以,對Spring Cloud Ribbon的理解和使用,對於我們使用Spring Cloud來構建微服務非常重要。

圖解

不使用ribbon

使用ribbon

ribbon 提供了負載均衡和重試功能, 它底層是使用 RestTemplate 進行 Rest api 呼叫

RestTemplate

RestTemplate 是StringBoot提供的一個Rest遠端呼叫工具

它的常用方法:

  • getForObject("http://....", 轉換型別, 提交的引數) get請求
  • postForObject("http://....", 提交的引數, 轉換型別) post請求

為了方便呼叫, 我們一般會注入IOC容器進行使用

//建立 RestTemplate 例項,並存入 spring 容器
@Bean
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

搭建消費者

1. 依賴

在建立springboot專案的時候, 我們需要的主要依賴有

Eureka discovery Client, spring web, Ribbon [Maintenance]

其中第三個Ribbon [Maintenance]依賴可選, 因為Eureka discovery Client已經包含了此依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

建立專案後springboot會自動生成dependencyManagement標籤

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.配置檔案

除了配置埠即名稱外, 和提供者一樣, 都要配置這個:

spring:
  application:
    name: ribbon

server:
  port: 3001 # 埠

eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka

3.RestTemplate注入容器

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

4. 編寫controller測試

// GET請求
@GetMapping("/item-service/{orderId}")
public JsonResult<List<Item>> getItems(@PathVariable String orderId) {
    log.info("呼叫後臺商品服務, 獲取商品列表");
    JsonResult r = restTemplate.getForObject(
        "http://localhost:8001/{1}",
        JsonResult.class,
        orderId);
    return r;
}

// POST請求
@PostMapping("/item-service/decreaseNumber")
public JsonResult decreaseNumber(@RequestBody List<Item> items) {
    log.info("呼叫後臺商品服務, 減少商品庫存");
    JsonResult r = restTemplate.postForObject(
        "http://localhost:8001/decreaseNumber",
        items,
        JsonResult.class);
    return r;
}

5.測試

我們訪問 http://localhost:3001/item-service/12345

http://localhost:3001//item-service/decreaseNumber

測試結果略, 因為專案不同, 請求的結果也不同, 自行測試即可