Feign實現服務間的調用(學習筆記, 2019.11.28)
1. 加入Fegin依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 在啓動類加上@EnableFeignClients註解,開啓Feign
的功能
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients //加上註解啓用fegin功能
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
3.定義一個feign接口,通過@ FeignClient(“服務名”),來指定調用哪個服務比如在代碼中調用了service-test服務的“/hi”接口,代碼如下:
@FeignClient("service-test") //註解要指定服務名 _不能有下劃線
public interface FeginHiClient {
//service-hi服務中名字爲"hi"的接口
@GetMapping("/hi")
String sayHi();
}
注意事項:
- 接口上通過註解指定要調用的微服名稱(不能有下劃線)
- 接口中寫具體的被調用的方法(參考被調用的微服controller類中的方法) 注:記得添加controller類上的路徑
- 調用方通過@Autowired注入接口即可調用
- 注意啓動順序: 註冊中心->被調用的微服->調用方微服
4.在controller層,對外暴露一個"getHi"
的API接口,通過上面定義的Feign客戶端FeginHiClient來消費服務(調用方通過@Autowired注入接口即可調用)
//編譯器報錯,無視。
//因爲這個Bean是在程序啓動的時候注入的,編譯器感知不到,所以報錯。
@Autowired
private FeginHiClient feginHiClient;
@GetMapping("/getHi")
public String hiFromFegin() {
return feginHiClient.sayHi();
}
5.啓動程序,多次訪問http://localhost:8080/getHi
,瀏覽器交替顯示
hi!i am come from 8862hi!
i am come from 8863
至此,使用Feign消費服務已實現,Feign內置ribbon,帶負載均衡的效果
擴展:帶參數的feign接口寫法: (更爲詳細網站資料)
注意 : 有參數一定要有註解並指定參數名稱,否則出錯
@FeignClient("EUREKA-TEST")
public interface TestService {
@GetMapping("/findOneMap")
Map<String, Object> findOneMap(@RequestParam("id") String id);
}
--------------------------------restful風格 ↓--------------------------------
@FeignClient("tensquare-base")
public interface LabelClient {
@RequestMapping(value="/label/{id}", method = RequestMethod.GET)
public Result findById(@PathVariable("id") String id);
}
----------------------------傳遞json實體參數使用 @RequestBody ↓----------------------
@RequestMapping(value = "/add",method = RequestMethod.POST)
String add(@RequestBody User user);
Feign的優勢(相比RestTemplate)
1.聲明式的REST客戶端,通過編寫簡單的接口和插入註解,只需要像調用本地方法一樣調用它就可以完成服務請求及相關處理,使REST調用更加簡單
若使用RestTemplate,則需要深入瞭解HTTP級別API的細節。
客戶端,通過編寫簡單的接口和插入註解,只需要像調用本地方法一樣調用它就可以完成服務請求及相關處理,使REST調用更加簡單
若使用RestTemplate,則需要深入瞭解HTTP級別API的細節。
2.內置Ribbon,配合Eureka實現負載均衡