在选择不同代理时复用 OkHttp 资源
在创建调用之前选择配置了代理的 OkHttp 客户端,并了解 newBuilder 共享哪些内容。
OkHttp 请求没有通用的可变代理字段。在创建调用之前,先选择具有预期路由的客户端。
当其余配置应保持共享时,从现有客户端派生出已路由的客户端:
OkHttpClient routed = baseClient.newBuilder()
.proxy(new Proxy(Proxy.Type.HTTP,
new InetSocketAddress("203.0.113.10", 8080)))
.build();该端点是示例性的。来自 HTTP 代理列表 的公共 HTTP 端点可以为获准的公共服务路由填充此套接字地址,前提是基础客户端的策略不会向新端点提供任何代理凭据。OkHttp 文档说明 newBuilder 与原客户端共享连接池和线程资源。这并不意味着通过一个代理建立的套接字可以重新标记为另一条路由。连接是否合格仍取决于路由和地址配置。
对于重复性工作,请保留一组数量有限、以你真正需要的路由策略为键的客户端。避免使用键中包含所有曾经观察到的临时账户或代理变体的无界映射。
资源共享也会影响关闭。关闭共享缓存或关闭共享调度器可能会影响使用这些资源的其他派生客户端。请为资源所有权设定明确的应用级生命周期,而不是把每个派生客户端都当作隔离的网络栈。
最后,将所选代理的身份包含在调用自身的元数据中。一个全局的“最后选择的代理”变量无法标识多个并发请求的路由。