国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

feign自定義第三方接口;配置化Feign接口URL;調(diào)用指定IP的feign服務(wù)

這篇具有很好參考價值的文章主要介紹了feign自定義第三方接口;配置化Feign接口URL;調(diào)用指定IP的feign服務(wù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

最近接手一個項目,各子工程之間通過feign調(diào)用;各服務(wù)部署在K8S上,通過nacos管理配置;由于服務(wù)部署的機器無法開放端口等原因,導(dǎo)致本機服務(wù)與測試環(huán)境網(wǎng)絡(luò)端口無法互通,故需要重寫feign的調(diào)用地址;個人總結(jié)的方法有以下幾種:

目錄

?第一種:feignclient配置URL

第二種:實現(xiàn)RequestInterceptor接口;

第三種:重寫feign的client的execute方法;


?第一種:feignclient配置URL

????????在feignclient里寫一個固定地址或者寫一個可配置的地址,這樣可以在配置文件里指定,這種方式在創(chuàng)建feign客戶端的時候就需要規(guī)劃好。

? ? ? ? 1.1 固定地址

@FeignClient(name = "feignCustomerService", url = "http://localhost:8080")
public interface FeignCustomerService {
    /**
     * 請求客戶的接口
     */
    @RequestMapping(value = "order/update", method = RequestMethod.POST)
    @Headers(value = "Content-Type: application/json")
    OrderHttpResponse updateOrder(@RequestBody OrderUpdateDTO orderUpdateDTO);
 
}

1.2 可配置的地址

@FeignClient(name = "feignCustomerService", url = "${customer.url}")
public interface FeignCustomerService {
   
    @RequestMapping(value = "test/list", method = RequestMethod.POST)
    @Headers(value = "Content-Type: application/json")
    OrderHttpResponse updateTest(@RequestBody OrderUpdateDTO orderUpdateDTO);
 
}

配置文件配置地址

customer.url=http://localhost:8080

第二種:實現(xiàn)RequestInterceptor接口;

????????這種方式具有局限性,在nacos上注冊的服務(wù)IP與本機IP不一致的時候(連接VPN)可能依舊調(diào)不通服務(wù),但是實現(xiàn)RequestInterceptor接口可以處理全局請求(header,身份認(rèn)證等)

@Component
public class Oauth2TokenRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 獲取請求中的消息頭
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String requestHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
        if (StringUtils.isNotBlank(requestHeader) && requestHeader.startsWith("Bearer ")) {
            // 將消息頭塞入到請求模板中
            requestTemplate.header(HttpHeaders.AUTHORIZATION, requestHeader);
        }
        //重寫URL,訪問指定服務(wù)
        String url = target.url();
        String newUrl = "http://localhost:8080";
        template.target(newUrl );
    }
}

第三種:重寫feign的client的execute方法;

????????這種方式可以自定義負(fù)載均衡的策略,也可以自定義訪問指定服務(wù)IP,這里以FeignBlockingLoadBalancerClient為例

配置類

package com.***.redirect;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import java.util.Map;

@Getter
@Setter
@RefreshScope
@ConfigurationProperties("localbalance")
@Component
public class LocalFeignPerpreties {
    private Boolean enable;
    private Map<String,String> rule;
}

配置文件配置內(nèi)容:

localbalance:
  enable: true
  rule:
    aiflow-sys: http://IP:8888/SERVICE
    aiflow-auth: http://IP:8888/SERVICE

重寫FeignBlockingLoadBalancerClient 的execute方法

package com.***.redirect;

import feign.Client;
import feign.Request;
import feign.RequestTemplate;
import feign.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient;
import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
import org.springframework.context.annotation.Primary;
import org.springframework.util.Assert;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.util.UriComponentsBuilder;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.*;

//@ConditionalOnBean
//@Primary
@Slf4j
public class LocalBlockingLoadBalancerClient extends FeignBlockingLoadBalancerClient {
    private Client delegate;
    private BlockingLoadBalancerClient loadBalancerClient;
    @Autowired
    private LocalFeignPerpreties localFeignPerpreties;

