当前位置: 首页 > news >正文

asp.net通过webservice调用java接口全过程_springboot整合Feign实现远程接口调用

平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我。跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!每一篇文章都是心得总结,跟我学习你就是大牛!

springboot整合Feign实现远程接口调用

      在javaweb项目中常常会请求第三方接口(或其他微服务接口)的情况。实现远程接口调用的方法有很多,例如HttpURLConnection、spring-web包里面提供的restTemplate和spring-cloud-Feign工具包。
      这里我将以Feign为例进行实战讲解。主要包括如下几个知识点:     1)springboot项目整合Feign,并通过feign client实现远程接口调用;
     2)配置拦截器实现feign client调用远程接口时携带请求头信息;
     3)配置feign日志配置,实现日志输出请求头、请求体、响应头和响应体等信息。

1 什么是feign?

      与 Ribbon ⼀样,Feign 也是由 Netflflix 提供的,Feign 是⼀个声明式、模版化的 Web Service 客户端,它简化了开发者编写 Web 服务客户端的操作,开发者可以通过简单的接⼝和注解来调⽤ HTTP API, Spring Cloud Feign,它整合了 Ribbon 和 Hystrix,具有可插拔、基于注解、负载均衡、服务熔断等⼀系列便捷功能。

2 feign的特点

      1)Feign 是⼀个声明式的 Web Service 客户端。

      2)⽀持 Feign 注解、Spring MVC 注解、JAX-RS 注解。

      3)Feign 基于 Ribbon 实现,使⽤起来更加简单。

      4)Feign 集成了 Hystrix,具备服务熔断降级的功能。

3 springboot项目整合feign

      说明:创建springboot项目就不再演示了,到这里就假定我们已经创建好了一个名为:feign-demo 的springboot项目了。

      springboot项目结构如下:

978ebc3ad3847e4448f002174b2dadd8.png

3.1 引入jar依赖

      在项目pom.xml文件中添加openfeign依赖。

        <dependency>            <groupId>org.springframework.cloudgroupId>            <artifactId>spring-cloud-starter-openfeignartifactId>            <version>2.1.3.RELEASEversion>        dependency>
!--添加openfein的依赖--dependencygroupId/groupIdartifactId/artifactIdversion<2.1.3.RELEASE>/version/dependency

3.2 使能FeignClients

在项目启动类上添加注解@EnableFeignClients允许开启Feign调用,并指定basePackages来扫描扫描@FeignClient注解标注的FeignClient接口。

@EnableFeignClients(basePackages = "com.hc.feigndemo")public class FeignDemoApplication {     ......}

3.3 定义FeignClient接口

    定义用户client接口类:UserClient.java
package com.hc.feigndemo.client;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.PostMapping;/** * 定义用户client接口 */@FeignClient(    name = "USER-CLIENT",    url = "http://localhost:8080/main/")public interface UserClient {  /**   * 查询用户   */  @PostMapping(path = "/userInfo")  String userInfo();}

      到此,springboot项目就整合了feign。下面我们测试一下是否能通过feign client来调用接口。

3.4 访问FeignClient

     首先我们需要注入bean对象UserClient:

    @Autowired    private UserClient userClient;

      通过userClient来调用其定义的userInfo接口。

/**     * 查询用户信息     * @return     */    @GetMapping("queryUserInfo")    @ResponseBody    public String queryUserInfo(){        return userClient.userInfo();    }    /**     * 模拟client远程调用的接口     * @return     */    @PostMapping("userInfo")    @ResponseBody    public String userInfo(){        return "my name is xxx";    }

3.5 feignClient测试结果

66db005ffa405ca7f71a84a32afd6bfd.png

      从截图看,实现了通过feign client来调用远程(第三方)接口了。但是请求头中没有携带接口权限验证信息(如:clientId和clientSecret等)。因此我们需要配置一个拦截器,并给所有feign client请求头中添加权限验证信息。

4 feign client请求添加请求头

4.1 配置请求拦截器

   创建实现了RequestInterceptor 接口的拦截器类:OpenApiRequestInterceptor .java,并添加请求头信息client-id和client-secret。

/** * 配置请求拦截器 */@Componentpublic class OpenApiRequestInterceptor implements RequestInterceptor {  private String clientId = "clientId";  private String clientSecret = "xxxxxx";  /**   * 给所有请求添加头信息client-id和client-secret   * @param template   */  @Override  public void apply(RequestTemplate template) {    template        .header("client-id", clientId)        .header("client-secret", clientSecret);  }}

       到此,我们给feign client的所有请求头添加了client-id和client-secret请求头信息。但是我们看不到请求头信息有哪些。有什么办法呢?答案是:日志!

