【微服务~远程调用】RestTemplate基本操作快速入门

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 【微服务~远程调用】RestTemplate基本操作快速入门

RestTemplate

概述

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。


搭建环境

拷贝BaseResult

编写测试类:TestRest

package com.czxy;
public class TestRest {
}

基本操作

GET请求

  • 注意:使用RestTemplate封装数据时,BaseResult必须提供==无参构造==。
@Test
    public void testFindAll(){
        String url = "http://localhost:7778/user";
        //1 创建对象
        RestTemplate restTemplate = new RestTemplate();
        //2 发送请求并获得数据
        ResponseEntity<BaseResult> entity = restTemplate.getForEntity(url, BaseResult.class);
        //3.1 状态
        System.out.println(entity.getStatusCode());
        //3.2 响应数据
        System.out.println(entity.getBody().getData());
    }

GET请求:转换泛型异常

  • 查询用户时,如果返回类型为BaseResult,默认不支持泛型信息。及不支持 BaseResult<List<User>>
  • 需要使用 exchange 设置具体的泛型信息
 @Test
    public void testFindAll2(){
        String url = "http://localhost:7778/user";
        //1 创建对象
        RestTemplate restTemplate = new RestTemplate();
        //2 发送请求并获得数据
        ResponseEntity<BaseResult<List<User>>> entity = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<BaseResult<List<User>>>() {});
        //3 获得响应,并打印
        BaseResult<List<User>> baseResult = entity.getBody();
        List<User> data = baseResult.getData();
        for (User user : data) {
            System.out.println(user);
        }
    }

POST请求

@Test
    public void testAdd(){
        String url = "http://localhost:7778/user";
        RestTemplate restTemplate = new RestTemplate();
        User user = new User(1,"jack","1234",18);
        ResponseEntity<BaseResult> entity = restTemplate.postForEntity(url ,user , BaseResult.class);
        System.out.println(entity.getStatusCode());
        System.out.println(entity.getBody());
    }

PUT请求

 @Test
    public void testUpdate(){
        String url = "http://localhost:7778/user";
        RestTemplate restTemplate = new RestTemplate();
        User user = new User(1,"jack","1234",18);
        restTemplate.put(url ,user);
        System.out.println("修改成功");
    }

Delete请求

 @Test
    public void testDelete(){
        String url = "http://localhost:7778/user/1";
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.delete(url);
        System.out.println("删除成功");
    }

HttpClient高级

HttpClient 关闭日志输出

  • 基于spring boot 测试启动器,自动开启日志输出
  • spring boot 默认采用logback 进行日志管理的
  • 如何管理日志输出:关闭日志输出
  • 在resources/logback.xml

image.png

<configuration debug="false">​</configuration>

HttpClient连接池

分析

  1. 使用HttpClients.custom()可以构建自定义 CloseableHttpClient 对象
  2. setConnectionManager 用于配置连接
  3. setDefaultRequestConfig 用于配置请求
  4. 通过PoolingHttpClientConnectionManager 可以为连接配置连接数和并发数
  5. 通过 RequestConfig.custom() 可以配置各种超时时间

