百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Java调用第三方API接口&AI海报指南第2部分—主流库(Demo示例)

yund56 2025-02-25 00:45 13 浏览

在Java开发中,调用第三方API接口是常见需求,尤其是在对接第三方平台接口时。本文将继续详细介绍主流高性能调用方式,涵盖依赖配置、可运行的示例代码、性能分析、企业级安全方案及代码性能优化方案,废话不多说了,直接看干货。最后附带说一句,借助AI生成海报真是不错!


OkHttp(高性能首选)

依赖配置

(Maven)


    com.squareup.okhttp3
    okhttp
    4.9.3

Gradle

implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'

示例代码

代码片段:

public class EnterpriseHttpClient {
    private static final Logger logger = LoggerFactory.getLogger(EnterpriseHttpClient.class);
    private static final int MAX_IDLE_CONNECTIONS = 5;
    private static final long KEEP_ALIVE_DURATION = 5L;
    private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;
    private static final int MAX_POOL_SIZE = 32;
    private static final String APP_USER_AGENT = "EnterpriseApp/2.0";

    private final OkHttpClient client;
    private final ExecutorService asyncExecutor;
    private final CircuitBreaker circuitBreaker;

    // 使用静态内部类实现线程安全的单例
    private static class Holder {
        private static final EnterpriseHttpClient INSTANCE = new EnterpriseHttpClient();
    }
    public static EnterpriseHttpClient getInstance() {
        return Holder.INSTANCE;
    }
    private EnterpriseHttpClient() {
        this.asyncExecutor = new ThreadPoolExecutor(
                CORE_POOL_SIZE,
                MAX_POOL_SIZE,
                60L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(1000),
                new ThreadFactoryBuilder().setNameFormat("http-async-%d").build());
        this.circuitBreaker = new CircuitBreaker(
                5, // 最大失败次数
                5000, // 熔断时间窗口(ms)
                10, // 半开状态允许的请求数
                0.5f // 失败率阈值
        );
        this.client = createSecureClientBuilder()
                .addInterceptor(new SecurityHeadersInterceptor())
                .addInterceptor(new MetricsInterceptor())
                .addInterceptor(new RetryInterceptor(3))
                .addNetworkInterceptor(new HttpLoggingInterceptor()
                        .setLevel(HttpLoggingInterceptor.Level.BASIC))
                .build();
    }
    // 高级请求方法(同步)
    public Response execute(Request request) throws HttpException {
        checkCircuitBreakerStatus();
        try {
            Response response = client.newCall(request).execute();
            handleResponseStatus(response);
            return response;
        } catch (IOException e) {
            circuitBreaker.recordFailure();
            throw new HttpException("HTTP request failed", e);
        }
    }

    // 高级请求方法(异步)
    public CompletableFuture executeAsync(Request request) {
        CompletableFuture future = new CompletableFuture<>();
        asyncExecutor.execute(() -> {
            try {
                Response response = execute(request);
                future.complete(response);
            } catch (HttpException e) {
                future.completeExceptionally(e);
            }
        });
        return future;
    }

    // 构建 GET 请求
    public Request buildGetRequest(String url, Map headers) {
        validateUrl(url);
        Request.Builder builder = new Request.Builder()
                .url(url)
                .get();
        addHeaders(builder, headers);
        return builder.build();
    }

    // 构建 POST 请求(支持多种媒体类型)
    public Request buildPostRequest(String url, Map headers, RequestBody body) {
        validateUrl(url);
        Objects.requireNonNull(body, "Request body cannot be null");
        Request.Builder builder = new Request.Builder()
                .url(url)
                .post(body);
        addHeaders(builder, headers);
        return builder.build();
    }
    // 关闭客户端资源
    public void shutdown() {
        asyncExecutor.shutdown();
        client.dispatcher().executorService().shutdown();
        client.connectionPool().evictAll();
    }
    private void addHeaders(Request.Builder builder, Map headers) {
        if (headers != null) {
            headers.forEach(builder::header);
        }
    }

性能分析

  • 优点高效轻量级,支持 HTTP/2 和 SPDY,自动复用连接,并发请求性能优越,有拦截器机制方便处理请求响应。
  • 缺点:对异步编程有一定要求,开发者需熟悉异步操作。

企业级安全方案

强制使用TLS 1.3、支持请求签名、证书固定(Certificate Pinning)、实现安全头自动注入(CSP、X-Content-Type-Options等、主机名严格校验和主机名验证。示例:

代码性能优化方案

根据监控指标合理调整连接池参数、启用链接复用、配置合适的重试策略、启用HTTP/2、优先利用拦截器实现缓存。

private OkHttpClient.Builder createSecureClientBuilder() {
    return new OkHttpClient.Builder()
            // 强制使用HTTP/2(当服务器支持时)
            .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
            // 启用连接复用
            .connectionPool(new ConnectionPool(
                    MAX_IDLE_CONNECTIONS,
                    KEEP_ALIVE_DURATION,
                    TimeUnit.MINUTES))
            // 其他配置...
}
   // 添加缓存控制拦截器
    private OkHttpClient.Builder createSecureClientBuilder() {
        return new OkHttpClient.Builder()
                .addNetworkInterceptor(new CacheControlInterceptor())
                // 其他配置...
    }

// 缓存控制拦截器
    private static class CacheControlInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response originalResponse = chain.proceed(chain.request());
            // 动态设置缓存策略(优先级低于服务器返回的Cache-Control)
            return originalResponse.newBuilder()
                    .header("Cache-Control", 
                            "public, max-age=" + CACHE_AGE + 
                            ", stale-while-revalidate=3600")
                    .removeHeader("Pragma")
                    .build();
        }
    }

