Spring Cloud Alibaba基礎:支持的幾種服務消費方式(RestTemplate、WebClient、Feign)

咱們已經學會如何使用Nacos來實現服務的註冊與發現,同時也介紹如何經過LoadBalancerClient接口來獲取某個服務的具體實例,並根據實例信息來發起服務接口消費請求。可是這樣的作法須要咱們手工的去編寫服務選取、連接拼接等繁瑣的工做,對於開發人員來講很是的不友好。因此接下來,咱們再來看看除此以外,還支持哪些其餘的服務消費方式。react

 

使用RestTemplate

在以前的例子中,已經使用過RestTemplate來向服務的某個具體實例發起HTTP請求,可是具體的請求路徑是經過拼接完成的,對於開發體驗並很差。可是,實際上,在Spring Cloud中對RestTemplate作了加強,只須要稍加配置,就能簡化以前的調用方式。web

@EnableDiscoveryClient
@SpringBootApplication
public class TestApplication {

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

    @Slf4j
    @RestController
    static class TestController {

        @Autowired
        RestTemplate restTemplate;

        @GetMapping("/test")
        public String test() {
            String result = restTemplate.getForObject("http://alibaba-nacos-discovery-server/hello?name=didi", String.class);
            return "Return : " + result;
        }
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

能夠看到,在定義RestTemplate的時候,增長了@LoadBalanced註解,而在真正調用服務接口的時候,原來host部分是經過手工拼接ip和端口的,直接採用服務名的時候來寫請求路徑便可。在真正調用的時候,Spring Cloud會將請求攔截下來,而後經過負載均衡器選出節點,並替換服務名部分爲具體的ip和端口,從而實現基於服務名的負載均衡調用。app

 

使用WebClient

WebClient是Spring 5中最新引入的,能夠將其理解爲reactive版的RestTemplate。下面舉個具體的例子,它將實現與上面RestTemplate同樣的請求調用:負載均衡

@EnableDiscoveryClient
@SpringBootApplication
public class TestApplication {

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

    @Slf4j
    @RestController
    static class TestController {

        @Autowired
        private WebClient.Builder webClientBuilder;

        @GetMapping("/test")
        public Mono<String> test() {
            Mono<String> result = webClientBuilder.build()
                    .get()
                    .uri("http://alibaba-nacos-discovery-server/hello?name=didi")
                    .retrieve()
                    .bodyToMono(String.class);
            return result;
        }
    }

    @Bean
    @LoadBalanced
    public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
    }

}

 

能夠看到,在定義WebClient.Builder的時候,也增長了@LoadBalanced註解,其原理與以前的RestTemplate時同樣的。關於WebClient的完整例子也能夠經過在文末的倉庫中查看。函數

使用Feign

上面介紹的RestTemplate和WebClient都是Spring本身封裝的工具,下面介紹一個Netflix OSS中的成員,經過它能夠更方便的定義和使用服務消費客戶端。下面也舉一個具體的例子,其實現內容與上面兩種方式結果一致:工具

第一步:在pom.xml中增長openfeign的依賴:ui

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class TestApplication {

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

    @Slf4j
    @RestController
    static class TestController {

        @Autowired
        Client client;

        @GetMapping("/test")
        public String test() {
            String result = client.hello("didi");
            return "Return : " + result;
        }
    }


    @FeignClient("alibaba-nacos-discovery-server")
    interface Client {

        @GetMapping("/hello")
        String hello(@RequestParam(name = "name") String name);

    }

}

這裏主要先經過@EnableFeignClients註解開啓掃描Spring Cloud Feign客戶端的功能;而後又建立一個Feign的客戶端接口定義。使用@FeignClient註解來指定這個接口所要調用的服務名稱,接口中定義的各個函數使用Spring MVC的註解就能夠來綁定服務提供方的REST接口,好比下面就是綁定alibaba-nacos-discovery-server服務的/hello接口的例子。最後,在Controller中,注入了Client接口的實現,並調用hello方法來觸發對服務提供方的調用。編碼

 

深刻思考

若是以前已經用過Spring Cloud的讀者,確定會這樣的感覺:不論我用的是RestTempalte也好、仍是用的WebClient也好,仍是用的Feign也好,彷佛跟我用不用Nacos沒啥關係?咱們在以前介紹Eureka和Consul的時候,也都是用一樣的方法來實現服務調用的,不是嗎?spa

確實是這樣,對於Spring Cloud老手來講,就算咱們更換了Nacos做爲新的服務註冊中心,其實對於咱們應用層面的代碼是沒有影響的。那麼爲何Spring Cloud能夠帶給咱們這樣的完美編碼體驗呢?實際上,這徹底歸功於Spring Cloud Common的封裝,因爲在服務註冊與發現、客戶端負載均衡等方面都作了很好的抽象,而上層應用方面依賴的都是這些抽象接口,而非針對某個具體中間件的實現。因此,在Spring Cloud中,咱們能夠很方便的去切換服務治理方面的中間件。rest

相關文章
相關標籤/搜索