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
測試結果略, 因為專案不同, 請求的結果也不同, 自行測試即可