OpenFeign - 介绍

springcloud出品,OpenFeign默认将Ribbon作为负载均衡器,直接内置了 Ribbon。在导入OpenFeign 依赖后无需专门导入Ribbon 依赖。

一、使用方法

1、引入openfeign:

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、在主程序类上添加注解 @EnableFeignClients:表示启用 Feign 客户端;

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
}

3、定义用于调用服务提供者的 Feign 接口

@FeignClient("provider-instance-name") //标识服务为 feign 的客户端
public interface ProviderFeignClient {
    //定义端点的路径和动作
    @RequestMapping( 
            method= RequestMethod.GET,
            value="/providers/{providerId}",
            consumes="application/json")
    //定义传入端点的参数,该方法可以由客户端调用以触发组织服务        
    Provider getProvider(@PathVariable("providerId") String providerId);
}

4、要是用 ProviderFeignClient 类,开发人员只需要自动装配并使用它即可。

二、Openfeign常用配置

超时配置

feign:
  client:
    config:
      # 要调用服务的名称
      stock-service: #如果是全局配置 则为 default
        # 设置日志记录级别,其取值共有none、basic、headers、full
        loggerLevel: HEADERS
        # feign的配置优先于ribbon
        connectTimeout: 5000
        readTimeout: 5000

负载均衡策略配置

1、修改配置文件

stock-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

2、修改JavaConfig类

在 JavaConfig 类中添加负载 Bean 方法。全局所有feign对应服务都可以生效。

@Configuration
public class FeignConfiguration {
    /**
     * 配置随机的负载均衡策略
     * 特点:对所有的服务都生效
     */
    @Bean
    public IRule loadBalancedRule() {
        return new RandomRule();
    }
}

三、定义拦截器

/**
 * 自定义feign拦截器
 */
public class CustomFeignInterceptor implements RequestInterceptor {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void apply(RequestTemplate requestTemplate) {
        //写一些自己的逻辑 带上token 什么之类的
        String access_token = UUID.randomUUID().toString();
        requestTemplate.header("Authorization",access_token);
        logger.info("feign拦截器!");
    }
}

注册此拦截器

@Configuration
public class OpenFeignConfig {
    /**
     * 自定义feign拦截器
     * @return
     */
    @Bean
    public CustomFeignInterceptor customFeignInterceptor() {
        return new CustomFeignInterceptor();
    }
}

如果写在配置类中,注入的形式则就是全局的拦截器,因为并没有指定是为具体服务进行配置。

feign:
  client:
    config:
      stock-service: #服务名
        requestInterceptors:
          - com.gaby.cloud.order.interceptor.feign.CustomFeignInterceptor

 

如果写在配置文件中指明了服务,则为具体的服务指定一个或者多个拦截器



posted on 2022-02-15 14:32  TrustNature  阅读(3607)  评论(0编辑  收藏  举报