feign的使用
feign的介绍
- JAVA 项目中接口调用怎么做 ?
- Httpclient
- Okhttp
- Httpurlconnection
- RestTemplate
而feign可以让我们更加简便的调用接口
Feign是一个声明式、模板化的Web Service客户端,它简化了开发者编写Web服务客户端的操作,开发者可以通过简单的接口和注解来
调用HTTP API
,使得开发变得更加简化、快捷。
Spring Cloud Feign也是基于Netflix Feign的二次开发,它整合了Ribbon和Hystrix,具有可插拔、基于注解、
负载均衡、服务熔断
等一系列的便捷功能,也就是说我们在实际开发中可以用Feign来取代Ribbon。
feign的使用
- 引入依赖
我的环境:jdk1.8 spring-boot2.31
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
- main加注解@EnableFeignClients
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 创建feign接口类
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
@FeignClient(name = "TestFeign" ,url = "localhost:8081")
public interface TestFeign {
@GetMapping("/testFeign")
Map test(@RequestParam("name") String name);
}
-
- @FeignClient参数含义
- name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
- url: url一般用于调试,可以手动指定@FeignClient调用的地址
decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException - configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
- fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
- fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
- path: 定义当前FeignClient的统一前缀
- @FeignClient参数含义
-
调用的服务
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class TestController {
@GetMapping("/testFeign")
public Map test(@RequestParam("name") String name){
Map<String, String> map = new HashMap<>();
map.put("test",name);
return map;
}
}
- 使用
@Autowired
private TestFeign testFeign;
@Test
public void test2111(){
Map map = testFeign.test("测试一波");
System.out.println(map);
}