SpringCloud学习笔记------Feign

    xiaoxiao2022-07-05  169

     

    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。

     

    最新回复(0)