你的位置:皇冠网址 > 皇冠娱乐 > 电竞直播如何联系XXXX客服_使用 Swift 搭建一个 HTTP 代理
电竞直播如何联系XXXX客服_使用 Swift 搭建一个 HTTP 代理
发布日期:2023-10-30 03:52    点击次数:101

电竞直播如何联系XXXX客服_使用 Swift 搭建一个 HTTP 代理

电竞直播如何联系XXXX客服_[[440241]] 引子皇冠返水

皇冠体育

我将通过这篇著作胪陈一下若何用Swift搭建一个HTTP代理劳动器。本文将使用Hummingbird[1]行为劳动端的基本HTTP框架平博在线,以及使用AsyncHTTPClient[2]行为Swift的HTTP客户端来申请运筹帷幄劳动。

皇冠客服飞机:@seo3687

什么是代理劳动器

代理劳动器是一个搭载在客户端和另一个劳动端(背面咱们成为运筹帷幄劳动端)的中间劳动器,它从客户端转发音讯到运筹帷幄劳动端,何况从运筹帷幄劳动端得回反映信息传回给客户端。在转发音讯之前,它不错以某种方式处理这些音讯,雷同,它也不错处理复返的反映。

让咱们试着构建一个

在本文中,咱们将构建一个只将HTTP数据包转发到运筹帷幄劳动的代理劳动器。您不错在这里找到本文的示例代码。

如何联系XXXX客服 创建样子

咱们使用Hummingbird模板样子[3] 目下最低版块适配 Swift5.5 行为咱们劳动的启动模板。读者不错选拔clone这个存储库,或者径直点击Github样子主页上use this template按钮来创建咱们我方的存储库。用这个模板样子创建一个劳动端何况启动它,不错使用一些法规台选项和文献来建立咱们的哄骗。详见here[4]

增多 AsyncHTTPClient

咱们将把AsyncHTTPClient行为依赖加入Package.swift以便咱们背面来使用

