4.OpenFeign
OpenFeign简介
Feign 是声明性(注解)Web 服务客户端。它使编写 Web 服务客户端更加容易。要使用 Feign, 请创建一个接口并对其进行注解。
Spring Cloud 添加了对 Spring MVC 注解的支持,并支持使用 HttpMessageConverters,Spring Web 中默认使用的注解。
Spring Cloud 集成 了 Ribbon 和 Eureka 以及 Spring Cloud LoadBalancer,以在使用 Feign 时提供负载平衡的 http 客户端
Feign 是一个远程调用的组件 (接口,注解) http 调用的
Feign 集成了 ribbon ,ribbon 集成了 eureka
使用方法
-
添加依赖Openfeign
-
在启动类上添加注解@EnableFeignClients(valeu = “com.my.feign”) 加入value减少包扫描时间
-
在com.my.feign下新建接口类,实现服务类接上@FeignClient(value = “provider-order-service”)
写入方法
-
在控制层通过自动注入Feign文件来调用其中的方法
ribbon的超时设置
ribbon: #feign 默认调用 1s 超时
ReadTimeout: 5000 #修改调用时长为 5s
ConnectTimeout: 5000 #修改连接时长为 5s
feign传参
传参
-
通过 URL 传参数,GET 请求,参数列表使用@PathVariable(“”)
-
如果是 GET 请求,每个基本参数必须加@RequestParam(“”)
-
如果是 POST 请求,而且是对象集合等参数,必须加@Requestbody 或者@RequestParam
时间传参
-
feign传递data时间会误差十四个小时
-
要转化成字符串传输
OpenFeign源码分析
feign 是接口调用,接口如果想做事,必须要有实现类 可是我们并没有写实现类,只是加了一个@FeignClient(value=”xxx-service”)的注解,所以feign 帮我们创建了代理对象,然后完成真实的调用
@Autowired
RestTemplate restTemplate;
@Test
void contextLoads() {
//创建一个动态代理对象
UserOrderFeign o = (UserOrderFeign) Proxy.newProxyInstance(UserController.class.getClassLoader()
, new Class[]{UserOrderFeign.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args){
//System.out.println("进入invoke方法");
//获取getmapping中的值
GetMapping annotation = method.getAnnotation(GetMapping.class);
//拿到路径数组
String[] paths = annotation.value();
String path = paths[0];
//通过方法拿类
Class<?> aClass = method.getDeclaringClass();
//获取类上面feignClient的值
FeignClient annotation1 = aClass.getAnnotation(FeignClient.class);
//获取到value
String applicationName = annotation1.value();
//拼接路径地址
String url = "http://" + applicationName + "/" + path;
//访问路径
String result = restTemplate.getForObject(url,String.class);
return result;
}
});
String result = o.order();
System.out.println(result);
}
Feign提供了日志打印
- 创建配置类
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLogger() {
return logger.level.FULL;
}
- 修改配置文件
logging:
level:
com.bjpowernode.feign.UserOrderFeign: debug
请求状态码
401:没有权限,没有tocken
403:权限不足,有tocken,但权限不够
400:请求参数有问题,不符合规定
503:服务不可用 ,提供者没有启动,或者启动有问题
429:被限流,提供者
500:提供者报错
405:方法不允许