SpringCloud學習筆記------Feign

 

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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章