1. 程式人生 > >springcloud 系列教程三:RestTemplate實現服務的呼叫以及Ribbon負載均衡

springcloud 系列教程三:RestTemplate實現服務的呼叫以及Ribbon負載均衡

springcloud 中有兩種呼叫方式,RestTemplate、Fegin。RestTemplate 由 spring 提供,而 Fegin 是 springcloud 提供,具體來說當然 Fegin 更好用,但是今天使用 RestTemplate

RestTemplate 簡介


Spring'scentral class for synchronous client-side HTTP access.It simplifies communication with HTTPservers, and enforces RESTful principles. Ithandles HTTP connections, leaving application code to provide URLs(with possible template variables) andextract results.

簡單說就是:簡化了發起 HTTP 請求以及處理響應的過程,並且支援 REST 風格,為什麼是簡化呢?因為他比傳統的 URLConnection 建立連線簡化太多

RestTemplate 的 get 方法有以上幾個,常見的是: getForEntity() 和 getForObject()

首先看 getForEntity() 的返回值型別 ResponseEntity

<T> ResponseEntity<T> getForEntity()

可以看到它繼承了 HttpEntity,封裝了返回的響應資訊,包括響應狀態,響應頭和響應體。但是,通常情況下我們並不想要 Http 請求的全部資訊,只需要相應體即可,對於這種情況,RestTemplate 提供了 getForObject() 方法用來只獲取響應體資訊,非常方便

客戶端負載均衡


負載均衡是我們處理高併發、緩解網路壓力和進行服務端擴容的重要手段之一,但是一般情況下我們所說的負載均衡通常都是指服務端負載均衡

Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡器,當我們將 Ribbon 和 Eureka 一起使用時,Ribbon 會從 Eureka 註冊中心去獲取服務端列表,然後進行輪詢訪問以到達負載均衡的作用,客戶端負載均衡中也需要心跳機制去維護服務端清單的有效性,當然這個過程需要配合服務註冊中心一起完成

客戶端負載均衡和服務端負載均衡最大的區別在於服務清單所儲存的位置。在客戶端負載均衡中,所有的客戶端節點都有一份自己要訪問的服務端清單,這些清單統統都是從 Eureka 服務註冊中心獲取的。在 springcloud 中我們如果想要使用客戶端負載均衡,方法很簡單,開啟@LoadBalanced

註解即可,這樣客戶端在發起請求的時候會先自行選擇一個服務端,向該服務端發起請求,從而實現負載均衡

服務的叢集部署

首先我們通過修改服務的埠來啟動兩個服務

說明:通過修改埠號,然後多啟動幾個服務就可以了,但是要注意設定下啟動類

將single instance only 勾去掉,使得支援多開

然後重新整理下注冊中心我們可以看到下圖:

8081 和 8082 兩個服務構成簡單的叢集

服務呼叫

在 springcloud 中我們如果想要使用客戶端負載均衡,方法很簡單,開啟@LoadBalanced註解即可,現在使用springcloud-order服務呼叫springcloud-emp服務,再 order 啟動類裡面注入 RestTemplate,並新增@LoadBalanced註解

@SpringBootApplication
@EnableEurekaClient
public class ApplicationOrder {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationOrder.class, args);
    }

    @Bean
    @LoadBalanced //該註解可以讓該resttemplate在請求時擁有客戶端負載均衡的能力
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

使用 RestTemplate 呼叫服務springcloud-emp

@RestController
public class OrderController {

    /**
     * springcloud 中有兩種呼叫方式:restTemplate,fegin(springcloud)
     * restTemplate 是spring 提供,預設已經整合了 ribbon 負載均衡器
     * restTemplate 底層就是用的httpclient
     */
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/orderinfo")
    public String orderinfo() {
        //兩種呼叫,一種是服務別名,另一種直接呼叫
        //String url = "http://127.0.0.1:8101/empinfo";
        String url = "http://springcloud-emp/empinfo";
        String result = restTemplate.getForObject(url, String.class);
        return result;
    }
}

springcloud-emp 服務程式碼如下

@RestController
public class EmpController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("/empinfo")
    public String getEmp(){

        return "hello springcloud.  ~~一個窮屌絲!:"+port;
    }
}

然後訪問springcloud-order服務,springcloud-order服務再呼叫springcloud-emp服務,多次訪問springcloud-order服務會看到負載均衡的效果

專案結構如下:

原始碼參考地址:https://gitee.com/d