4 Feign日志

      feign日志输出是非常有必要的,它能辅助我们在生产过程中分析并定位问题。前几天本人也遇到过一个生产问题:测试环境都是正常的,但是微信小程序后端服务上线后却发现有个feign client接口报401(权限验证未通过)。经过排查并添加feign日志,最终定位到请求接口url多了一个路径符号"/"。可见feign日志是多么重要,这里给大家分享一下feign日志输出的基本配置步骤。

4.1 创建日志配置类

      创建一个日志配置类:FeignLogConfiguration.java,并指定日志级别。

      Feign对日志的处理非常灵活,可为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger。默认情况下,logger的名称是Feigh接口的完整类名。需要注意的是:Feign的日志打印只会对DEBUG级别做出响应。我们可以为每个Feign客户端配置各种的Logger.Level对象,告诉Feign记录哪些日志。

      Logger.Level的值有:

      1)NONE:无记录(DEFAULT)。

      2)BASIC:只记录请求方法和URL以及响应状态代码和执行时间。

      3)HEADERS:记录基本信息以及请求和响应标头。

      4)FULL:记录请求和响应的头文件,正文和元数据。

package com.hc.feigndemo.config;import feign.Logger;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * 定义FeignLogConfiguration日志级别配置类 */@Configurationpublic class FeignLogConfiguration {  @Bean  Logger.Level feignLoggerLevel() {    return Logger.Level.FULL;  }}

4.2 指定日志级别配置类

143fbb274a93365450da75016fb05f1f.png

4.3 设置feign接口日志级别

      将Feign接口的日志级别设置成DEBUG,因为Feign的Logger.Level只对DEBUG作出响应。

7428812c866a9facc973e0404d102ae3.png

4.4 重启项目测试feign日志是否生效

      请求接口。

0e15d4c662626dd88a529fd33b3a9582.png

       查看控制台日志,可看到feign client请求的请求头、请求体、响应头和响应体等信息都被打印出来了。妈妈再也不用担心我出bug了,通过日志信息轻松定位问题~

ad98b28d399ad41da7eb731150eba6fd.png

       关注微信公众号并回复"我要feign整合源码",免费获取本教程feign-demo项目源码、java及其相关视频教程~

e70a0b85ff13a2da4c5d0973213e7512.png

相关文章:

  • 检测到目标url存在框架注入漏洞_CVE201914234:Django JSONField SQL注入漏洞复现
  • 随机森林的特征 是放回抽样么_机器学习军火库 | 浪漫算法 随机森林
  • java空字符_Java学习之路008天
  • py怎么运行_Mac Tensorflow Faster R-CNN CPU实现环境配置及Demo运行
  • 一个数等于两个不同素数的乘机_【朝夕的ACM笔记】数论-反素数
  • spring是什么_Spring 源码第三弹!EntityResolver 是个什么鬼?
  • python界面开发webview_Python使用Pyqt5实现简易浏览器!非常实用!
  • 程序实例python_Python花式编程案例集锦(5)
  • python装饰器作用和功能_Python装饰器实现类Java注解功能
  • 树莓派无屏幕安装kali_树莓派制作魔镜屏幕旋转不正确的处理方法
  • 没有与参数列表匹配的重载函数_C++覆盖和重载的区别
  • python嵌入式系统开发_python能开发单片机吗
  • python根据excel生成报表_python提取Excel中的特定列生成新的表格
  • python显示数据长度_python 读取数据再写入,文件大小总会出现变差?
  • datagrid如何获取一行数据中的某个字段值_UI测试中,我们应该注意哪些?
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Angularjs之国际化
  • Debian下无root权限使用Python访问Oracle
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • spark本地环境的搭建到运行第一个spark程序
  • vagrant 添加本地 box 安装 laravel homestead
  • WebSocket使用
  • 阿里云前端周刊 - 第 26 期
  • 给第三方使用接口的 URL 签名实现
  • 前端之Sass/Scss实战笔记
  • 区块链共识机制优缺点对比都是什么
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用putty远程连接linux
  • 用mpvue开发微信小程序
  • 优秀架构师必须掌握的架构思维
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #define
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (11)MATLAB PCA+SVM 人脸识别
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (六)vue-router+UI组件库
  • (三) diretfbrc详解
  • (原)Matlab的svmtrain和svmclassify
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net6使用Sejil可视化日志
  • .Net8 Blazor 尝鲜
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net和php怎么连接,php和apache之间如何连接
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Autowired和@Resource的区别
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [<事务专题>]
  • [AIGC] 如何建立和优化你的工作流?
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [CTSC2014]企鹅QQ