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

请求状态码

image-20220715105658555

401:没有权限,没有tocken

403:权限不足,有tocken,但权限不够

400:请求参数有问题,不符合规定

503:服务不可用 ,提供者没有启动,或者启动有问题

429:被限流,提供者

500:提供者报错

405:方法不允许

文章作者: 郭远
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 郭远的博客空间
SpringCloud SpringCloud
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