概要
當請求數量大,高併發時,爲減輕服務器壓力,可以增加微服務部署數量,在請求客戶端通過ribbon將請求分配到各個微服務。
開發要點:
- 依賴ribbon
- ribbon的spring配置
- @LoadBalanced標註RestTemplate
- 請求微服務語法:http://微服務ID/請求路徑1/請求路徑2
1.maven依賴
實現調用微服務負載均衡的主要依賴ribbon。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
......
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<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>
<!-- 實現負載均衡的ribbon依賴包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependency>
<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配置文件
關注ribbon的配置。
server:
port: 8001 # 服務器端口
spring:
application:
name: app-server # 微服務名稱
mvc: #定義視圖解析器的規則
view:
prefix: classpath:/templates/ #文件前綴,templates是thymeleafd的默認路徑
suffix: .html #文件後綴
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka/ # 治理客戶端服務域
ribbon:
OkToRetryOnAllOperations: false #對所有操作請求都進行重試,默認false
ReadTimeout: 2000 #負載均衡超時時間,默認值5000 # 超過則會斷路
ConnectTimeout: 1000 #ribbon請求連接的超時時間,默認值2000
MaxAutoRetries: 0 #對當前實例的重試次數,默認0
MaxAutoRetriesNextServer: 1 #對切換實例的重試次數,默認1
3.實現負載均衡的RestTemplate
@LoadBalanced標註RestTemplate,就可以實現ribbon負載均衡。
package com.zyf.appserver.config;
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 RestTemplateConfig {
/**restTemplate負載均衡訪問微服務*/
@Bean("servcieRestTemplate")
@LoadBalanced // ribbon負載均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4.RestTemplate調用微服務語法
要實現負載均衡調用微服務,調用的時候就不能指定IP和端口,而是指定微服務的ID。至於那個微服務實例來處理請求,有ribbon分配。
在寫url的時候將微服務id取代IP和端口,http://微服務ID/請求路徑1/請求路徑2。
例如,service-user作爲微服務ID:
restTemplate.getForObject("http://service-user/userRestController/user/{id}", User.class, i);
另外,service-user微服務註冊起碼兩個或兩個以上。先用9001啓動service-user,然後修改端口爲9002,再次啓動service-user。
微服務搭建參考:SpringBoot學習8.3-搭建eureka微服務。
如下圖,ID爲service-user的微服務有兩個。
4.測試
請求端代碼:
// rest請求模板-負載均衡調用
@Autowired
private RestTemplate servcieRestTemplate;
@RequestMapping(value = "/getUser/{id}")
public User getUser(@PathVariable int id) {
User user2 = null;
for(int i =1;i<=10;i++){
user2 =
servcieRestTemplate.getForObject("http://service-user/userRestController" + "/user/{id}", User.class, i);
}
return user2;
}
微服務端代碼:
@RestController
@RequestMapping("/userRestController")
public class UserRestController {
@GetMapping(value = "/user/{id}")
public ResponseEntity<User> getUser2(@PathVariable int id) {
System.out.println("用戶id=" + id);
User user = new User(1, "李四", 1, "rest風格獲取用戶");
HttpHeaders headers = new HttpHeaders();
headers.add("issuccess", "true");// 設置響應頭
// ResponseEntity 封裝錯誤消息和狀態碼
return new ResponseEntity<User>(user, headers, HttpStatus.OK);
}
}
微服務9001日誌:
微服務9002日誌:
可見請求平均分配帶9001和9002兩個微服務上了。
github:https://github.com/zhangyangfei/spring-cloud-learn.git 中的cloud-parent工程。