一、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
二、添加配置(可选)(application.yml)
参考:
参考:
三、创建FeignClient服务接口
参考:
声明接口之后,在代码中通过@Resource注入之后即可使用。@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的统一前缀
注意:name和value属性互为别名,任选一个使用即可。服务名不能有下划线,否则会提示【Service id not legal hostname】
1.最简单的直接访问某个接口
import hzq.maven.demo.springboot.models.dto.CalculateRequest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 调用指定url下的接口
*/
@FeignClient(url="${http.test_service_url}", value = "demo-api")
public interface TestApi {
@GetMapping(value = "/demo_api/calculate/test/get")
String funA();
}
2.访问微服务中指定服务的接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
/**
* 如果没有配置url属性,value或name属性则会作为微服务的名称,用于服务发现
*/
@FeignClient(value = "fund-command")
public interface TestApi2 {
@PostMapping(value = "/api/fund/command/daily-trading/callback")
String funA();
}
3.增加 Hystrix 断路熔断机制
断路器必须实现@FeignClient标记的接口。实现方法作为断路器的回调方法。需要使用@Component注解,保证能被Spring容器扫描到。
配置中需要指定【feign.hystrix.enabled = true】,否则断路器无法生效。
/**
* test服务断路器
*/
@Component
public class TestApiHystrix implements TestApi {
@Override
public double funA(CalculateRequest request){
return 0.001;
}
}
/**
* 调用指定url下的接口,增加fallback断路器
*/
@FeignClient(url="${http.test_service_url}", value = "test-1", fallback = TestApiHystrix.class)
public interface TestApi {
@PostMapping(value = "/springboot/calculate/add3")
double funA(CalculateRequest request);
}
Feign请求超时问题
Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。而首次请求往往会比较慢(因为Spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了
解决方案有三种,以feign为例。
方法一
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
该配置是让Hystrix的超时时间改为5秒
方法二
hystrix.command.default.execution.timeout.enabled: false
该配置,用于禁用Hystrix的超时时间
方法三
feign.hystrix.enabled: false
该配置,用于索性禁用feign的hystrix。不推荐使用。
四、使用
1.在main主入口类添加FeignClients启用注解:
@EnableFeignClients
2.注入及使用
@Resource
private TestApi testApi;
public void tfunA()
{
var re = testApi.funA();
}