# spring-cloud-feign **Repository Path**: ssp12345/spring-cloud-feign ## Basic Information - **Project Name**: spring-cloud-feign - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2018-08-08 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Cloud Feign 之初体验 ### Feign是什么 1、Feign使编写java http客户端更容易 2、Feign是一个Java到HTTP客户端绑定器 3、基于注解驱动,支持 [JAXRS-2.0](https://jax-rs-spec.java.net/nonav/2.0/apidocs/index.html)、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 4.0.0 org.springframework.boot spring-boot-starter-parent 1.5.10.RELEASE com.example.feign spring-cloud-feign 1.0-SNAPSHOT Edgware.SR3 1.8 org.springframework.cloud spring-cloud-starter-feign org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.apache.maven.plugins maven-compiler-plugin ${java.version} ${java.version} ``` spring boot 启动类 ```java /** * 启动类 * @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实体类,数据传输和存储 ```java 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请求,代码比较简单就不做说明了 ```java @RequestMapping("user") @RestController public class UserController { /** * 简单的Map存储User */ private Map 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 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 请求体 ```json { "name":"张三" } ``` user列表接口GET http://localhost:8080/user 响应体 ```json [ { "id": "1", "name": "张三" }, { "id": "2", "name": "李四" }, { "id": "3", "name": "王五" } ] ``` user根据id查询接口GET http://localhost:8080/user/1 响应体 ```json { "id": "1", "name": "张三" } ``` #### 使用Feign调用http接口-主题 创建Feign接口类 ```java @FeignClient(name = "user",url = "${user.url}") public interface UserFeign { @PostMapping void save(User user); @GetMapping("/{id}") User getUserByID(@PathVariable("id") String id); @GetMapping List findAll(); } ``` resources目录下 application.properties 文件配置 ```properties user.url=http://localhost:8080/user ``` 创建UserFeignTest测试类,此处是基于 `@SpringBootTest`注解 ```java @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 userList = userFeign.findAll(); System.out.println(userList); } } ``` 运行 `UserFeignTest.save` 方法会看到以下信息: ```java User{id='1', name='张三'} ``` 运行 `UserFeignTest.findAll` 就会返回User全部信息 #### 总结 到此Feign初体验结束。 我们会发现在`UserFeignTest`测试类的 `UserFeign userFeign `成员变量是spring 自动注入的,无论保存还是查询只要是调用`UserFeign`对应方法就可以了,对应开发者就像调用本地接口一样,大大的简化了http客户端请求的方式,当然 `UserFeignTest`类可以改成 `UserService`类。