2

我有 vertx HttpClient 的问题。这是显示使用 vertx 和普通 java 测试 GET 的代码。

    Vertx vertx = Vertx.vertx();
    HttpClientOptions options = new HttpClientOptions()
            .setTrustAll(true)
            .setSsl(false)
            .setDefaultPort(80)
            .setProtocolVersion(HttpVersion.HTTP_1_1)
            .setLogActivity(true);
    HttpClient client = vertx.createHttpClient(options);

    client.getNow("google.com", "/", response -> {
        System.out.println("Received response with status code " + response.statusCode());
    });
    System.out.println(getHTML("http://google.com"));

getHTML() 来自这里:How do I do a HTTP GET in Java?

这是我的输出:

<!doctype html><html... etc <- correct output from plain java
Feb 08, 2017 11:31:21 AM io.vertx.core.http.impl.HttpClientRequestImpl
SEVERE: java.net.UnknownHostException: failed to resolve 'google.com'.     Exceeded max queries per resolve 3 

但是vertx无法连接。这里有什么问题?我没有使用任何代理。

4

4 回答 4

3

供参考:如this question和 tsegismont's comment here 中所述,解决方案是将标志设置vertx.disableDnsResolvertrue

-Dvertx.disableDnsResolver=true

为了回退到 JVM DNS 解析器,如下所述

有时可能需要使用 JVM 内置解析器,JVM 系统属性 -Dvertx.disableDnsResolver=true 会激活此行为

我在 kubernetes 环境中使用 redis 客户端观察到这个 DNS 解析问题。

于 2019-11-26T15:50:44.393 回答
1

我遇到了这个问题,对我来说是什么原因导致 Java 运行时获取了陈旧的 DNS 服务器,即为机器不再连接的网络注册的服务器。这个问题首先出现在 Sun JNDI 实现中,它也存在于 Netty 中,它使用 JNDI 在大多数平台上引导其名称服务器列表,然后最终出现在 VertX 中。

我认为解决这个问题的好地方是在默认 DNS 服务器集被引导的 Netty 层。我已经为 Netty 项目提出了一张票,所以我们将看看他们是否同意我的看法!这是 Netty 票

同时,一个相当基本的解决方法是根据 Netty 检测到的默认 DNS 服务器是否可访问来过滤它们。这是在构建主 VertX 实例之前应用的 Kotlin 代码示例。

// The default set of name servers provided by JNDI can contain stale entries
// This default set is picked up by Netty and in turn by VertX
// To work around this, we filter for only reachable name servers on startup

val nameServers = DefaultDnsServerAddressStreamProvider.defaultAddressList()

val reachableNameServers = nameServers.stream()
        .filter {ns -> ns.address.isReachable(NS_REACHABLE_TIMEOUT)}
        .map {ns -> ns.address.hostAddress}
        .collect(Collectors.toList())

if (reachableNameServers.size == 0)
    throw StartupException("There are no reachable name servers available")

val opts = VertxOptions()
opts.addressResolverOptions.servers = reachableNameServers

// The primary Vertx instance
val vertx = Vertx.vertx(opts)

如果有帮助,请提供更多细节。我有一台公司机器,它在某个时候通过物理电缆连接到公司网络。公司内部名称服务器的详细信息由物理接口上的 DHCP 设置。在家里使用无线接口,无线接口的 DNS 设置为我的家庭 DNS,而物理接口的配置未更新。这很好,因为该设备未处于活动状态, ipconfig /all 不显示内部公司 DNS 服务器。但是,在注册表中查看它们仍然存在:

计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

它们被 JNDI 机制接收,该机制为 Netty 和 VertX 提供数据。由于无法从我的家庭位置访问它们,因此 DNS 解析失败。我可以想象这种家庭/办公室的情况并不是我独有的!我不知道容器或虚拟机上的多个虚拟接口是否会发生类似的情况,如果您遇到问题,可能值得一看。

于 2020-05-09T12:03:21.827 回答
0

尝试使用 web 客户端而不是 httpclient,这里有一个示例(使用 rx):

private val client: WebClient = WebClient.create(vertx, WebClientOptions()
        .setSsl(true)
        .setTrustAll(true)
        .setDefaultPort(443)
        .setKeepAlive(true)
)

open fun <T> get(uri: String, marshaller: Class<T>): Single<T> {
    return client.getAbs(host + uri).rxSend()
            .map { extractJson(it, uri, marshaller) }
}

另一种选择是使用 getAbs。

于 2018-10-03T00:04:53.480 回答
0

这是适用于我的示例代码。

public class TemplVerticle extends HttpVerticle {

public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();

    // Create the web client and enable SSL/TLS with a trust store
    WebClient client = WebClient.create(vertx,
            new WebClientOptions()
                    .setSsl(true)
                    .setTrustAll(true)
                    .setDefaultPort(443)
                    .setKeepAlive(true)
                    .setDefaultHost("www.w3schools.com")

    );


    client.get("www.w3schools.com")

            .as(BodyCodec.string())
            .send(ar -> {
                if (ar.succeeded()) {
                    HttpResponse<String> response = ar.result();
                    System.out.println("Got HTTP response body");
                    System.out.println(response.body().toString());

                } else {
                    ar.cause().printStackTrace();
                }
            });
}

}

于 2017-04-13T23:30:52.767 回答