1. RestTemplate簡介
RestTemplate是Spring Resource中一個訪問第三方RESTful API介面的網路請求框架。
RestTemplate是用來消費REST服務的,RestTemplate的主要方法與RESTHTTP協議緊密關聯。
HTTP:HEAD、GET、POST、PUT、DELETE和OPTIONS等
RestTemplate:headForHeaders()、getForObject()、postForObject()、put()和delete()等
2. Ribbon簡介
負載均衡是指將負載分攤到各個執行單元上。
常見的負載均衡有兩種方式:
(1)獨立程式單元:通過負載均衡策略,將請求轉發到各個不同的執行單元上。如:Nginx;
(2)將負載均衡邏輯以程式碼的形式封裝到服務消費者的客戶端上,服務消費者客戶端維護了服務提供者的資訊列表。通過負載均衡策略將請求分攤給多個服務提供者,從而達到負載均衡的目的。
Ribbon是一個負載均衡元件,屬於上述的第二種方式,將負載均衡邏輯封裝在客戶端中,並且執行在客戶端的程式中。
在SpringCloud構建的微服務系統中,Ribbon作為服務消費者的負載均衡器,有兩種使用方式:
(1)和RestTemplate相結合
(2)和Feign相結合
Feign預設整合了Ribbon。
Ribbon主要子模組:
◊ ribbon-core:ribbon專案核心,主要包括負載均衡器介面定義、客戶端介面定義、內建發負載均衡實現等API;
◊ ribbon-eureka:為Eureka客戶端提供負載均衡實現類;
◊ ribbon-httpclient:對Apache的HttpClient進行封裝,提供包含負載均衡功能的REST客戶端;
◊ ribbon-loadbalancer:獨立使用或與其他模組一起使用負載均衡器API。
3. 使用RestTemplate和Ribbon消費服務
建立專案eureka-ribbon-client,通過RestTemplate來遠端呼叫eureka-client服務API介面。
新增依賴spring-cloud-starter-ribbon
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>libing</groupId> <artifactId>eureka-ribbon-client</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>eureka-ribbon-client</name> <description>Demo project for Spring Boot</description> <parent> <groupId>libing</groupId> <artifactId>libing-eureka</artifactId> <version>1.0.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
RestTemplate結合Ribbon開啟負載均衡:
package libing.eurekaribbonclient.common; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RibbonConfig { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
RibbonService使用restTemplate呼叫eureka-client的API介面:
package libing.eurekaribbonclient.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class RibbonService { @Autowired RestTemplate restTemplate; public String getPort() { return restTemplate.getForObject("http://eureka-client/helloworld", String.class); } }
package libing.eurekaribbonclient.controller; import libing.eurekaribbonclient.service.RibbonService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("ribbon") public class RibbonController { @Autowired RibbonService ribbonService; @GetMapping public String getPort(){ return ribbonService.getPort(); } }
啟動執行:
執行兩個eureka-client例項
在瀏覽器中開啟地址 http://localhost:8764/ribbon,交替顯示:
port:8762
port:8763
4. LoadBalancerClient簡介
負載均衡的核心類為LoadBalancerClient,LoadBalancerClient可以獲取負載均衡的服務提供者的例項資訊。
package libing.eurekaribbonclient.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("ribbon") public class RibbonController { @Autowired private LoadBalancerClient loadBalancer; @GetMapping public String getPort() { ServiceInstance instance = loadBalancer.choose("eureka-client"); return instance.getHost() + ":" + instance.getPort(); } }
LoadBalancerClient的choose("eureka-client")可以交替得到eureka-client的兩個服務例項的資訊。
負載均衡器LoadBalancerClient是從Eureka Client獲取服務註冊列表資訊的,並將服務註冊列表資訊快取一份。在LoadBalancerClient呼叫choose()方法時,根據負載均衡策略選擇一個服務例項的資訊,從而進行負載均衡。
示例程式碼:libing-eureka-ribbon.zip