Feign是spring cloud中服務消費端的調用框架,一般與ribbon,hystrix等組合使用。web
可是在某些項目中,因爲遺留緣由,整個系統並非spring cloud項目,甚至不是spring項目,而使用者關注的重點僅僅是簡化http調用代碼的編寫。spring
若是採用httpclient或者okhttp這樣相對較重的框架,對初學者來講編碼量與學習曲線都會是一個挑戰,而使用spring中RestTemplate,又沒有配置化的解決方案,由此想到是否能夠脫離spring cloud,獨立使用Feign。json
<dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-core</artifactId> <version>8.18.0</version> </dependency>
import feign.Param; import feign.RequestLine; public interface RemoteService { @RequestLine("GET /users/list?name={name}") String getOwner(@Param(value = "name") String name); }
經過@RequestLine
指定HTTP協議及URL地址app
RemoteService service = Feign.builder() .options(new Options(1000, 3500)) .retryer(new Retryer.Default(5000, 5000, 3)) .target(RemoteService.class, "http://127.0.0.1:8085");
options方法指定鏈接超時時長及響應超時時長,retryer方法指定重試策略,target方法綁定接口與服務端地址。返回類型爲綁定的接口類型。框架
String result = service.getOwner("scott");
與調用本地方法相同的方式調用feign包裝的接口,直接獲取遠程服務提供的返回值。maven
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping(value="users") public class UserController { @RequestMapping(value="/list",method={RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT}) @ResponseBody public String list(@RequestParam String name) throws InterruptedException{ return name.toUpperCase(); } }
在項目中,服務消費端與生產端之間交換的數據每每是一或多個對象,feign一樣提供基於json的對象轉換工具,方便咱們直接以對象形式交互。工具
public interface RemoteService { @Headers({"Content-Type: application/json","Accept: application/json"}) @RequestLine("POST /users/list") User getOwner(User user); }
加入@Headers註解,指定Content-Type爲json學習
RemoteService service = Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .options(new Options(1000, 3500)) .retryer(new Retryer.Default(5000, 5000, 3)) .target(RemoteService.class, "http://127.0.0.1:8085");
encoder指定對象編碼方式,decoder指定對象解碼方式。這裏用的是基於Jackson的編、解碼方式,須要在pom.xml中添加Jackson的依賴ui
<dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-jackson</artifactId> <version>8.18.0</version> </dependency>
User result = service.getOwner(u);
@Controller @RequestMapping(value="users") public class UserController { @RequestMapping(value="/list",method={RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT}) @ResponseBody public User list(@RequestBody User user) throws InterruptedException{ System.out.println(user.getUsername()); user.setId(100L); user.setUsername(user.getUsername().toUpperCase()); return user; } }
惟一的變化就是使用了@RequestBody來接收json格式的數據。編碼