代码

    @Test
    public void testDemo01() throws IOException {
        //1 配置连接管理
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 1.1 设置最大连接数
        connectionManager.setMaxTotal(1000);
        // 1.2 设置并发访问数
        connectionManager.setDefaultMaxPerRoute(20);
        //2 请求配置
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(1000)
                .setConnectionRequestTimeout(500)
                .setSocketTimeout(10 * 1000)
                .build();
        // 3 获得工具类
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                //重定向策略
                .setRedirectStrategy(new LaxRedirectStrategy())
                .build();
        // 4 发送请求
        CloseableHttpResponse response = null;
        try {
            HttpGet httpGet = new HttpGet("http://localhost:7778/user");
            response = httpClient.execute(httpGet);
            if(response.getStatusLine().getStatusCode() == 200){
                String str = EntityUtils.toString(response.getEntity(),"UTF-8");
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            response.close();
        }
    }

SpringBoot整合HttpClient

概述

  • SpringBoot官方并没有对HttpClient的启动器。所以我们需要自己完成配置

配置

  • 步骤一:修改yml文件,添加连接池配置
# http配置
http:
  maxTotal: 300
  defaultMaxPerRoute: 50
  connectTimeout: 1000
  connectionRequestTimeout: 500
  socketTimeout: 5000
  • 步骤二: 编写配置类
package com.czxy.config;
import lombok.Setter;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "http")
@Setter
public class HttpConfig {
    private Integer maxTotal;
    private Integer defaultMaxPerRoute;
    private Integer connectTimeout;
    private Integer connectionRequestTimeout;
    private Integer socketTimeout;
    private Integer staleConnectionCheckEnabled;
    @Bean
    public PoolingHttpClientConnectionManager connectionManager(){
        //1 配置连接管理
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 1.1 设置最大连接数
        connectionManager.setMaxTotal(maxTotal);
        // 1.2 设置并发访问数
        connectionMan1ager.setDefaultMaxPerRoute(defaultMaxPerRoute);
        return connectionManager;
    }
    @Bean
    public RequestConfig requestConfig(){
        //2 请求配置
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(connectTimeout)
                .setConnectionRequestTimeout(connectionRequestTimeout)
                .setSocketTimeout(socketTimeout)
                .build();
        return requestConfig;
    }
    @Bean
    public HttpClient httpClient(HttpClientConnectionManager connectionManager, RequestConfig requestConfig){
        // 3 获得工具类
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                //重定向策略
                .setRedirectStrategy(new LaxRedirectStrategy())
                .build();
        return httpClient;
    }
}

测试:get请求

package com.czxy;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.io.IOException;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HttpApplication.class)
public class TestBootHttp {
    @Resource
    private HttpClient httpClient;
    @Test
    public void testDemo01() throws IOException {
        String url = "http://localhost:7778/user";
        HttpGet httpGet = new HttpGet(url);
        HttpResponse response = httpClient.execute(httpGet);
        if(response.getStatusLine().getStatusCode() == 200){
            String str = EntityUtils.toString(response.getEntity());
            System.out.println(str);
        }
    }
}

RestTemplate整合HttpClient

RestTemplate整合HttpClient -- 配置类

package com.czxy.config;
import lombok.Setter;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.Charset;
import java.util.List;
/**
 * @author 桐叔
 * @email liangtong@itcast.cn
 */
@Configuration
@ConfigurationProperties(prefix = "http")
@Setter
public class HttpConfig {
    private Integer maxTotal;
    private Integer defaultMaxPerRoute;
    private Integer connectTimeout;
    private Integer connectionRequestTimeout;
    private Integer socketTimeout;
    private Integer staleConnectionCheckEnabled;
    @Bean
    public PoolingHttpClientConnectionManager connectionManager(){
        //1 配置连接管理
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 1.1 设置最大连接数
        connectionManager.setMaxTotal(maxTotal);
        // 1.2 设置并发访问数
        connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
        return connectionManager;
    }
    @Bean
    public RequestConfig requestConfig(){
        //2 请求配置
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(connectTimeout)
                .setConnectionRequestTimeout(connectionRequestTimeout)
                .setSocketTimeout(socketTimeout)
                .build();
        return requestConfig;
    }
    @Bean
    public HttpClient httpClient(HttpClientConnectionManager connectionManager, RequestConfig requestConfig){
        // 3 获得工具类
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                //重定向策略
                .setRedirectStrategy(new LaxRedirectStrategy())
                .build();
        return httpClient;
    }
    @Bean
    public ClientHttpRequestFactory requestFactory(HttpClient httpClient ){
        return new HttpComponentsClientHttpRequestFactory(httpClient);
    }
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory){
        RestTemplate template = new RestTemplate(requestFactory);
        //乱码处理
        List<HttpMessageConverter<?>> list = template.getMessageConverters();
        for (HttpMessageConverter<?> mc : list) {
            if (mc instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) mc).setDefaultCharset(Charset.forName("UTF-8"));
            }
        }
        return template;
    }
}

测试类

