feign有假裝的意思
爲什麼要叫假裝?
Feign可以把Rest的請求進行隱藏,僞裝成類似SpringMVC的Controller一樣。你不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做。
快速入門
先用起來,我們在使用的時候揭開它神祕的面紗吧
導入依賴
pom.xml 引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Feign的客戶端
@FeignClient(name = "user",url = "${user.url}")
public interface UserFeign {
@PostMapping
void save(User user);
@GetMapping("/{id}")
User getUserByID(@PathVariable("id") String id);
@GetMapping
List<User> findAll();
}
寫一個Controller
@RequestMapping("user")
@RestController
public class UserController {
/**
* 簡單的Map存儲User
*/
private Map<String, User> userMap = new HashMap<>();
/**
* id自增主鍵
*/
private AtomicLong pk = new AtomicLong();
@PostMapping
public void save(@RequestBody User user) {
String id = String.valueOf(pk.incrementAndGet());
user.setId(id);
userMap.put(id, user);
System.out.println("保存成功");
}
@GetMapping("/{id}")
public User getUserByID(@PathVariable("id") String id) {
return userMap.get(id);
}
@GetMapping
public List<User> findAll(@RequestHeader("token") String token) {
System.out.println("請求頭token信息:" + token);
return new ArrayList<>(userMap.values());
}
}
dao層
@Data
public class User {
private String id;
private String name;
}
啓動類
@SpringBootApplication
@EnableFeignClients
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
測試類
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserFeignTest {
@Autowired
UserFeign userFeign;
@Test
public void save() {
User user = new User();
user.setName("張三");
userFeign.save(user);
User user1 = userFeign.getUserByID("1");
System.out.println(user1);
}
@Test
public void getUserByID() {
userFeign.getUserByID("1");
}
@Test
public void findAll() {
List<User> userList = userFeign.findAll();
System.out.println(userList);
}
}
application.yml
server:
port: 8888
spring:
application:
name: fegintest
user:
url: http://localhost:8888/user
logging:
level:
com.zxw.feign: debug
先把項目啓動了,端口爲:8888
這事 feign 接口 @FeignClient(name = "user",url = "${user.url}")
user.url 爲 http://localhost:8888/user
這樣就實現了http 映射到接口上
然後我們在測試類調用 userFeign.save(user) 直接可以映射到 http請求。
直接請求到UserController 類上的 sava方法。
可以看到直接用feign 就能調用HTTP接口,真的省了很多功夫
FeignClient註解的常用屬性歸納如下:
❑ name:指定FeignClient的名稱,如果項目使用了Ribbon, name屬性會作爲微服務的名稱,用於服務發現。
❑ url:url一般用於調試,可以手動指定@FeignClient調用的地址。
❑ decode404:當發生404錯誤時,如果該字段爲true,會調用decoder進行解碼,否則拋出FeignException。
❑ configuration:Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract。
❑ fallback:定義容錯的處理類,當調用遠程接口失敗或超時時,會調用對應接口的容錯邏輯,fallback指定的類必須實現@FeignClient標記的接口。
❑ fallbackFactory:工廠類,用於生成fallback類示例,通過這個屬性我們可以實現每個接口通用的容錯邏輯,減少重複的代碼。
❑ path:定義當前FeignClient的統一前綴。
Feign默認Client的替換
Feign在默認情況下使用的是JDK原生的URLConnection發送HTTP請求,沒有連接池,但是對每個地址會保持一個長連接,即利用HTTP的persistence connection。我們可以用Apache的HTTP Client替換Feign原始的HTTP Client,通過設置連接池、超時時間等對服務之間的調用調優。Spring Cloud從Brixtion.SR5版本開始支持這種替換,接下來介紹一下如何用HTTP Client和okhttp去替換Feign默認的Client。