首页 > 其他分享 >Spring Boot入坑-7-后端HTTP请求

Spring Boot入坑-7-后端HTTP请求

时间:2024-06-03 20:47:46浏览次数:13  
标签:调用 HTTP 请求 OpenFeign Spring Boot RestTemplate 添加

概述

  • 后端项目完成后,除了前后端分离模式的前端对后端请求的需要,如Vue通过Axios.js组件请求后端REST接口;不同后端系统中也需要进行相互的HTTP请求,实现各业务系统的业务交互;如订单服务,会调用支付服务、库存服务、积分服务等,如下图

    后端HTTP请求图
  • JDK的java.net包中已经提供了访问HTTP协议的基本功能,主要是HttpUrlConnection,但是对于大部分应用程序来说,JDK库本身提供的功能还是不够丰富和灵活,会使用一些简单、灵活的工具

  • 基于Spring Boot的HTTP请求工具主要有

    • Http Client:Apache下的HTTP请求子项目,相对复杂,可配置连接池等参数

    • OkHttp3:类似于Http Client,但性能更好,也可配置连接池等参数

    • RestTemplate:Spring下的Rest请求工具,方便使用,默认使用HttpUrlConnection,可集成OkHttp

    • OpenFeign: Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API

    • WebClient:非阻塞的基于响应式编程的进行Http请求的客户端工具,性能更好,Spring 5开始提供

RestTemplate

概述

  • RestTemplate是Spring 提供的用于访问其他REST服务的组件

  • RestTemplate 提供了多种便捷访问远程HTTP服务的方法,能够大大提高客户端的编写效率

  • 底层默认使用HttpUrlConnection发送HTTP请求,可切换成其他性能更好的工具,如OkHttp3

  • 可以添加拦截工具,对请求/响应进行相应处理,通过实现ClientHttpRequestInterceptor接口,并覆盖intercept方法,并添加到RestTemplate实现,比如,对每个请求添加token

  • 特点

    • 灵活,在程序中任意位置灵活使用

常用方法

  • getForXXX(),进行常用的GET请求操作

  • postForXXX(),进行常用的POST请求操作

  • exchange(),进行其他请求操作,因为针对其他HTTP请求操作,没有定义特别多的操作方式,使用通用的exchange()进行

使用步骤

  1. 定义请求拦截器,实现ClientHttpRequestInterceptor接口,并覆盖intercept方法,【可选】;见附件代码中的interceptor.RestTemplateClientHttpRequestInterceptor类

  2. 注入RestTemplate对象,注入RestTemplate对象到Spring容器,并可绑定请求拦截器;见附件代码中的config.RestTemplateConfig类

  3. 使用RestTemplate对象,其丰富的方法实现对其他REST服务进行调用;见附件代码中的remote.BugRemote类

【演示】

  1. Spring Boot中使用RestTemplate对其他REST服务进行调用,见附件项目springboot-resttemplate中的类

    • config\RestTemplateConfig类,注入RestTemplate对象

    • remote\BugRemote类,使用RestTemplate对象

    • interceptor\RestTemplateClientHttpRequestInterceptor类,请求拦截器

OpenFeign

概述

  • Netflix开发的声明式模板化的HTTP客户端,OpenFeign可以帮助我们更快捷、优雅地调用其他REST服务

  • 默认使用HttpUrlConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接

  • 可使用其他底层工具进行替换,比如Apache的Http Client或OkHttp3

  • 特点

    • 使用简单,但不够灵活,一般应用于固定接口调用,通过模拟成RestController形式进行调用

使用步骤

  1. 添加依赖:在pom.xml中引入依赖spring-cloud-starter-openfeign,注意版本匹配

    <!--【OpenFeign】1、添加依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>3.1.8</version>
    </dependency>
  2. 添加启动注解:在启动类上添加@EnableFeignClients注解

  3. 定义远程服务匹配接口:定义与被调用第三方服务匹配的接口并添加注解@FeignClient,指定name和url,代码片断如下

    /**
     * Bug远程调用类
     * 【OpenFeign】3、定义远程服务匹配接口,使用配置在application.properties中的远程服务主机地址URL
     */
    @FeignClient(name = "bug",url="${remoteprj.base_url}/bug")
    public interface BugRemote {
    }
  4. 定义远程服务匹配方法签名:在上一步定义的远程服务匹配接口中,定义与被调用第三方服务匹配的方法签名和映射,代码片断如下

    /**
    * 分页查询
    * 【OpenFeign】4、定义远程服务匹配方法签名
    */
    @GetMapping("/")
    ResponseData<List<BugOutputDto>> query(@RequestParam(defaultValue = "1")Long pageIndex,@RequestParam(defaultValue = "5") Long pageSize,@RequestParam Integer gradeId, @RequestParam String title);
  5. 添加调用日志:添加日志配置类,并在application.properties中添加放开debugger日志的配置,代码片断如下,【可选】

    • 日志类

      package com.example.config;
      ​
      import feign.Logger;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      ​
      @Configuration
      public class OpenFeignConfig {
      ​
          /**
           * 【OpenFeign】5、添加调用日志,与application.properties中的配置配合使用
           * @return
           */
          @Bean
          Logger.Level feignLoggerLeave(){
              return Logger.Level.FULL;
          }
      }
    • application.properties配置

      #【OpenFeign】5、添加调用日志
      feign.httpclient.enabled=true
      logging.level.com.example.remote.*=debug
  6. 添加请求拦截器,实现RequestInterceptor接口,覆盖apply方法,添加@Component注解自动注入到Spring容器,在方法中往请求中添加请求信息,代码片断如下,【可选】

    package com.example.interceptor;
    ​
    import feign.RequestInterceptor;
    import feign.RequestTemplate;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    ​
    /**
     * 【OpenFeign】6、添加请求拦截器,【可选】
     */
    @Component
    @Slf4j
    public class OpenFeignRequestInterceptor implements RequestInterceptor {
        //配置的Token
        @Value("${remoteprj.token}")
        String token;
    ​
        @Override
        public void apply(RequestTemplate template) {
            //添加请求日志
            log.info("【OpenFeign】请求拦截");
    ​
            //请求添加Token
            template.header("token",token);
        }
    }
  7. 使用远程服务:在需要使用的地方使用自动装配第3步定义的接口,并使用匹配签名方法,即可实现对远程服务的调用

