springcloud-openfeign
官方定义:声明式rest客户端
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开启openfeign
启动类加开启注解
@EnableFeignClients
一、声明式实现
定义一个feign客户端
//指定value会在nacos注册中心查找service-product服务
@FeignClient(value = "service-product")
public interface ProductFeign {//这个就是MVC注解,两套使用逻辑//标注在controller上,是接收这样的请求//标注在feign上,是发送这样的请求//这段代码的意思是,在service-product服务上有个完全对应的@GetMapping("/get/{id}")请求@GetMapping("/get/{id}")//Product意思是,将返回值转为Product类型Product getProductid(@PathVariable("id") Integer id);
}
假如接收方需要有请求头token校验,可以这样写,就可以实现发送请求头
@GetMapping("/get/{id}")
Product getProductid(@PathVariable("id") Integer id, @RequestHeader("token") String token);
注意:feign请求是自动实现负载均衡的
二、第三方请求
用feign请求非注册中心服务
//value 是随意指定的服务名称,url是第三方域名
@FeignClient(value = "weather-service", url = "http://aliv18.data.moji.com")
public interface WeatherFeign {//whapi/json/alicityweather/condition //这个地址请求地址,需要发送post请求@PostMapping("/whapi/json/alicityweather/condition")//请求需要带1个header,和两个参数String getWeather(@RequestHeader("Authorization") String auth,@RequestParam("token") String token,@RequestParam("cityId") String cityId);
}
三、超时控制
openfeign默认:
connectTimeout(连接超时)=10秒
readTimeout(读取超时)=60秒
feign:client:config:#设置默认feign配置default:logger-level: fullconnect-timeout: 6000read-timeout: 8000#设置指定service-product服务配置service-product:logger-level: fullconnect-timeout: 3000read-timeout: 5000
四、重试机制
可以通过注入一个Retryer 实现重试机制。
@Bean
public Retryer retryer(){return new Retryer.Default();
}
默认最大重试时间1分钟,重试5次,间隔100毫秒,也可以自己设置默认值
五、拦截器
实现一个RequestInterceptor feign接口,可以通过apply方法进行拦截
@Component
public class TokenRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {//拦截请求,给header赋值tokenrequestTemplate.header("token", UUID.randomUUID().toString());}
}
六、fallback 兜底返回
定义fallback类,实现目标Feign
@Component
public class ProductFeignFallback implements ProductFeign {@Overridepublic Product getProductid(Integer id) {Product product = new Product();product.setPrice("0");product.setName("0");product.setId(0);return product;}
}
目标Feign中要加上fallback = ProductFeignFallback.class
@FeignClient(value = "service-product", fallback = ProductFeignFallback.class)
fallback要结合sentinel使用
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
增加配置
feign:sentinel:enabled: true