溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法

發(fā)布時(shí)間:2021-06-30 16:54:29 來(lái)源:億速云 閱讀:260 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

客戶(hù)端遠(yuǎn)程調(diào)用

Feign

什么是Feign?

Feign是 Netflix 公司開(kāi)源的聲明式HTTP客戶(hù)端

Github : Feign 源碼

為什么需要Feign?

  1. 原代碼可讀性不高

  2. 復(fù)雜的URL難以維護(hù)(https://user-center/s?wd={userId}&rsv_spt=1&rsv_iqid=0x93bff3cd000cf3da&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=4&rsv_sug1=4&rsv_sug7=100&rsv_t=10c2risCimsUZC0RBruMerdnQRN1gRxFI%2BywuD0L3LwGGNd2dR8XE6x%2FyFOjHnR0oEi0&rsv_sug2=0&inputT=1535&rsv_sug4=1535&rsv_sug=2

  3. 難以應(yīng)對(duì)需求的快速變化

  4. 編碼體驗(yàn)和我們寫(xiě)JAVA差異較大

舉例重構(gòu)代碼

				//替換前 
        ResponseEntity<UserDTO> userEntity = restTemplate.getForEntity(
                "http://user-center/users/{userId}",
                UserDTO.class, userId
        );
        UserDTO userDTO = new UserDTO();
        if (null != userEntity) {
            userDTO = userEntity.getBody();
            log.info("ShareService#findById userDTO: {}", userDTO);
        }
  1. 添加依賴(lài)

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 啟動(dòng)類(lèi)添加注解 @EnableFeignClients

  2. 添加配置

  3. 實(shí)現(xiàn)對(duì)應(yīng)微服務(wù)的client

/**
 * IUserCenterFeignClient for 定義 user-center feign client
 *
 * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang | 若初</a>
 * @since 2019/7/15
 */
@FeignClient(name = "user-center")
public interface IUserCenterFeignClient {

    /**
     * Feign client 會(huì)將請(qǐng)求轉(zhuǎn)換為
     * http://user-center/users/{userId}
     *
     * @param userId 用戶(hù)id
     * @return 返回用戶(hù)對(duì)象
     */
    @GetMapping(path = "/users/{userId}")
    public UserDTO findById(@PathVariable Long userId);
}
  1. 替換后代碼

        //使用 FeignClient 來(lái)替換掉RestTemplate調(diào)用
        UserDTO userDTO = this.userCenterFeignClient.findById(userId);

Feign的組成

客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法

Feign的配置方式

Java Code
支持的配置項(xiàng)

客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法

自定義Feign日志級(jí)別
  • 級(jí)別內(nèi)容

客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法

Demo

**Tip **: 有可能出現(xiàn)父子上下文重疊問(wèn)題

  1. 在client添加配置

/**
 * IUserCenterFeignClient for 定義 user-center feign client
 *
 * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang | 若初</a>
 * @since 2019/7/15
 */
@FeignClient(name = "user-center",configuration = UserCenterFeignConfiguration.class)
public interface IUserCenterFeignClient {
   ...
}
  1. 編寫(xiě)java配置文件

/**
 * UserCenterFeignConfiguration for 自定義user-center服務(wù)請(qǐng)求中,feign的配置信息
 * {@link @Configuration} 不能添加該注解,否則會(huì)和ribbon一樣,出現(xiàn)上下文重疊問(wèn)題,造成配置全局共享
 * 如要添加該注解,需要將該類(lèi)放在主程序啟動(dòng)掃描不到的包下
 *
 * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang | 若初</a>
 * @since 2019/7/15
 */
public class UserCenterFeignConfiguration {
    @Bean
    public Logger.Level level() {
        // 配置feign 日志級(jí)別,記錄請(qǐng)求和響應(yīng)的header、body以及元數(shù)據(jù)
        return Logger.Level.FULL;
    }
}
  1. 一定要在配置文件中添加該client 全路徑

    logging:
      level:
       #com.sxzhongf: debug
        com.sxzhongf.sharedcenter.feignclients.IUserCenterFeignClient: debug


  2. 打印信息

2019-07-15 15:06:11.650 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] <--- HTTP/1.1 200 (402ms)
2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] content-type: application/json;charset=UTF-8
2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] date: Mon, 15 Jul 2019 07:06:11 GMT
2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] transfer-encoding: chunked
2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] 
2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] {"id":1,"wxId":"","wxNickname":"IsaacZhang","roles":"","avatarUrl":"aaa","createTime":"2019-07-11T06:08:18.000+0000","updateTime":"2019-07-11T06:08:18.000+0000","bonus":100}
2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] <--- END HTTP (173-byte body)
Configuration
支持的配置項(xiàng)

