iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringCloud如何利用Feign访问外部http请求
  • 308
分享到

SpringCloud如何利用Feign访问外部http请求

2024-04-02 19:04:59 308人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录Feign访问外部Http请求 累死人的写法:(仅参考)话不多说,先上pom.xmlbootstap.yml 部分配置在spingbootApplication启动类上

Feign访问外部http请求

大家好,目前接手了一个项目,具体的逻辑并不复杂,主要是一个"中间商"角色, 比如客户端通过我访问高德地图api,就不需要带秘钥,直接带高德API所需的入参和url后缀,就可以访问。

目前遇到这样一个问题,项目架构师要求所有的项目自己写的htttpClintUtils或者其他工具,需要替换到feign的形式来完成调用,但是,目前这个项目访问外部的http接口很多,比如,提供的高德服务就有10多种,一共有大几十类型,这样的话,如果按照以前的方式,一个接口指定一个高德子服务,那岂不是要累死 = =!

 累死人的写法:(仅参考)

@FeignClient(value = "test",url = "http://ip:port")
public interface TestFeign {
    
    @PostMapping(value = "/Amap/geo")
    Object geo(@RequestBody GeoEntity entity);
 
    
    @PostMapping(value = "/Amap/regeo")
    Object regeo(@RequestBody RegeoEntity entity);  
    .........
    ...........
}

然后如果我除了高德服务还有其他外部服务,并且其他外部服务下的子接口,不一定就两个,那这样写的话,要头大死,并且这样的写法,在服务的内部,不能做秘钥和权限的动态配置,只能在url上做指定,比较笨拙,所以就需要一种可以灵活访问外部httpClient的Feign接口,只需要我指定一个url,指定下提交的post数据,就可以得到返回结果,岂不是美滋滋?

话不多说,先上pom.xml

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
 
        <!-- 引入 httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-httpclient</artifactId>
            <version>8.18.0</version>
        </dependency>

前两个是feign和服务降级用到的包,后两个是用Apache Http替换原生的feign-http-client用来提供连接池等功能。

bootstap.yml 部分配置

feign:
  httpclient:
    enabled: true
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000  #降级超时时间,我设置为3秒。 feign.retry默认超时时间是5s.

设置了个降级超时时间,还有启动了feign访问外部httpClient配置和服务降级配置。

在spingbootApplication启动类上增加注解

@EnableFeignClients  @EnableHystrix

代码部分:

public interface HttpRequestFeign { 
    @RequestLine("GET")
    String sendGetRequest(URI baseUri);
 
    @RequestLine("POST")
    String sendPostRequest(URI baseUri, Map map);
}

调用部分,这里我在我的BaseController构造注解,其他服务Controller继承,提供调用能力:

 @Autowired
    public BaseController(Decoder decoder, Encoder encoder) {
        httpRequestFeign = Feign.builder().encoder(encoder).decoder(decoder)
                .target(Target.EmptyTarget.create(HttpRequestFeign.class)); 
    }
 protected String httpPostSend( String url, Map map) {
        String response = "";
        try {
            response = httpRequestFeign.sendPostRequest(new URI(url), map);
            logger.info("调用外部服务返回的数据为->{}", response);
            // 这里改成重试的超时异常
        } catch (RetryableException a) {
            logger.error("调用外部服超时错误->{}", response);
        } catch (Exception e) {
            logger.error("调用外部服异常错误->{}", response);
        }
        return response;
    }

这里只列举了Post的,Get方式,就不用了携带map参数了。

然后在你的Controller层增加降级@HystrixCommand注解,并指定降级方法:

 @HystrixCommand(fallbackMethod = "fallback")
 @PostMapping(value = "/1_0_0/{subServer}", produces = "application/JSON;charset=UTF-8")
 public Object send(@RequestBody Map<String, Object> map, @PathVariable String subServer) {
 
.......................
.................... 
 
 private Object fallback(Map<String, String> map, String subserver, Throwable e) {
        logger.error("xxx服务发生问题,入参:{},地址:{}", map, subserver);
        return Result.fail(ResultCode.INTERNAL_SERVER_ERROR.getCode(), ERROR_MSG + e.toString());
    }

在send方法里可以自行进行拼接url,而Map就是传递给第三方服务的数据。 

FeignClient外部http请求

SpringBoot 4.0.0

pom.xml 引入openfeign 2.0.2

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-openfeign</artifactId>
                <version>2.0.2.BUILD-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
<!--外部http请求 FeignClient-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
</dependencies>
<repositories>
        <!--外部http请求 FeignClient-->
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/libs-snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

启动类 添加注解@EnableFeignClients

@SpringBootApplication
@MapperScan("com.sichuang.repository.dao")//将项目中对应的mapper类的路径加进来就可以了
@ServletComponentScan
@EnableFeignClients
public class RepositoryApplication extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(RepositoryApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // TODO Auto-generated method stub
//      return super.configure(builder);
        return builder.sources(RepositoryApplication.class);
    }
}

外部接口类。调用方式同service

@RequestParam 参数注解

produces = MediaType.APPLICATION_jsON_UTF8_VALUE 返回json参数

package com.sichuang.repository.api;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.WEB.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;

@FeignClient(url = "${url}", name = "Ewaytec2001API")
public interface Ewaytec2001API {
    