【演示】

  1. Spring Boot中使用OpenFeign对其他REST服务进行调用,见附件项目springboot-openfeign中的类

    • 启动类,添加@EnableFeignClients注解

    • remote\BugRemote类,使用OpenFeign功能

    • interceptor\OpenFeignRequestInterceptor类,拦截器类

    • config\OpenFeignConfig类,配置application.properties,添加调用日志

代码

网盘地址:链接:https://pan.baidu.com/s/1wu7I1oiMC50MESKysOuGqQ?pwd=8888 

标签:调用,HTTP,请求,OpenFeign,Spring,Boot,RestTemplate,添加
From: https://www.cnblogs.com/sangrei/p/18229585

相关文章

  • 【源码】【SpringBoot】Web课程设计学生成绩管理系统的设计与开发
    学生成绩管理系统系统功能开发环境开发技术前端技术后端技术系统展示登录界面学生身份登录教师身份登录源码获取↓↓↓↓:源码可在后台私信联系博主或文末添加博主微信获取帮助系统功能系统用户身份分为三类,学生、教师和辅导员。身份不同登陆后所具有的系统权限......
  • Spring Boot入坑-6-缓存
    概述位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存(Cache)典型的如CPU与内存之间L1、L2、L3缓存,能让CPU更有聪明、更高效的执行任务在软件项目中,相比于访问网络、磁盘、DB等介质或设备,内存具有更高的效率,所以很多的时候会利用内存作为......
  • HTML动态响应2-Servlet+Ajax实现HTTP前后台交互方式
    作者:私语茶馆前言其他涉及到的参考章节:HTML动态响应1—Ajax动态处理服务端响应-CSDN博客Web应用JSON解析—FastJson1.2.83/Tomcat/IDEA解析案例-CSDN博客HTML拆分与共享方式——多HTML组合技术-CSDN博客1.场景:   WEb项目经常需要前后端交互数据,并动态修改HTML页面,......
  • Java (IOC/IO Spring项目)
    前沿Maven解决问题项目中的iar包资源需要我们自己从网上下载后,手动导入到项目中使用,不好管理。jar包版本控制麻烦Maven是一个强大的项目管理和构建工具,主要用于Java项目。它提供了一种统一的构建系统,并且能够管理项目的依赖关系、构建过程、版本控制等。Maven采用了一......
  • SpringBoot引入Feign
    首先我们先来了解一下Feign主要是做什么的:使用接口方式调用服务,它让微服务之间的调用变得更简单,类似controller调用service一、引入POM依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeig......
  • Spring Boot使用GraalVM编译为native excutable app的日志示例及主要步骤说明
    日志示例[INFO]---native-maven-plugin:0.9.28:compile(default-cli)@my-app---[INFO]FoundGraalVMinstallationfromGRAALVM_HOMEvariable.[INFO][graalvmreachabilitymetadatarepositoryforch.qos.logback:logback-classic:1.4.14]:Configurationdirector......
  • Spring Cloud LoadBalancer
    SpringCloudAlibabaSpringCloudLoadBalancer具体介绍转载:SpringCloudLoadBalancer负载均衡策略与缓存机制-CSDN博客1.依赖因为Ribbon作为早期的客户端负载均衡工具,在SpringCloud2020.0.0版本之后已经被移除了,取而代之的是SpringCloudLoadBalancer,而且Ribbon......
  • 【信息化人员必备知识&面试宝典】一次完整的HTTP请求是怎样的?
    【信息化人员必备知识&面试宝典】一次完整的HTTP请求是怎样的?HTTP请求基础什么是HTTP?请求与响应模型一次完整的HTTP请求流程步骤一:建立TCP连接步骤二:发送HTTP请求步骤三:服务器处理请求步骤四:发送HTTP响应步骤五:关闭连接或持续连接实战代码示例案例一:使用Python发起GET......
  • u-boot 手动从tftp加载镜像执行
    U-Boot确实支持手动从TFTP加载镜像并执行。以下是关于如何在U-Boot中手动从TFTP加载镜像执行的命令和步骤的详细解释:1.**搭建TFTP服务器**:-在你的主机上(通常是Linux系统),你需要首先搭建一个TFTP服务器。这通常涉及到安装TFTP服务软件(如`tftpd-hpa`)并配置其工......
  • C# 模拟http请求出现 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作[windo
    系统里面用到C#模拟Http请求,上线到服务器后,发现日志中大量出现“由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作”或“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”运行netstat-ano发现有大量的Tcp链接,怀疑可能是服务器各种请求太多了导致的服务器是w......