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

溫馨提示×

溫馨提示×

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

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

怎么使用FeignClient設置動態Url

發布時間:2022-06-28 13:58:11 來源:億速云 閱讀:2320 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“怎么使用FeignClient設置動態Url”,內容詳細,步驟清晰,細節處理妥當,希望這篇“怎么使用FeignClient設置動態Url”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    FeignClient設置動態Url

    1. 需求描述

    一般情況下,微服務內部調用都是通過注冊中心,eureka,zookeeper,nacos等實現動態調用,但是對于一些外部http調用,對于不在同一微服務內,不在同一注冊中心的服務調用,可以考慮SpringCloudOpenFeign,而且可以實現動態URL,通過參數動態控制。

    2. 實現方案

    服務端正常springboot項目,也不一定是springboot項目,只要正常提供RESTFul接口就可以,本次測試以springboot為例。主要是客戶端調用。

    1.服務端:

    /**
     * (Category)控制層
     *
     * @author makejava
     * @since 2021-06-03 07:20:41
     */
    @RestController
    @RequestMapping("/category")
    public class CategoryController {
        /**
         * 服務對象
         */
        @Resource
        private CategoryService categoryService;
        /**
         * 測試服務
         */
        @GetMapping("/test")
        public Response test() {
            return Response.createSuccessResponse("查詢成功", "我是測試服務");
        }
    }

    2.客戶端:

    maven依賴

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    客戶端代碼

    /**
     * 測試
     * @author zrj
     * @since 2021-07-25
     */
    @Api(value = "微盟鑒權測試")
    @RestController
    @RequestMapping("/weimob")
    public class ActivityController {
        @Resource
        private CategoryService categoryService;
        @GetMapping("/test")
        @ApiOperation(value = "微盟獲取Code")
        public Response test() throws URISyntaxException {
            System.out.println("-----測試-----");
            URI uri = new URI("http://localhost:8080/category/test");
            Response response = categoryService.test(uri);
            return Response.createSuccessResponse("查詢成功", response);
        }
    }

    調用接口

    /**
     * 測試接口Openfeign
     * @author zrj
     * @since 2021/7/25
     **/
    @Service("WeimobAuthorize")
    @FeignClient(url = "http://localhost:8080/category", name = "CategoryService")
    public interface CategoryService {
        @GetMapping
        Response test(URI uri);
    }

    3. 細節分析

    1.接口使用SpringMVC注解

    接口方法的定義使用了SpringMVC的注解 @GetMapping、@RequestParam,其實SpringMVC的其他注解在此處都是支持的。(有其他文章提到也支持OpenFeign原有的注解@RequestLine、@Param等,但博主實測是不支持的,相關解析類為 feign.Contract,這個存疑)。

    2.springcloud openfeign自動構建實現類

    在使用方式上,OpenFeign需要手動構建代理對象,Spring Cloud OpenFeign 不同于 OpenFeign, Spring Cloud OpenFeign 幫我們自動生成了接口的代理對象(即實現類),并且注冊到Spring中,我們可以很方便的使用 @Autowired 注入代理對象然后使用。

    其默認的代理對象是 LoadBalancerFeignClient。還有一個代理對象是 feign.Client.Default。

    兩者區別在于:LoadBalancerFeignClient 通過服務名(下文提到)從Eureka查找相關的節點地址url,發起調用。feign.Client.Default 僅是簡單的直接調用。

    3.FeignClient屬性name與URL一定要指定

    @FeignClient(url = “http://localhost:8080/category”, name = “CategoryService”)

    name 屬性,是@FeignClient 注解必要的,不定義時會報錯其默認指代Eureka上的服務名。

    url 屬性,一定要指定,這是重點了! url屬性指定什么值其實不重要,因為最終都會被方法的URI參數值替換掉,它在這里另一個重要的作用,就是將接口的代理對象變成feign.Client.Default(上文提到默認是LoadBalancerFeignClient),這樣就繞過了從Eureka取節點地址這一步,畢竟第三方的地址不可能注冊到我們的Eureka上。(相關細節可自行debug FeignClientFactoryBean.getTarget())

    FeignClient注解配置url屬性實現指定服務方

    某天,跟同學聊天,同學說起之前面試的時候面試官提的一個問題:使用spring cloud,現在某個服務有一個新的接口需要驗證。該接口目前只上線了一臺機器,如何指定調用方只調用這臺機器。問題大致如此,可能有些出入。總結起來,就是希望能夠指定訪問某臺機器。這樣的情況,在我們平時也可能經常遇到。比如甲乙兩人需要調試新接口,但注冊中心只有一個。可能上面有丙丁戊己庚辛注冊的服務。如果我們按照默認的輪詢的負載均衡規則去調用,七次調用才能輪到乙的服務,根本沒有辦法調試。所以這時候就需要我們能夠指定調用的服務方。

    FeignClient注解通過配置url屬性可以指定調用的服務方。我們按照上面的例子,假設乙的IP為192.168.1.2,在端口8080上啟動的服務,那我們就可以把我們的url配置成http://192.168.1.2:8080。這樣調用的就一直是乙的服務了。

    那我們配置了url和不配置url到底產生了哪些不同呢?

    feign,或者說open-feign底層是使用,我以為默認是httpclient,但是我debug的結果是HttpURLConnection。知道為什么的可以留言告訴我。feign會基于配置,生成URI。當我們不配置url的時候,URI是這樣的http://service-name/path。使用FeignClien是LoadBalancerFeignClient,該類在處理該URI的時候會對服務名進行解析,也就是從注冊中心查詢該服務名下已經注冊的服務器信息,包括IP和端口。然后將服務名替換成真實的鏈接。而當我們不配置url的時候,使用的FeignClient是Client的默認實現Default,該類就沒有解析的這一步而是直接通過HttpURLConnection進行請求。

    讀到這里,這篇“怎么使用FeignClient設置動態Url”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

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

    AI

    灵宝市| 建平县| 睢宁县| 同德县| 临潭县| 万载县| 确山县| 通许县| 时尚| 永川市| 衢州市| 汉阴县| 咸宁市| 拜城县| 芜湖市| 台前县| 建水县| 长治县| 荣成市| 齐河县| 汕头市| 浦县| 西林县| 丹巴县| 来宾市| 翁源县| 武城县| 双辽市| 望都县| 六枝特区| 名山县| 美姑县| 义乌市| 朝阳区| 桐梓县| 肥东县| 银川市| 江门市| 棋牌| 舒城县| 红原县|