package com.czxy;
import com.czxy.domain.User;
import com.czxy.vo.BaseResult;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HttpApplication.class)
public class TestBootRest {
    @Resource
    private RestTemplate restTemplate;
    @Test
    public void testAdd(){
        String url = "http://localhost:7778/user";
        User user = new User(1,"jack","1234",18);
        ResponseEntity<BaseResult> entity = restTemplate.postForEntity(url ,user , BaseResult.class);
        System.out.println(entity.getStatusCode());
        System.out.println(entity.getBody());
    }
}

案例:管理员登录

分析

image.png

数据库

CREATE TABLE t_user(
  uid INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50),
  `password` VARCHAR(32),
  age INT
);
INSERT INTO t_user(uid,username,`password`,age) VALUES(1,'jack','1234',18);


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
机器学习/深度学习 负载均衡 Java
【SpringBoot系列】微服务远程调用Open Feign深度学习
【4月更文挑战第9天】微服务远程调度open Feign 框架学习
329 2
|
1月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
89 1
|
3月前
|
负载均衡 Java API
深度解析SpringCloud微服务跨域联动:RestTemplate如何驾驭HTTP请求,打造无缝远程通信桥梁
【8月更文挑战第3天】踏入Spring Cloud的微服务世界,服务间的通信至关重要。RestTemplate作为Spring框架的同步客户端工具,以其简便性成为HTTP通信的首选。本文将介绍如何在Spring Cloud环境中运用RestTemplate实现跨服务调用,从配置到实战代码,再到注意事项如错误处理、服务发现与负载均衡策略,帮助你构建高效稳定的微服务系统。
93 2
|
3月前
|
前端开发 Java API
SpringCloud跨微服务的远程调用,如何发起网络请求,RestTemplate
SpringCloud跨微服务的远程调用,如何发起网络请求,RestTemplate
91 2
|
4月前
|
负载均衡 微服务
微服务06----Eureka注册中心,微服务的两大服务,订单服务和用户服务,订单服务需要远程调用我们的用,户服务,消费者,如果环境改变,硬编码问题就会随之产生,为了应对高并发,我们可能会部署成一个集
微服务06----Eureka注册中心,微服务的两大服务,订单服务和用户服务,订单服务需要远程调用我们的用,户服务,消费者,如果环境改变,硬编码问题就会随之产生,为了应对高并发,我们可能会部署成一个集
|
4月前
|
Java 微服务 Spring
微服务04---服务远程调用,根据订单id查询订单功能,根据id查询订单的同时,把订单所属的用户信息一起返回,Spring提供了一个工具RestTemplate,Bean写在对象前面,以后可以在任何地
微服务04---服务远程调用,根据订单id查询订单功能,根据id查询订单的同时,把订单所属的用户信息一起返回,Spring提供了一个工具RestTemplate,Bean写在对象前面,以后可以在任何地
|
监控 Serverless 开发者
微服务和 Serverless 架构-FC 基本操作讲解
微服务和 Serverless 架构-FC 基本操作讲解
微服务和 Serverless 架构-FC 基本操作讲解
|
弹性计算 Kubernetes 应用服务中间件
微服务和 Serverless 架构-EDAS 基本操作讲解与 EDAS 优势总结
微服务和 Serverless 架构-EDAS 基本操作讲解与 EDAS 优势总结
微服务和 Serverless 架构-EDAS 基本操作讲解与 EDAS 优势总结
|
负载均衡 Java 开发者
微服务组件 Open Feign 远程调用
OpenFeign是一个声明式的Web服务客户端,它是Spring Cloud生态系统中的一个组件,用于简化和优化微服务之间的远程调用。通过使用注解和接口定义的方式,开发者可以轻松地实现对其他微服务的访问。 使用OpenFeign,您只需定义一个接口,并通过注解来配置该接口对应的远程服务的URL、请求方法、请求参数等信息,OpenFeign将自动生成可用于调用远程服务的实现。这样,您就可以像调用本地方法一样调用远程服务,而无需编写繁琐的HTTP请求和解析代码。
237 0
|
负载均衡 算法 Java
springcloud中的RestTemplate实现微服务之间的调用
springcloud中的RestTemplate实现微服务之间的调用
下一篇
无影云桌面