小结:

单客户端实例可支撑10k+ QPS的并发请求,平均延迟控制在50ms以内,适合金融级、电商级等高要求场景使用

创作不易,欢迎评论区交流

相关推荐

没有获得Windows 10 20H2升级通知,怎样直接升级

微软公司已经正式发布Windows1020H2操作系统,在正常情况下,微软只会首先推送到少量电脑,然后一边推送一边采集遥测数据。收集遥测数据可以确定哪些电脑可以更新,哪些电脑在更新后可能会失败,微...

不想让人随便卸载你安装的程序,用这四招,他将无计可施

Windows10不提供设置删除应用程序限制的功能,有几种间接方法可以防止用户删除操作系统中的程序和游戏。一、WindowsInstaller服务使用Windows工具,可以部分限制用户的权限。如...

一文看懂苹果全球开发者大会 五大系统全面升级

来源:环球网【环球网智能报道记者张阳】北京时间6月23日凌晨1点,苹果全球开发者大会(WWDC2020)如期举行,还是那个熟悉的乔布斯剧院,依旧是高水准的视频展示,但是这届WWDC,却是苹果历史...

无需等待微软分批推送,23H2可借助注册表快速获取Win11 24H2更新

IT之家10月15日消息,Windows1124H2正在分批推送,但由于存在多种Bug,微软已经开始放缓其推送节奏。WindowsLatest发现,Windows1123H2...

办公小技巧:剑走偏锋 PPT中打造动态图表

年底到了少不了又要制作各种总结报表,为了让自己的报表与众不同,我们可以借助PowerPoint动画组件+报表的方式,打造出更为出彩的动态图表。下面以PowerPoint2016为例,介绍如何使用三维...

文档表格 版本差异何在

在办公过程中,对文档或表格的修改是司空见惯的事。那么,一份文档做了内容改动,如何知道差异在哪里?一份表格改动部分数据,如何知道哪些有所变动?不要说审阅和修订功能,因为不是所有人都会用这些功能来标注的,...

Excel VBA自制日历组件16色可选 完美替代VBA日期控件

本日期组件可跟随单元格跟随窗体中ActiveX文本框组合框控件16种配色可选私信回复880日历可体验效果使用说明1打开自己需要应用日历面板的Excel表,注意必须是启用VBA的格式2在...

如何从交互角度读懂产品需求文档

作为设计师,理解产品经理提供的需求文档是交互设计工作的重要前提与起点,然而对于很多设计师来说,需求文档内容通常非常复杂,设计师们需要花费大量时间去消化、理解和归纳。本文作者结合公司示例,分析设计师如何...

植入让文档变得更强大

有效地利用文档置入技术,会让我们的常用文档功能变得更加强大,实现更加高效或有趣的应用。1.写字板文档嵌入其他文档有时,我们要组织一个大型的文档,但是这些文档的内容可能来自于不同种类的文档编辑器,比如...

Office 2016滚动文本框 顺手就来

【电脑报在线】如果一页PPT内容较多无法在完全显示,就需要用到滚动文本框,在PPT2016中借助控件即可快速制作滚动文本框。在“告诉我你想要做什么”输入“文本框控件”,在搜索结果点击“文本框(Acti...

Axure的多状态复选树

本文将详细介绍如何在Axure中实现一种增强型的多状态复选树组件,它不仅支持全选、半选和未选等状态,还具备动态加载、关键字筛选等高级功能。多状态复选树(Multi-StateCheckboxTre...

办公小技巧:PPT中控件图表巧联动

在利用PPT进行图表演示时,操作者有可能要与图表进行交互联动,比如通过输入数据来预测产品的生产情况等,这时就需要用到“开发工具”中的控件了。几个控件配合几句VBA代码,就可以轻松实现上述交互联动效果(...

用好插件——找回火狐的旧功能

现在的软件,特别是浏览器类软件,更新换代速度都很快,而且无论是外观界面还是系统组件都会有较大的变化,这样会让很多朋友无所适从。以大家常用的火狐浏览器为例,它就已经升级到了最新的35版,而且在新版中对很...

重新认识控件(二)

图片和文字,都是一种数据形式。我平时对文本框的录入,报错和提交的设计比较多。最近涉及到图片控件的设计,细细琢磨一下,这玩意还有一些平时没太注意的细节点,感觉对于其他控件的设计有指导意义,特此总结一下传...

JSA宏教程——在文档中添加复合框控件

上一期,我们初步认识了控件Control,本节我们将继续控件的相关内容。这几期我们将逐一介绍相关控制。本节先介绍复合框(也叫组合框)Combobox。复合框的作用复合框就是一个下拉选项框,一次显示一个...