    public LocalBlockingLoadBalancerClient(Client delegate,
                                           BlockingLoadBalancerClient loadBalancerClient) {
        super(delegate, loadBalancerClient);
        this.delegate = delegate;
        this.loadBalancerClient = loadBalancerClient;
    }

    @Override
    public Response execute(Request request, Request.Options options) throws IOException {
        try {
            log.info("feign -> 配置化客戶端");
            Boolean enable = localFeignPerpreties.getEnable();
            if (enable) {
                String url = request.url();
                RequestTemplate requestTemplate = request.requestTemplate();
                String name = requestTemplate.feignTarget().name();
                Map<String, String> urlMap = localFeignPerpreties.getRule();
                if (urlMap != null && urlMap.containsKey(name)) {
                    URI uri = URI.create(url);
                    StringBuffer strbuf = new StringBuffer();
                    strbuf.append(urlMap.get(name)).append(uri.getPath());
                    if (StringUtils.isNotBlank(uri.getQuery())) {
                        strbuf.append("?").append(uri.getQuery());
                    }
                    requestTemplate.target(urlMap.get(name));
                    Map<String, Collection<String>> headers = request.headers();
                    Map<String, Collection<String>> newheaders = new HashMap<>();
                    //處理請求頭
                    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                    HttpServletRequest attributesRequest = attributes.getRequest();
                    Enumeration<String> headerNames = attributesRequest.getHeaderNames();
                    if (headerNames != null) {
                        while (headerNames.hasMoreElements()) {
                            String element = headerNames.nextElement();
                            String elementVal = attributesRequest.getHeader(element);
                            newheaders.put(element, new ArrayList<String>() {{
                                add(elementVal);
                            }});
                        }
                    }
                    //構(gòu)建新的request
                    Request newRequest = buildRequest(request, strbuf.toString(), newheaders);
                    return super.getDelegate().execute(newRequest, options);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("feign -> 默認(rèn)客戶端");
        return super.execute(request, options);
    }

    protected Request buildRequest(Request request,
                                   String reconstructedUrl,
                                   Map<String, Collection<String>> headers) {
        return Request.create(request.httpMethod(), reconstructedUrl, headers,
                request.body(), Charset.forName("UTF-8"), request.requestTemplate());
    }

}

使配置類和重寫的client生效

package com.***.redirect;

import feign.Client;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@ConditionalOnProperty(prefix = ReBalancerProperties.prefix,name = "enable",havingValue = "true")
@Configuration
@EnableConfigurationProperties(value = {LocalFeignPerpreties.class})
public class ReBalancerConfiguration {

    @Bean
    public Client feignReBalancer(BlockingLoadBalancerClient discoveryClient) {

        return new LocalBlockingLoadBalancerClient(new Client.Default(null, null),
                discoveryClient);
    }
}

????????到這里基本上可以滿足重寫feign URL的需求了,這個前提條件是代碼在application啟動類的下一級,如果不在啟動類的同級或者下一級,是無法掃描到相關(guān)類的,這時我們可以注解完成掃描,需要在啟動類上加上相關(guān)注解文章來源地址http://www.zghlxwxcb.cn/news/detail-767313.html

package com.***.annotation;

import com.***.ReBalancerConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import(ReBalancerConfiguration.class)
@AutoConfigurationPackage
public @interface EnableLocalFeignClient {
}

到了這里,關(guān)于feign自定義第三方接口;配置化Feign接口URL;調(diào)用指定IP的feign服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • php第三方阿里云接口

    阿里云 OpenAPI 開發(fā)者門戶

    2024年02月15日
    瀏覽(22)
  • 【黑馬頭條之內(nèi)容安全第三方接口】

    【黑馬頭條之內(nèi)容安全第三方接口】

    本筆記內(nèi)容為黑馬頭條項目的文本-圖片內(nèi)容審核接口部分 目錄 一、概述 二、準(zhǔn)備工作 三、文本內(nèi)容審核接口 四、圖片審核接口 五、項目集成 內(nèi)容安全是識別服務(wù),支持對圖片、視頻、文本、語音等對象進行多樣化場景檢測,有效降低內(nèi)容違規(guī)風(fēng)險。 目前很多平臺都支持

    2024年02月15日
    瀏覽(25)
  • 對接 Web Service第三方接口

    對接 Web Service第三方接口

    這次也是頭一次接觸對接第三方WebService接口,這技術(shù)都很老了,使用postman測試的時候還找了半天資料??。 一般來說第三方都會限制ip這些,需要注意的是,給到的接口地址是能用公網(wǎng)進行訪問的哦。 1、拿到接口路徑 http://111.111.11.1:111/services/infoWebService?wsdl 這個當(dāng)然是不可

    2023年04月11日
    瀏覽(21)
  • SpringBoot案例 調(diào)用第三方接口傳輸數(shù)據(jù)

    SpringBoot案例 調(diào)用第三方接口傳輸數(shù)據(jù)

    最近再寫調(diào)用三方接口傳輸數(shù)據(jù)的項目,這篇博客記錄項目完成的過程,方便后續(xù)再碰到類似的項目可以快速上手 項目結(jié)構(gòu): 這里主要介紹HttpClient發(fā)送POST請求工具類和定時器的使用,mvc三層架構(gòu)編碼不做探究 pom.xml application-dev.yml Constast utils scheduled 該定時任務(wù)每10秒執(zhí)行一

    2024年02月12日
    瀏覽(29)
  • 僅僅是調(diào)用第三方接口那么簡單嗎?

    僅僅是調(diào)用第三方接口那么簡單嗎?

    最近有個項目需要本地處理之后,然后調(diào)用第三方接口,本來開始覺得很簡單得事情,不就是調(diào)用第三方接口嗎?但是卻一波三折。 首先有了下面的第一版的設(shè)計。 這個設(shè)計很簡單,也是最容易想到的。主要有下面幾步 1、本地處理; 2、調(diào)用第三方接口; 3、本地日志打印

    2024年02月06日
    瀏覽(25)
  • OpenAI 接口API的第三方代理

    OpenAI推出了針對開發(fā)者的API接口,這是供程序代碼去調(diào)用的,不是面向普通人的。我們經(jīng)??吹降膰鴥?nèi)版ChatGPT,就是對API接口的界面包裝再出售會員。 目前,公開對外使用的是GPT-3.5模型的API接口,GPT-4模型的接口處于測試階段,開發(fā)者需要申請權(quán)限加入等待列表,審核通過

    2024年02月07日
    瀏覽(20)
  • 我調(diào)用第三方接口遇到的13大坑

    我調(diào)用第三方接口遇到的13大坑

    在實際工作中,我們經(jīng)常需要在項目中調(diào)用第三方API接口,獲取數(shù)據(jù),或者上報數(shù)據(jù),進行數(shù)據(jù)交換和通信。 那么,調(diào)用第三方API接口會遇到哪些問題?如何解決這些問題呢? 這篇文章就跟大家一起聊聊第三方API接口的話題,希望對你會有所幫助。 ? 一般我們在第一次對接

    2023年04月16日
    瀏覽(29)
  • java對接第三方接口的三種方式

    在日常工作中,經(jīng)常需要跟第三方系統(tǒng)對接,我們做為客戶端,調(diào)用他們的接口進行業(yè)務(wù)處理,常用的幾種調(diào)用方式有: 1.原生的Java.net.HttpURLConnection(jdk); 2.再次封裝的HttpClient、CloseableHttpClient(Apache); 3.Spring提供的RestTemplate; 當(dāng)然還有其他工具類進行封裝的接口,比

    2024年04月28日
    瀏覽(26)
  • hutool的httpUtil的使用(訪問第三方接口)

    以下僅為自己項目中所寫并能夠跑通 有問題留言 如若不對 請指出告知一下

    2024年02月06日
    瀏覽(29)
  • Java調(diào)用第三方http接口的常用方式

    前言 一、通過JDK網(wǎng)絡(luò)類Java.net.HttpURLConnection 二、通過apache common封裝好的HttpClient 三、通過Spring的RestTemplate 總結(jié) 今天項目需要接口互相調(diào)用,就看了一下這幾個調(diào)用的方式 通過java.net包下的原生java.api提供的http請求 使用步驟: 通過統(tǒng)一的資源定位器(java.net.URL)獲取連接器(java.

    2024年02月08日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包