    @GetMapping(value = "${url}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    String getEmployeeInfo(@RequestParam("id") int id, @RequestParam("sign") String sign);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SpringCloud如何利用Feign访问外部http请求

本文链接: https://www.lsjlt.com/news/141950.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringCloud如何利用Feign访问外部http请求
    目录Feign访问外部http请求 累死人的写法:(仅参考)话不多说,先上pom.xmlbootstap.yml 部分配置在spingbootApplication启动类上...
    99+
    2024-04-02
  • SpringCloud怎么利用Feign访问外部http请求
    这篇文章主要介绍了SpringCloud怎么利用Feign访问外部http请求的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud怎么利用Feign访问外部http请求文章都会有所收获,下面我们...
    99+
    2023-06-29
  • feign如何打印出http请求
    目录feign打印出http请求1.记录请求和响应的头文件2.在配置文件中配置对应的包feign请求日志统一打印feign打印出http请求 用openfign依赖需要将请求的方法中...
    99+
    2024-04-02
  • SpringCloud Feign请求头如何删除修改
    本篇内容主要讲解“SpringCloud Feign请求头如何删除修改”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringCloud Feign请求头如何删除修改”吧!...
    99+
    2023-06-29
  • Feign如何实现第三方的HTTP请求
    目录Feign调用的简单实现1. 默认模式,不使用配置类,作用于服务内部调用而非三方请求接口2.自定义配置类3.自定义配置类法2 4. @FeignClient参数说明5....
    99+
    2022-11-13
    Feign HTTP请求 第三方HTTP请求 Feign第三方HTTP请求
  • 使用feign发送http请求解析报错的问题
    目录错误如下错误原因解决方案一解决方案二错误2错误如下 发送请求开始 ----- [ChannelFeign#formRecog] ---> END HTTP (304117-...
    99+
    2024-04-02
  • 如何利用HttpUtils发送一个http请求
    如何利用HttpUtils发送一个http请求?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。上代码import java.io.IOException;import&...
    99+
    2023-05-31
    http请求 httputils
  • springcloud如何使用Feign后台内部传递MultipartFile
    目录如何使用Feign后台内部传递MultipartFile先修改FeignClient接口内部调用注意点Feign进行跨服务传递MultipartFile文件通过feign进行跨服...
    99+
    2024-04-02
  • 亚马逊服务器不能访问外部请求怎么办呀
    权限不足:检查您的帐户是否已获得足够的权限来访问外部资源。如果权限不足,您可能无法访问外部资源。 硬件故障:如果服务器硬件出现故障,例如服务器过载、内存不足或硬盘故障,可能会导致无法访问外部资源。 网络故障:如果您的网络连接不稳定或速度较...
    99+
    2023-10-27
    亚马逊 服务器
  • ASP 学习笔记:如何利用 numpy 加速 http 请求?
    在现代 Web 开发中,http 请求是不可避免的。然而,对于大量的 http 请求,服务器的响应速度可能会变得很慢。这时,我们可以利用 numpy 库来加速 http 请求。 numpy 是一个高效的 Python 数值计算库,它可以帮...
    99+
    2023-08-29
    学习笔记 numpy http
  • 如何使用Feign传递请求头信息
    这篇文章将为大家详细讲解有关如何使用Feign传递请求头信息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Feign传递请求头信息在我之前的文章服务网关Spring Cloud Zuul中,将用户的登录i...
    99+
    2023-06-29
  • 亚马逊服务器不能访问外部请求怎么办呢苹果
    苹果公司的服务器也可能受到安全限制的影响,这是因为它的安全策略可能不允许外部访问服务器的任何数据和系统。为了解决这个问题,苹果公司可以监测安全策略,确保它可以正确地执行安全策略,并定期更新和测试它的系统。如果苹果公司的服务器仍然不能访问外部...
    99+
    2023-10-27
    亚马逊 苹果 服务器
  • c++内部类如何访问外部类成员
    在C++中,内部类可以直接访问外部类的成员变量和成员函数。为了访问外部类的成员,内部类需要使用外部类的指针来引用外部类的成员。以下是...
    99+
    2024-04-02
  • 如何使用VBS访问外部文本文件
    本篇内容主要讲解“如何使用VBS访问外部文本文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用VBS访问外部文本文件”吧!处理文件用到的常量有:ForReading = 1 ,ForWr...
    99+
    2023-06-08
  • redis如何开启外部访问权限
    redis开启外部访问权限的方法:开启redis端口访问权限,redis默认的端口是6379,可输入命令开启:iptables -A INPUT -p tcp --dport 6379 -j ACCEPT或编辑“vim /etc/sysco...
    99+
    2024-04-02
  • 亚马逊服务器无法访问外部请求文件的解决方法
    1. 检查网络连接和防火墙设置 首先,确保亚马逊服务器的网络连接正常。检查服务器的网络配置,确保网络设置正确,并且没有任何防火墙或网络安全设置阻止了对外部请求文件的访问。 2. 检查 DNS 设置 如果服务器无法解析外部域名,可能是由于 ...
    99+
    2023-10-27
    亚马逊 解决方法 无法访问
  • 如何使用RestTemplate访问https实现SSL请求操作
    这篇文章主要介绍了如何使用RestTemplate访问https实现SSL请求操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、添加HttpsClientRequestF...
    99+
    2023-06-25
  • 面试官必问的问题:你如何使用 Python 处理 HTTP 请求?
    在现代 Web 开发中,HTTP 请求是不可或缺的一部分。Python 作为一种流行的编程语言,具有处理 HTTP 请求的能力。本文将探讨如何使用 Python 处理 HTTP 请求。 HTTP 请求 HTTP 请求由请求行、请求头和请求...
    99+
    2023-09-26
    接口 面试 http
  • phpmyadmin如何实现root账户外部访问
    本篇内容介绍了“phpmyadmin如何实现root账户外部访问”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • 如何解决springcloud feign 首次调用100%失败的问题
    叙述 在高并发情况下发布应用时,经常会发现监控中有很多超时报错或者断路器打开,下图中可以看到监控情况,测试时也会偶现第一次feign调用出错,第二次就会恢复正常。 分析 大...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作