客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法

demo

使用配置文件來(lái)定義log level

#logging:
  #level:
   #com.sxzhongf: debug
    #com.sxzhongf.sharedcenter.feignclients.IUserCenterFeignClient: debug
feign:
  client:
    config:
      user-center: #單服務(wù)配置
        loggerLevel: full
---        
feign:
  client:
    config:
      default: #全局配置日志級(jí)別
        loggerLevel: full

Feign的繼承性

  • 官方不建議使用

  • 大多數(shù)公司使用?

架構(gòu)師需要根據(jù)自身業(yè)務(wù)情況來(lái)決定,是否需要將不同的微服務(wù)進(jìn)行業(yè)務(wù)耦合,還是使用冗余代碼的方式來(lái)解放業(yè)務(wù)耦合性。

Feign多參請(qǐng)求

Get
  1. 使用@SpringQueryMap

@FeignClient(name = "user-center")
public interface ITestUserCenterFeignClient {

    @GetMapping("/users/q")
    public UserDTO query(@SpringQueryMap UserDTO userDTO);
}
  1. 使用 @RequestParam

@FeignClient(name = "user-center")
public interface ITestUserCenterFeignClient {

    @RequestMapping(value = "/users/q",method = RequestMethod.GET)
    public UserDTO query(@RequestParam("id") Long id,@RequestParam("name") String name);
}
  1. 使用Map構(gòu)建,(不推薦)

@FeignClient(name = "user-center")
public interface ITestUserCenterFeignClient {

    @RequestMapping(value = "/users/q",method = RequestMethod.GET)
    public UserDTO query(@RequestParam Map<String,Object> conditions);
}

注意:這種方式不建議使用。主要是因?yàn)榭勺x性不好,而且如果參數(shù)為空的時(shí)候會(huì)有一些問(wèn)題,例如map.put("username", null); 會(huì)導(dǎo)致user-center 服務(wù)接收到的username是"" ,而不是null。

Post

服務(wù)提供者方法

    @PostMapping("/create")
    public User createUser(@RequestBody User user){
        return null;
    }

服務(wù)調(diào)用者

@FeignClient(name = "user-center")
public interface ITestUserCenterFeignClient {

    @RequestMapping(value = "/users/q",method = RequestMethod.POST)
    public UserDTO query(@RequestBody UserDTO user);
}

Feign脫離服務(wù)注冊(cè)/Ribbon調(diào)用

@FeignClient(name = "xxxxx",url = "http://www.baidu.com")
public interface ITestBaiduFeignClient {

    @GetMapping("")
    public String getBaidu();
}

Feign 性能優(yōu)化

使用連接池
httpClient
  1. 加依賴(lài)

        <!--Feign 性能優(yōu)化,需要使用連接池,引入依賴(lài)-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
  1. 加注解(不需要)

  2. 改配置

  httpclient:
    # 為feign啟用 apache httpclient 做請(qǐng)求,而不使用默認(rèn)的urlconection
    enabled: true
    # feign 最大連接數(shù)
    max-connections: 200
    # feign 單個(gè)路徑請(qǐng)求的最大連接數(shù)
    max-connections-per-route: 50
okHttp
  1. 加依賴(lài)

        <!--Feign 性能優(yōu)化,需要使用連接池,引入依賴(lài)-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
        </dependency>
  1. 加注解(不需要)

  2. 改配置

  httpclient:
    # 為feign啟用 apache httpclient 做請(qǐng)求,而不使用默認(rèn)的urlconection
    #enabled: true
    # feign 最大連接數(shù)
    max-connections: 200
    # feign 單個(gè)路徑請(qǐng)求的最大連接數(shù)
    max-connections-per-route: 50
  okhttp:
    enabled: true
合理使用Feign日志

生產(chǎn)環(huán)境使用Logger.Level.BASIC

RestTemplate

RestTemplate VS. Feign

客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法

“客戶(hù)端遠(yuǎn)程調(diào)用Feign的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI