我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用GoHTTP客户端打造高性能服务

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用GoHTTP客户端打造高性能服务

HTTP(超文本传输协议)是一种用于客户端和服务器之间传输数据的通信协议。如果想要访问服务器资源,HTTP 请求是必不可少的。Go 语言里,net/http 包附带了默认配置,我们可以适当调整便可以获得高性能。

大多数语言都有提供各自的 HTTP 客户端,文章接下来部分我们将动手实践如何使用 Go 语言发起 HTTP 请求,并讨论其中有可能遇到的问题。

在做 Go 项目时,我就意识到 HTTP 客户端如果配置不正确可能会随时导致服务器崩溃。

在使用 HTTP Client 时,我观察到一些问题并总结出相应的解决方案,如下所示:

问题一:默认的 HTTP Client

默认情况下,net/http 包自带的 HTTP 客户端不带超时时间。如果你使用的是默认的客户端 http.DefaultClient(),这个是不带超时时间的。

假如你请求外部的 API 挂了,发出的请求没响应导致连接一直出于打开状态。随着请求数越来越多,连接数随之增加,导致耗尽服务器的资源,最后服务器随之崩溃。

解决办法:不要使用默认的 HTTP 客户端,根据实际情况设置超时时间。


var httpClient = &http.Client{
  Timeout: time.Second * 10,
}

对于 API 接口,超时时间建议不需要超过 10s,如果请求在 10s 内没有返回,则请求会取消并报错:request canceled (Client.Timeout exceeded …) 。

问题二:默认的 Http Transport

默认情况下,HTTP 客户端会维护一个连接池。当请求完成之后,连接会保持打开状态直到空闲时间超时(默认是 90s)自动断开。如果有请求过来,会优先使用已打开的连接而不是创建新的连接,请求完成之后,连接会返还到连接池中。

使用连接池将使用最少的服务器资源处理更多的 API 请求。

如果没有自定义 HTTP 客户端的 transport,将会使用默认配置。

HTTP Transport 的默认配置如下:


var DefaultTransport RoundTripper = &Transport{
    ...
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    ...
}

 
const DefaultMaxIdleConnsPerHost = 2

MaxIdleConns 表示连接池大小,是可以打开的最大连接数,默认值是 100。

参数 DefaultMaxIdleConnsPerHost 的默认值是 2,表示每个主机(host)的打开连接数。这意味着,连接池中 100 个连接只有两个连接分配给该主机。

随着请求增多,但是只有两个请求被处理,其他请求只能被迫等待并进入 TIME_WAIT 状态。请求增多,进入 TIME_WAIT 状态的连接数增多,消耗越来越多的服务器资源,当达到服务器瓶颈时,服务器将会崩溃。

解决办法:提高 MaxIdleConnsPerHost 数值,不要使用默认的 Transport。


t := http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConns = 100
t.MaxConnsPerHost = 100
t.MaxIdleConnsPerHost = 100

httpClient = &http.Client{
  Timeout:   10 * time.Second,
  Transport: t,
}

通过增加每个主机的连接数和空闲连接数,就有助于提高性能并以最少的服务器资源处理更多请求。

可以根据服务器资源和实际需求适当增加连接池大小和每个主机的连接数。

总结

这篇文章中,我们围绕 net/http 包讨论了默认配置的一些问题。通过更改 HTTP 客户端的一些默认设置,在生产环境中也可以获得高性能的 HTTP 客户端。

到此这篇关于使用Go HTTP客户端打造高性能服务的文章就介绍到这了,更多相关Go HTTP客户端高性能内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

使用GoHTTP客户端打造高性能服务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js 入门:打造高性能服务器端应用程序

Node.js 是一种开源的服务器端 JavaScript 环境,可用于构建高性能和可扩展的应用程序。本文将深入浅出地介绍 Node.js 的基础知识,手把手教你打造高性能的服务器端应用程序。
Node.js 入门:打造高性能服务器端应用程序
2024-03-09

PHP高级特性:HTTP客户端与服务器实战

php提供http客户端库(curl、guzzlehttp)进行http请求发送,还支持创建http服务器(如swoole)。实战案例包括使用curl从api获取数据以及利用swoole创建自定义http服务器处理表单数据。PHP高级特性:
PHP高级特性:HTTP客户端与服务器实战
2024-05-16

