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。