Spring Cloud Feign 之初體驗
環境信息: java 1.8、Spring boot 1.5.10.RELEASE、spring cloud-Edgware.SR3、maven 3.3+
Feign是什麼
1、Feign使編寫java http客戶端更容易
2、Feign是一個Java到HTTP客戶端綁定器
3、基於註解驅動,支持 JAXRS-2.0、spring mvc 註解系列、自帶註解@RequestLine
等等。
4、支持http客戶端擴展,如: Apache HttpClient、OKHTTP等主流的HTTP客戶端。
爲什麼用Feign
1、可以與多種HTTP客戶端集成
2、spring 已經完全集成feign
3、極大地簡化了HTTP請求代碼量
4、與ribbon負載均衡器、hystrix熔斷器無縫集成。
Feign使用例子
本項目使用spring boot+maven構建的,如果對於spring boot不瞭解的同學請先了解下。
話不多說,首先來個例子讓大家體驗下Feign的魅力
代碼示例
下面以User類爲例,簡單的保存、查詢全部、根據id查詢三個接口。
maven pom.xml文件使用的相關依賴項
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<groupId>com.example.feign</groupId>
<artifactId>spring-cloud-feign</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring-cloud.version>Edgware.SR3</spring-cloud.version>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
spring boot 啓動類
/**
* 啓動類
* @author: sunshaoping
* @date: Create by in 上午10:47 2018/8/7
*/
@EnableFeignClients
@SpringBootApplication
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
User實體類,數據傳輸和存儲
public class User {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
UserController類,處理HTTP請求,代碼比較簡單就不做說明了
@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());
}
}
啓動FeignApplication
,可以訪問web服務了,默認端口8080控制會打印相關信息。
使用http客戶端工具或瀏覽器訪問已啓動的web服務,本人使用的是postman
http請求訪問接口
對此處比較熟的同學可以跳過,看下一節 使用Feign調用http接口
user保存接口POST http://localhost:8080/user ,可以多保存幾次,下面的列表就可以看的條數據了
請求頭
Content-Type:application/json
請求體
{
"name":"張三"
}
user列表接口GET http://localhost:8080/user
響應體
[
{
"id": "1",
"name": "張三"
},
{
"id": "2",
"name": "李四"
},
{
"id": "3",
"name": "王五"
}
]
user根據id查詢接口GET http://localhost:8080/user/1
響應體
{
"id": "1",
"name": "張三"
}
使用Feign調用http接口
創建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();
}
resources目錄下 application.properties 文件配置
user.url=http://localhost:8080/user
創建UserFeignTest測試類,此處是基於 @SpringBootTest
註解
@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);
}
}
運行 UserFeignTest.save
方法會看到以下信息:
User{id='1', name='張三'}
運行 UserFeignTest.findAll
就會返回User全部信息
總結
到此Feign初體驗結束。
我們會發現在UserFeignTest
測試類的 UserFeign userFeign
成員變量是spring 自動注入的,無論保存還是查詢只要是調用UserFeign
對應方法就可以了,對應開發者就像調用本地接口一樣,大大的簡化了http客戶端請求的方式,當然 UserFeignTest
類可以改成 UserService
類。
樣例地址 spring-cloud-feign 分支 Spring-Cloud-Feign之初體驗