SpringCloud Hoxton版微服務-RestTempalte + @LoadBlanced 實現負載均衡
阿新 • • 發佈:2020-12-22
技術標籤:Spring Cloud系列javaspringcloudconsulresttemplate
RestTempalte + @LoadBlanced 實現負載均衡
一、服務提供者註冊
首先我們將服務提供者註冊到服務中心,為實現服務之間呼叫的負載均衡,我們同時註冊兩個服務提供者,分別為:
一、支付模組:dt-provider-payment 埠為:9001
二、購物車模組:dt-provider-shopping 埠為:9002
此時兩個服務提供者埠號不同,我們將其註冊到註冊中心的時候,保證註冊名稱相同,看配置檔案:
server:
port: 9002
spring:
application:
name: provider-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name} # 註冊到consul的服務名稱
server:
port: 9001
spring:
application:
name: provider-service
cloud:
consul :
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name} # 註冊到consul的服務名稱
此時註冊中心有服務提供者服務,並且provider-service名稱對應我們兩個服務,只是埠不一樣。
編寫兩個服務的控制器方法,並且方法名稱以及方法一樣:
PaymentController.class
@RequestMapping(value = "/payment/consul")
public String paymentConsul () {
return "springcloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
}
ShoppingController.class
@RequestMapping(value = "/payment/consul")
public String paymentConsul() {
return "springcloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
}
@Value("${server.port}")
private String serverPort;
二、服務消費者呼叫
1.編寫服務消費者
上一篇我們提到了,dt-consumer-order訂單模組,其埠號為:8001,在其控制器編寫如下測試程式碼:
server:
port: 8001
spring:
application:
name: consumer-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name} # 註冊到consul的服務名稱
//@LoadBalanced //必須開啟負載均衡的功能,不然不能呼叫
private static final String PAYMENT_URL = "http://provider-service";
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/consul")
public String paymentInfo() {
return restTemplate.getForObject(PAYMENT_URL + "/payment/consul", String.class);
}
2.RestTemplate中開啟負載均衡支援
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //開啟負載均衡的功能
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.啟動服務測試
如下圖9001服務提供者自測通過:
如下圖9002服務提供者自測通過:
如下圖8001服務消費者負載均衡測試通過:
再次重新整理,隨機切換呼叫9002服務埠,實現了服務間的負載均衡呼叫:
總結
其實,在springcloud中,各個服務之間的互相呼叫就是遠端呼叫,而遠端呼叫有很多實現方法,我們現在實現的方式便是在程式碼中通過使用RestTemplate傳送http請求直接呼叫。
其中 RestTemplate就是spring封裝的一個java的http類庫,它簡化了使用java傳送http請求的過程,它也是對其他http類庫的封裝,預設底層使用JDK提供的http連線類。