Feign调用的问题、yaml配置okhttp

我爱海鲸 2025-10-09 20:40:57 暂无标签

简介springcloud、异步请求、Feigin、pom

2025-10-09 start:

Feign使用okhttp调用接口,yaml配置okhttp

yaml配置:

spring:
  cloud:
    openfeign:
      okhttp:
        enabled: true

pom:

                   <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.boot.version>3.4.5</spring.boot.version>
        <spring.cloud.version>2024.0.1</spring.cloud.version>
        <spring.cloud.alibaba.version>2023.0.3.2</spring.cloud.alibaba.version>
        <hutool-5.version>5.8.35</hutool-5.version>
        <hutool-6.version>6.0.0-M19</hutool-6.version>



             <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>        

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

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

        <!-- ✅ 使用 OkHttp 作为 Feign 的底层客户端 -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
            <!-- 版本由 Spring Cloud BOM 自动管理,无需写 version -->
        </dependency>

end

碰到的一个异步调用丢失请求头的问题:https://blog.csdn.net/MarkusZhang/article/details/107888599

FeignClientInterceptor:
@Component
public class FeignClientInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        // 或者从当前请求上下文中获取
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            String authorizationHeader = attributes.getRequest().getHeader("Authorization");
            if (authorizationHeader != null) {
                template.header("Authorization", authorizationHeader);
            }
        }
    }
}
FeignConfig:
@Configuration
public class FeignConfig {

    @Bean
    public FeignClientInterceptor feignClientInterceptor() {
        return new FeignClientInterceptor();
    }
}

cleint:

@FeignClient(value = "testClient",url = "localhost:8080",path = "/test", configuration = FeignConfig.class)
public interface testClient {

    @PostMapping("/time")
    List<DataVo> findByTime(@RequestParam(required = false) String dateTime);

}

接口的调用:

    @PostMapping("/dataOverview")
    public ResponseModel dataOverview(@RequestParam(required = false) String appName, @RequestParam(required = false) String dateTime) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        // 创建 CompletableFuture 任务
        CompletableFuture<List<DataVo>> test1Future = getTest1List(dateTime);
        CompletableFuture<List<DataVo>> test2Future = getTest2List(dateTime);



        // 组合所有 CompletableFuture 任务
        return CompletableFuture.allOf(test1Future , test2Future )
                .thenApply(v -> {
                    try {
                        // 获取所有异步任务的结果
                        List<DataVo> dataVoList1 = test1Future .get();
                        log.info("dataVoList1 【{}】",dataVoList1 );

                        List<DataVo> dataVoList2 = test1Future .get();
                        log.info("dataVoList2 【{}】",dataVoList2 );

                        // 构建 返回对象
                        ResultVo vo = new ResultVo ();
                        

                        return ResponseModel.success(vo);
                    } catch (Exception e) {
                        log.error("异步异常【{}】",e.getMessage(),e);
                       return ResponseModel.success(e.getMessage());
                    }
                })
                .exceptionally(ex ->{
                    log.error("总异常【{}】",ex.getMessage(),ex);
                    return ResponseModel.error(ex.getMessage());
                })
                .join();
    }


    private CompletableFuture<List<DataVo>> getTest1List(RequestAttributes requestAttributes,String appName, String dateTime) {
        return CompletableFuture.supplyAsync(() -> {
           // 异步请求需要重新设置请求头,然后再feigin的拦截器中重新设置。
            RequestContextHolder.setRequestAttributes(requestAttributes);
            return testClient.findByTime(dateTime);
        });
    }

pom文件:

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

2025-01-14 start:

我们可以通过直接设置header来传递token

@FeignClient(name = "yourServiceName", url = "${your.service.url}")
public interface YourServiceClient {
    @GetMapping("/your-endpoint")
    ResponseEntity<String> yourMethod(@RequestHeader("Authorization") String authorization);
}

end

你好:我的2025