中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用RestTemplate和WebClient以及Feign

發布時間:2021-10-20 15:41:40 來源:億速云 閱讀:709 作者:柒染 欄目:大數據

本篇文章給大家分享的是有關如何使用RestTemplate和WebClient以及Feign,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

我們已經學會如何使用Nacos來實現服務的注冊與發現,同時也介紹如何通過LoadBalancerClient接口來獲取某個服務的具體實例,并根據實例信息來發起服務接口消費請求。但是這樣的做法需要我們手工的去編寫服務選取、鏈接拼接等繁瑣的工作,對于開發人員來說非常的不友好。所以接下來,我們再來看看除此之外,還支持哪些其他的服務消費方式。

使用RestTemplate

在之前的例子中,已經使用過RestTemplate來向服務的某個具體實例發起HTTP請求,但是具體的請求路徑是通過拼接完成的,對于開發體驗并不好。但是,實際上,在Spring Cloud中對RestTemplate做了增強,只需要稍加配置,就能簡化之前的調用方式。

@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和端口,從而實現基于服務名的負載均衡調用。

使用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的依賴:

@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的時候,也都是用同樣的方法來實現服務調用的,不是嗎?

確實是這樣,對于Spring Cloud老手來說,就算我們更換了Nacos作為新的服務注冊中心,其實對于我們應用層面的代碼是沒有影響的。那么為什么Spring Cloud可以帶給我們這樣的完美編碼體驗呢?實際上,這完全歸功于Spring Cloud Common的封裝,由于在服務注冊與發現、客戶端負載均衡等方面都做了很好的抽象,而上層應用方面依賴的都是這些抽象接口,而非針對某個具體中間件的實現。所以,在Spring Cloud中,我們可以很方便的去切換服務治理方面的中間件。

以上就是如何使用RestTemplate和WebClient以及Feign,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榆中县| 曲阜市| 乌兰县| 宁陵县| 临汾市| 黎川县| 荥阳市| 邵阳市| 高淳县| 苏尼特右旗| 昭通市| 县级市| 从化市| 抚顺市| 佛学| 万州区| 柯坪县| 浠水县| 娄烦县| 万山特区| 喀喇沁旗| 陆川县| 东丽区| 祁门县| 丰顺县| 曲松县| 岳普湖县| 黔江区| 双江| 囊谦县| 博野县| 和平区| 江安县| 黔西县| 东兰县| 甘南县| 仙居县| 上虞市| 鹿泉市| 阳东县| 房产|