使用FeignClient進行微服務交互方式(微服務接口互相調用)

使用FeignClient進行微服務交互

先寫一個公共方法

  public String getSettingValue(String name) {
       Map<String, Object> map = (Map) settingClient.getByName(name).getData();
       return (String) map.get("value");
  }

然後寫一個Feign調用

@FeignClient(value="qiang-admin")
public interface SettingClient {
    @RequestMapping(value="/setting/getSetting/{name}",method = RequestMethod.GET)
    public ReturnMsg getByName(@PathVariable("name") String name);
}

@FeignClient註解用於指定從哪個服務中調用功能 ,註意 裡面的名稱與被調用的服務

名保持一致,並且不能包含下劃線。

@RequestMapping註解用於對被調用的微服務進行地址映射。註意 @PathVariable註

解一定要指定參數名稱,否則出錯。

@PathVariable:接口參數

被Feign調用的方法如下

    @RequestMapping(value="/getSetting/{name}",method = RequestMethod.GET)
    public ReturnMsg getByName(@PathVariable String name){
        Setting condition = new Setting();
        condition.setName(name);
        ReturnMsg returnMsg = new ReturnMsg<>();
        Setting setting = settingService.findByCondition(condition);
        returnMsg.setCode(ReturnIntCode.SUCCESSS_CODE);
        returnMsg.setData(setting);
        return returnMsg;
    }

@FeignClient調用微服務註意事項

在初次使用springcloud,調用微服務的時候,常常會踩坑,這裡總結一下,在調用微服務的時候,常犯的幾點錯誤及註意點:

FeignClient接口不能使用@GettingMapping之類的組合註解

@FeignClient("target-servername")
  public interface FeignClient {
       @RequestMapping(value = "/simple/{id}", method =RequestMethod.GET)
 public Object findById(@PathVariable("id") Long id);
 ...
}

這邊的@RequestMapping(value = "/simple/{id}", method = RequestMethod.GET) 不能寫成@GetMapping("/simple/{id}") 。因為GetMapper是一個組合註解。

FeignClient接口中如果使用到@PathVariable

必須指定其value

@FeignClient("target-servername")
public interface FeignClient {
 @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
 public Object findById(@PathVariable("id") Long id);
 ...
}

這邊的@PathVariable("id") 中的”id”,不能省略,必須指定。

FeignClient多參數的構造

如果想要請求target-servername 服務,並且參數有多個例如:http://target-servername/query-by?id=1&username=張三 要怎麼辦呢? 不能構造一個復雜的對象去接收,必須一個一個接收參數

@FeignClient("target-servername")
public interface UserFeignClient {
 @RequestMapping(value = "/query-by", method = RequestMethod.GET)
 public Object queryBy(@RequestParam("id")Long id, @RequestParam("username")String username);
}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: