在微服务中使用Feign调用第三方的接口

在微服务中使用Feign调用第三方的接口

概述:在微服务中我们一般使用FeignClient作为服务内部组件的调用,如下:

@FeignClient(name = "xxx", fallbackFactory = xxxClientFallback.class)
public interface xxxClient {
	//接口方法
}

因为name一般都是一个常量,即注册到注册中心的服务,不太适合配置成一个url,那么使用FeignClient怎么调用第三方的接口呢?
接下来介绍一下一种使用Feign的工具类来调用的方式,避免在微服务项目中再使用原始http的方法来调用三方接口

1、引入坐标

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

2、工具类如下

import feign.Client;
import feign.Contract;
import feign.Feign;
import feign.Request.Options;
import feign.Retryer;
import feign.codec.Decoder;
import feign.codec.Encoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

import javax.net.ssl.*;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

@Component
@Import(FeignClientsConfiguration.class)
public class FeignUtil {

    @Autowired
    private Decoder decoder;
    @Autowired
    private Encoder encoder;
    @Autowired
    private Contract contract;

    @Bean
    @ConditionalOnMissingBean
    public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
                              SpringClientFactory clientFactory) throws NoSuchAlgorithmException, KeyManagementException {
        SSLContext ctx = SSLContext.getInstance("SSL");
        X509TrustManager tm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        ctx.init(null, new TrustManager[]{tm}, null);
        return new LoadBalancerFeignClient(new Client.Default(ctx.getSocketFactory(),
                new HostnameVerifier() {

                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                }),
                cachingFactory, clientFactory);
    }

    public <T> T service(Class<T> apiType, String url) {
        if (!url.startsWith("http")) {
            url = "http://" + url;
        }
        return Feign.builder()
                .options(new Options(30000, 30000))
                .retryer(new Retryer.Default(5000, 5000, 3))
                .decoder(decoder).encoder(encoder).contract(contract).target(apiType, url);
    }

    public <T> T service(Class<T> apiType, ServiceInstance instance) {
        String url = "http://" + instance.getHost() + ":" + instance.getPort();
        return Feign.builder()
                .options(new Options(30000, 30000))
                .retryer(new Retryer.Default(5000, 5000, 3))
                .decoder(decoder).encoder(encoder).contract(contract).target(apiType, url);
    }

}

3、在需要的地方注入使用

    @Autowired
    private FeignUtil feignUtil

在方法中调用feignUtil.service(),传入接口的Class对象,和要调用的接口url:

  xxxService service = feignUtil.service(xxxService.class, url);

xxxService就是第三方接口方法:

public interface xxxService {
	//获取票据
    @PostMapping("/xxx/xx/getTickit")
    public xxxResultDTO<String> getTicket(@RequestBody UserInfoDTO userInfoDTO);
}

已经获取到xxxService了,接下来直接调用getTicket接口即可:

 xxxResultDTO<String> dto = service.getTicket(userInfoDTO);

就像getTicket在本系统内部调用一样,拿到三方接口提供的ticket !!

每天进步一点点~ peace

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Feign是一个基于Java的声明式HTTP客户端,用于简化调用第三方接口的开发。使用Feign可以让我们像调用本地方法一样调用远程接口。 要使用Feign调用第三方接口,首先需要在项目引入Feign的依赖。在Maven项目,可以在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 接下来,在定义调用远程接口接口上添加`@FeignClient`注解,并指定要调用的远程服务的名称。例如: ```java @FeignClient(name = "third-party-service") public interface ThirdPartyServiceClient { @GetMapping("/api/some-resource") ResponseEntity<String> getSomeResource(); } ``` 在上述示例,`ThirdPartyServiceClient`接口定义了一个`getSomeResource()`方法,用于调用第三方服务的`/api/some-resource`接口。 最后,在需要调用远程接口的地方注入`ThirdPartyServiceClient`接口,并使用接口的方法进行调用。例如: ```java @RestController public class MyController { private final ThirdPartyServiceClient thirdPartyServiceClient; public MyController(ThirdPartyServiceClient thirdPartyServiceClient) { this.thirdPartyServiceClient = thirdPartyServiceClient; } @GetMapping("/my-endpoint") public ResponseEntity<String> myEndpoint() { return thirdPartyServiceClient.getSomeResource(); } } ``` 在上述示例,`MyController`的`myEndpoint()`方法通过调用`ThirdPartyServiceClient`接口的方法来获取第三方服务的资源。 需要注意的是,Feign还支持其他功能,如请求拦截器、熔断器等,可以根据具体需求进行配置和使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q J X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值