文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Boot 调用外部接口的多种实现方式

2024-11-29 18:25

关注

RestTemplate

RestTemplate 是 Spring 框架提供的一个同步 HTTP 客户端,用于进行 RESTful 服务调用。它是最传统和广泛使用的方法之一。

特点:

示例代码:

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
}

@Service
public class UserService {

    private final RestTemplate restTemplate;

    public UserService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public User getUser(Long id) {
        String url = "https://api.example.com/users/" + id;
        return restTemplate.getForObject(url, User.class);
    }
}

优点:

缺点:

WebClient

WebClient 是 Spring 5 引入的非阻塞、响应式的 HTTP 客户端。它是 RestTemplate 的现代替代品,特别适合高并发场景。

特点:

示例代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }
}

@Service
public class UserService {

    private final WebClient webClient;

    public UserService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("https://api.example.com").build();
    }

    public Mono getUser(Long id) {
        return webClient.get()
                .uri("/users/{id}", id)
                .retrieve()
                .bodyToMono(User.class);
    }
}

优点:

缺点:

OpenFeign

OpenFeign 是一个声明式的 Web 服务客户端,它使编写 Web 服务客户端变得更加简单。Spring Cloud 对 Feign 进行了增强,使其支持 Spring MVC 注解。

特点:

示例代码:

首先,添加依赖:


    org.springframework.cloud
    spring-cloud-starter-openfeign

然后,创建 Feign 客户端:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "user-service", url = "https://api.example.com")
public interface UserClient {

    @GetMapping("/users/{id}")
    User getUser(@PathVariable("id") Long id);
}

@Service
public class UserService {

    private final UserClient userClient;

    public UserService(UserClient userClient) {
        this.userClient = userClient;
    }

    public User getUser(Long id) {
        return userClient.getUser(id);
    }
}

最后,在应用主类上添加 @EnableFeignClients 注解:

import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

优点:

缺点:

HttpClient

Apache HttpClient 是一个功能丰富的 HTTP 客户端库。虽然不是 Spring Boot 原生支持的,但它提供了强大的功能和灵活性。

特点:

示例代码:

首先,添加依赖:


    org.apache.httpcomponents
    httpclient

然后,创建 HttpClient bean:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpClientConfig {

    @Bean
    public CloseableHttpClient httpClient() {
        return HttpClients.createDefault();
    }
}

@Service
public class UserService {

    private final CloseableHttpClient httpClient;
    private final ObjectMapper objectMapper;

    public UserService(CloseableHttpClient httpClient, ObjectMapper objectMapper) {
        this.httpClient = httpClient;
        this.objectMapper = objectMapper;
    }

    public User getUser(Long id) throws IOException {
        HttpGet request = new HttpGet("https://api.example.com/users/" + id);
        try (CloseableHttpResponse response = httpClient.execute(request)) {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                String result = EntityUtils.toString(entity);
                return objectMapper.readValue(result, User.class);
            }
        }
        return null;
    }
}

优点:

缺点:

OkHttp

OkHttp 是一个高效的 HTTP 客户端,由 Square 公司开发。它支持 HTTP/2 和连接池,可以有效地共享套接字。

特点:

示例代码:

首先,添加依赖:


    com.squareup.okhttp3
    okhttp

然后,创建 OkHttpClient bean:

import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OkHttpConfig {

    @Bean
    public OkHttpClient okHttpClient() {
        return new OkHttpClient();
    }
}

@Service
public class UserService {

    private final OkHttpClient okHttpClient;
    private final ObjectMapper objectMapper;

    public UserService(OkHttpClient okHttpClient, ObjectMapper objectMapper) {
        this.okHttpClient = okHttpClient;
        this.objectMapper = objectMapper;
    }

    public User getUser(Long id) throws IOException {
        Request request = new Request.Builder()
                .url("https://api.example.com/users/" + id)
                .build();

        try (Response response = okHttpClient.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                String responseBody = response.body().string();
                return objectMapper.readValue(responseBody, User.class);
            }
        }
        return null;
    }
}

优点:

缺点:

性能比较

在选择合适的 HTTP 客户端时,性能是一个重要的考虑因素。以下是一个简单的性能比较:

注意:实际性能可能会因具体的使用场景和配置而有所不同。建议在选择之前进行针对性的性能测试。

最佳实践

(1) 选择合适的客户端:

(2) 配置连接池:无论选择哪种客户端,都要合理配置连接池以提高性能。

(3) 处理异常:确保正确处理网络异常和服务端错误。

(4) 设置超时:合理设置连接超时和读取超时,避免因为外部服务问题影响整个应用。

(5) 使用断路器:集成像 Resilience4j 这样的断路器库,提高系统的弹性。

(6) 日志记录:适当记录请求和响应日志,便于问题排查。

(7) 安全性考虑:在处理敏感数据时,确保使用 HTTPS 并正确验证证书。

结语

Spring Boot 提供了多种调用外部接口的方式,每种方式都有其特点和适用场景:

选择合适的方式取决于你的具体需求、性能要求和团队的技术栈。无论选择哪种方式,都要注意性能优化、错误处理和安全性。

来源:源话编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