dependencies: 平博在线[     ...     .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.6.0"), ], 

然后在运筹帷幄依赖也添加一下

targets: [     .executableTarget(name: "App",         dependencies: [             ...             .product(name: "AsyncHTTPClient", package: "async-http-client"),         ], 

咱们将把HTTPClient行为HBApplicatipn的推广。这么浮浅咱们料理HTTPClient的人命周期以及在HTTPClient删除前调用syncShutdown表率。

extension HBApplication {     var httpClient: HTTPClient {         get { self.extensions.get(\.httpClient) }         set { self.extensions.set(\.httpClient, value: newValue) { httpClient in             try httpClient.syncShutdown()         }}     } } 

当HBApplication关闭时分会调用set内部的闭包。这意味着咱们当咱们援用了HBApplication,即使不使用HTTPClient,咱们也有权限去调用它

增多 middleware[中间件]

咱们将把咱们的代理劳动器行为中间件。中间件将得回一个申请,然后将它发送到运筹帷幄劳动器何况从运筹帷幄劳动器得回反映信息。底下使咱们启动版块的中间件,它需要HTTPClient和运筹帷幄劳动器的URL两个参数。

struct HBProxyServerMiddleware: HBMiddleware {     let httpClient: HTTPClient     let target: String      func apply(to request: HBRequest, next: HBResponder) -> EventLoopFuture<HBResponse> {         return httpClient.execute(             request: request,             eventLoop: .delegateAndChannel(on: request.eventLoop),             logger: request.logger         )     } } 

当今咱们有了HTTPClient和HBProxyServerMiddleware中间件,咱们将它们加入建立文献HBApplication.configure。然后修复咱们代理劳动地址为http://httpbin.org

func configure(_ args: AppArguments) throws {     self.httpClient = HTTPClient(eventLoopGroupProvider: .shared(self.eventLoopGroup))     self.middleware.add(HBProxyServerMiddleware(httpClient: self.httpClient, target: "http://httpbin.org")) } 
相易类型

当咱们完成上头的智商,构建会表露失败。因为咱们还需要相易Hummingbird和AsyncHTTPClient之间的请乞降反映类型。同期咱们需要统一运筹帷幄劳动的URL到申请里。

之前就有网友传出中国第一网红冯提莫患甲状腺癌晚期需要手术,也因为这一原因,冯提莫离开了直播八个多月之久,现在冯提莫癌症术后首次回归,宣布加入抖音直播,看视频状态,冯提莫恢复的很好,虽然脖子上留下了一道永久的疤痕,但是冯提莫很乐观,表示这是上天给她留的最美的项链,无需遮遮掩掩。

申请相易

为了将Hummingbird HBRequest调动为AsyncHTTPClient HTTPClient.Request,

原因: 咱们当先需要整理可能仍在加载的HBRequest的body信息,相易流程是异步的

处分决策:是以它需要复返一个包含背面相易完毕的EventLoopFuture,让咱们将相易函数放到HBRequest内部

extension HBRequest {     func ahcRequest(host: String) -> EventLoopFuture<HTTPClient.Request> {         // consume request body and then construct AHC Request once we have the         // result. The URL for the request is the target server plus the URI from         // the `HBRequest`.         return self.body.consumeBody(on: self.eventLoop).flatMapThrowing { buffer in             return try HTTPClient.Request(                 url: host + self.uri.description,                 method: self.method,                 headers: self.headers,                 body: buffer.map { .byteBuffer($0) }             )         }     } } 
反映信息装换

从HTTPClient.Response到HBResponse的相易卓越省略

extension HTTPClient.Response {     var hbResponse: HBResponse {         return .init(             status: self.status,             headers: self.headers,             body: self.body.map { HBResponseBody.byteBuffer($0) } ?? .empty         )     } } 

咱们当今将这两个相易智商加入HBProxyServerMiddleware的apply函数中。同期加入一些日记打印信息

func apply(to request: HBRequest, next: HBResponder) -> EventLoopFuture<HBResponse> {     // log request     request.logger.info("Forwarding \(request.uri.path)")     // convert to HTTPClient.Request, execute, convert to HBResponse     return request.ahcRequest(host: target).flatMap { ahcRequest in         httpClient.execute(             request: ahcRequest,             eventLoop: .delegateAndChannel(on: request.eventLoop),             logger: request.logger         )     }.map { response in         return response.hbResponse     } } 

当今应该不错平淡编译了。中间件将整理HBRequest的申请体,皇冠网址将它调动为HTTPRequest.Request,然后使用HTTPClient将申请转发给运筹帷幄劳动器。得回的反映信息会调动为HBResponse复返给哄骗。

运行哄骗,怒放网页怒放localhost:8080。咱们应该能看到咱们之前修复代理的httpbin.org网页信息

Streaming[流]

上头的修复不诟谇常理思。它会恭候申请皆备加载,然后才将申请转发给运筹帷幄劳动端。同理反映转发亦然需要恭候反映皆备加载后才会转发。这缩小了音讯发送的成果,雷同会导致申请占用多半内存或者反映信息很大。

咱们不错通过流式传输请乞降反映负载来纠正这少许。一朝咱们有了它的头部,就脱手将申请发送到运筹帷幄劳动,并在领受到主体部分时对其进行流式处理。访佛地,一朝咱们有了它的头,在另一个看法脱手发送反映。排斥对完好意思申请或反映的恭候将擢升代理劳动器的性能。

电竞直播

淌若客户端和代理之间的通讯以及代理和运筹帷幄劳动之间的通讯以不同的速率运行,咱们仍然会遭受内存问题。淌若咱们领受数据的速率比处理数据的速率快,数据就会脱手备份。为了幸免这种情况发生,咱们需要粗略施加背压以罢手读取稀奇的数据,直到咱们处理了鼓胀多的内存中的数据。有了这个,咱们不错将代理使用的内存量保握在最低抛弃。

流式申请

流式传输申请负载是一个卓越省略的流程。内容上,它简化了构造 HTTPClient.Request 的流程因为咱们不需要恭候申请皆备加载。咱们若何构造 HTTPClient.Request 主体将基于完好意思的 HBRequest 是否还是在内存中。淌若咱们复返流申请,则会自动哄骗背压,因为 Hummingbird 劳动器框架会为咱们实施此操作。

XXX足坛新星,年轻天赋惊叹。场上表现越来越出色,已经成为一员。
func ahcRequest(host: String, eventLoop: EventLoop) throws -> HTTPClient.Request {     let body: HTTPClient.Body?      switch self.body {     case .byteBuffer(let buffer):         body = buffer.map { .byteBuffer($0) }     case .stream(let stream):         body = .stream { writer in             // as we consume buffers from `HBRequest` we write them to             // the `HTTPClient.Request`.             return stream.consumeAll(on: eventLoop) { byteBuffer in                 writer.write(.byteBuffer(byteBuffer))             }         }     }     return try HTTPClient.Request(         url: host + self.uri.description,         method: self.method,         headers: self.headers,         body: body     ) } 
流式反映

流式反映需要一个罢免 HTTPClientResponseDelegate 的class. 这将在 HTTPClient 反映可用时立即从反映中领受数据。反映正文是 ByteBuffers 形状. 咱们不错将这些 ByteBuffers 提供给 HBByteBufferStreamer. 咱们文书的 HBResponse 是由这些流构造,而不是静态的 ByteBuffer。

bet365体育

淌若咱们将申请流与反映流代码长入起来,咱们的最终的 apply 函数应该是这么的

func apply(to request: HBRequest, next: HBResponder) -> EventLoopFuture<HBResponse> {     do {         request.logger.info("Forwarding \(request.uri.path)")         // create request         let ahcRequest = try request.ahcRequest(host: target, eventLoop: request.eventLoop)         // create response body streamer. maxSize is the maximum size of object it can process         // maxStreamingBufferSize is the maximum size of data the streamer is allowed to have         // in memory at any one time         let streamer = HBByteBufferStreamer(eventLoop: request.eventLoop, maxSize: 2048*1024, maxStreamingBufferSize: 128*1024)         // HTTPClientResponseDelegate for streaming bytebuffers from AsyncHTTPClient         let delegate = StreamingResponseDelegate(on: request.eventLoop, streamer: streamer)         // execute request         _ = httpClient.execute(             request: ahcRequest,             delegate: delegate,             eventLoop: .delegateAndChannel(on: request.eventLoop),             logger: request.logger         )         // when delegate receives head then signal completion         return delegate.responsePromise.futureResult     } catch {         return request.failure(error)     } } 

你会从容到在上头的代码中咱们不恭候httpClient.execute. 这是因为淌若咱们这么作念了,该函数将在链接之前恭候所有这个词反映主体在内存中。咱们但愿立即处理反映,因此咱们向奉求添加了一个promise: 一朝咱们收到头部信息,就领悟过保存头部确定和流到HBResponse来收尾。EventLoopFuture这个 promise的是咱们从apply函数传回的。

我莫得在StreamingResponseDelegate这里包含代码,但您不错在完好意思的示例代码中[5]找到它。

示例代码添加

该示例代码[6]可能在上头的基础上作念了部分修改。

默许绑定地址端口是 8081 而不是 8080。大多数 Hummingbird 示例在 8080 上运行,因此要在这些示例驾驭使用代理,它需要绑定到不同的端口。 我添加了一个位置选项,它允许咱们只转发来自特定基本 URL 的申请 我为运筹帷幄和位置添加了大喊行选项,因此不错在不重建哄骗尺度的情况下转变这些选项 我删除了 host 标题或申请,以便不错用正确的值填写 淌若提供了 content-length 标头,则在相易流申请时,我将其传递给 HTTPClient 流送器,以确保 content-length 为运筹帷幄劳动器的申请正确修复标头。 备择决策

咱们不错使用 HummingbirdCore 代替 Hummingbird 行为代理劳动器。这将提供一些稀奇的性能,因为它会删除稀奇的代码层,但会殉国活泼性。添加任何稀奇的路由或中间件需要作念更多的职责。我有只使用HummingbirdCore代理劳动器的示例代码在这里[7]。

皇冠信用站

固然,另一种选拔是使用 Vapor。我思在 Vapor 中的收尾看起来与上头描写的相配相似,应该不会太难。不外我会把它留给别东谈主。

参考良友

[1]Hummingbird: https://github.com/hummingbird-project/hummingbird

[2]AsyncHTTPClient: https://github.com/swift-server/async-http-client

皇冠博彩

[3]Hummingbird模板样子: https://github.com/hummingbird-project/template

[4]here: https://opticalaberration.com/2021/12/hummingbird-template.html

[5]示例代码中: https://github.com/hummingbird-project/hummingbird-examples/blob/main/proxy-server/Sources/App/Middleware/StreamingResponseDelegate.swift

信用卡皇冠hg0088

[6]示例代码: https://github.com/hummingbird-project/hummingbird-examples/tree/main/proxy-server

[7]在这里: https://github.com/hummingbird-project/hummingbird-examples/tree/main/proxy-server-core

 



相关资讯