Android打造属于自己的新闻平台(客户端+服务器)

完全属于自己的新闻展示平台,展示给大家,希望大家喜欢。 一、新闻的数据库的构建 脚本代码如下:(使用的mysql5.0 数据库)SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone =
2022-06-06

玩转服务器性能优化,打造极致用户体验

服务器性能优化是提升网站速度和用户体验的关键。优化服务器性能可以通过调整各种配置,包括硬件、软件、数据库和代码,提高服务器响应速度和处理能力。
玩转服务器性能优化,打造极致用户体验
2024-03-01

云服务器如何使用ssr客户端

使用SSR客户端可以很方便地在云服务器上创建和管理数据库。以下是一些示例:创建新的数据库连接:首先,在您的云服务上创建一个新的数据库连接。在连接上添加“openservers”选项,然后将“openserver”设置为您要连接的云服务的主机名。如果您要连接的主机名是“test_server”或“test.sources”,则可以将其替换为您的云服务器的主机名。创建新的数据库:选择您的数据库文件所在的路径和文件名
2023-10-27

C# winfroms使用socket客户端服务端的示例代码

本文介绍了如何在C#WinForms中使用Socket实现客户端-服务器通信。示例代码演示了客户端如何连接到服务器、发送和接收数据,以及服务器如何接收连接、发送和接收数据。本文适用于希望在C#WinForms应用程序中实现网络通信的开发人员。
C# winfroms使用socket客户端服务端的示例代码
2024-04-02

如何使用java实现客户端与服务器

小编给大家分享一下如何使用java实现客户端与服务器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java可以用来干什么Java主要应用于:1. web开发;2.
2023-06-14

怎么使用Jersey客户端请求Spring Boot服务

要使用Jersey客户端请求Spring Boot服务,你需要遵循以下步骤:1. 在你的Spring Boot项目中,确保你已经添加了Jersey的依赖。你可以在`pom.xml`文件中添加以下依赖:```xmlorg.glassfish.
2023-08-18

云服务器如何使用ssr客户端登录

在ssr客户端上,你可以使用多种方式登录到云服务器中。以下是其中几种方法:1.使用ssr登录到控制台:使用ssr客户端上的控制台登录功能,在控制台上输入要登录的账号和密码即可登录到云服务器中。在控制台上还可以使用其他的ssr客户端,例如openssl等。2.使用ssr客户端上的ssr.openssl:使用ssr客户端上
云服务器如何使用ssr客户端登录
2023-10-28

自建云服务器:打造高性能的云计算环境

1.了解自建云服务器的成本自建云服务器是一种将服务器资源部署在自己的数据中心或机房的方式,可以提供高度可定制化和灵活性的云计算环境。然而,自建云服务器的成本因多种因素而异,包括硬件设备、网络带宽、维护费用等。2.硬件设备成本自建云服务器的核心是硬件设备,包括服务器主机、存储设备、网络设备等。这些设备的价格因品牌、配置和
2023-10-27

阿里云流媒体服务器打造高可靠、高性能的音视频服务

随着互联网技术的不断发展,音视频服务已成为人们日常生活中不可或缺的一部分。在众多音视频服务中,阿里云流媒体服务器凭借其高可靠、高性能的特性,吸引了大量用户的关注和使用。本文将详细介绍阿里云流媒体服务器,帮助读者更好地了解其功能和优势。一、阿里云流媒体服务器是什么?阿里云流媒体服务器是阿里云推出的一款高性能、高可靠
阿里云流媒体服务器打造高可靠、高性能的音视频服务
2023-11-11

如何使用服务帐户为 Google Calendar API 设置 golang 客户端

如何使用服务帐户为Google Calendar API设置golang客户端?这是许多开发者在使用Google Calendar API时经常遇到的问题。在这篇文章中,php小编香蕉将为你详细介绍如何使用服务帐户来配置golang客户端,
如何使用服务帐户为 Google Calendar API 设置 golang 客户端
2024-02-14

如何使用Go实现TLS服务器和客户端

本篇内容介绍了“如何使用Go实现TLS服务器和客户端”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!传输层安全协议(Transport Lay
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录