返回顶部
首页 > 资讯 > 精选 >SpringCloud怎么利用Feign访问外部http请求
  • 548
分享到

SpringCloud怎么利用Feign访问外部http请求

2023-06-29 11:06:15 548人浏览 八月长安
摘要

这篇文章主要介绍了SpringCloud怎么利用Feign访问外部Http请求的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springCloud怎么利用Feign访问外部http请求文章都会有所收获,下面我们

这篇文章主要介绍了SpringCloud怎么利用Feign访问外部Http请求的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springCloud怎么利用Feign访问外部http请求文章都会有所收获,下面我们一起来看看吧。

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: truehystrix:  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@EnableFeignClientspublic 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);}

关于“SprinGCloud怎么利用Feign访问外部http请求”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SpringCloud怎么利用Feign访问外部http请求”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

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

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

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

猜你喜欢
  • SpringCloud怎么利用Feign访问外部http请求
    这篇文章主要介绍了SpringCloud怎么利用Feign访问外部http请求的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud怎么利用Feign访问外部http请求文章都会有所收获,下面我们...
    99+
    2023-06-29
  • SpringCloud如何利用Feign访问外部http请求
    目录Feign访问外部http请求 累死人的写法:(仅参考)话不多说,先上pom.xmlbootstap.yml 部分配置在spingbootApplication启动类上...
    99+
    2024-04-02
  • feign怎么打印出http请求
    这篇文章主要讲解了“feign怎么打印出http请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“feign怎么打印出http请求”吧!feign打印出http请求用openfign依赖需要...
    99+
    2023-07-02
  • 使用feign发送http请求解析报错的问题
    目录错误如下错误原因解决方案一解决方案二错误2错误如下 发送请求开始 ----- [ChannelFeign#formRecog] ---> END HTTP (304117-...
    99+
    2024-04-02
  • 亚马逊服务器不能访问外部请求怎么办呀
    权限不足:检查您的帐户是否已获得足够的权限来访问外部资源。如果权限不足,您可能无法访问外部资源。 硬件故障:如果服务器硬件出现故障,例如服务器过载、内存不足或硬盘故障,可能会导致无法访问外部资源。 网络故障:如果您的网络连接不稳定或速度较...
    99+
    2023-10-27
    亚马逊 服务器
  • 线上SpringCloud Feign请求服务超时异常怎么排查
    今天小编给大家分享一下线上SpringCloud Feign请求服务超时异常怎么排查的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-06-26
  • SpringCloud中Feign组件添加请求头的坑怎么解决
    这篇文章主要介绍“SpringCloud中Feign组件添加请求头的坑怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringCloud中Feign组件添加请求头的坑怎么解决”文章能帮助大...
    99+
    2023-07-02
  • Filter怎么利用http请求实现绕过
    Filter怎么利用http请求实现绕过?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。http请求绕过Filter的实例场景:两个web服务器,A当做服务端,B...
    99+
    2023-05-31
    http filter
  • 亚马逊服务器不能访问外部请求怎么办呢苹果
    苹果公司的服务器也可能受到安全限制的影响,这是因为它的安全策略可能不允许外部访问服务器的任何数据和系统。为了解决这个问题,苹果公司可以监测安全策略,确保它可以正确地执行安全策略,并定期更新和测试它的系统。如果苹果公司的服务器仍然不能访问外部...
    99+
    2023-10-27
    亚马逊 苹果 服务器
  • springcloud怎么使用Feign后台内部传递MultipartFile
    这篇文章主要介绍了springcloud怎么使用Feign后台内部传递MultipartFile,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何使用Feign后台内部传递M...
    99+
    2023-06-29
  • JAVA中的HTTP请求怎么利用HttpClient实现发送
    JAVA中的HTTP请求怎么利用HttpClient实现发送?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。HttpClient介绍HttpClient 不是一个...
    99+
    2023-05-31
    java httpclient http
  • k8s集群怎么访问外部oracle
    要让Kubernetes集群访问外部的Oracle数据库,可以通过以下几个步骤进行设置:1. 创建一个Kubernetes Serv...
    99+
    2023-09-23
    oracle k8s
  • docker怎么访问外部数据库
    要访问外部数据库,你可以使用Docker的网络功能来连接到外部数据库。下面是一些步骤: 创建一个Docker网络: docker...
    99+
    2023-10-30
    docker 数据库
  • c语言中怎么利用http请求解析表单内容
    本篇文章给大家分享的是有关c语言中怎么利用http请求解析表单内容,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。代码如下: #ifn...
    99+
    2024-04-02
  • node中怎么利用Request实现一个HTTP请求客户端
    这期内容当中小编将会给大家带来有关node中怎么利用Request实现一个HTTP请求客户端,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 安装及简单使用安装requ...
    99+
    2024-04-02
  • 亚马逊服务器无法访问外部请求文件的解决方法
    1. 检查网络连接和防火墙设置 首先,确保亚马逊服务器的网络连接正常。检查服务器的网络配置,确保网络设置正确,并且没有任何防火墙或网络安全设置阻止了对外部请求文件的访问。 2. 检查 DNS 设置 如果服务器无法解析外部域名,可能是由于 ...
    99+
    2023-10-27
    亚马逊 解决方法 无法访问
  • 怎么使用PostgreSQL的FDW访问外部数据
    PostgreSQL的FDW(Foreign Data Wrapper)是一种扩展,可以使PostgreSQL数据库访问外部数据源,...
    99+
    2024-04-09
    PostgreSQL
  • 云主机怎么访问外部网络
    云主机可以通过以下几种方式访问外部网络:1. 公网访问:云主机通常会分配一个公网IP地址,可以直接使用该IP地址访问外部网络。这种方...
    99+
    2023-09-08
    云主机
  • http请求怎么在spring boot中使用
    今天就跟大家聊聊有关http请求怎么在spring boot中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先是经过封装:一:初始化httpclientprivate ...
    99+
    2023-05-30
    springboot http
  • 怎么在java中使用lambda访问外部变量
    今天就跟大家聊聊有关怎么在java中使用lambda访问外部变量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web M...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作