首页 > 解决方案 > 带有嵌入式 Hazlecast 的 Quarkus 在 AWS 上失败并出现错误“无法配置发现策略”

问题描述

我正在尝试在 AWS ECS Fargate 上部署一个带有嵌入式 hazlecast 缓存 (4.1) 的 quarkus 1.12.1.Final 应用程序。嵌入式缓存在本地运行良好,但在配置和部署到 AWS 时会出现错误“无法配置发现策略”

我按照此链接在 AWS 上进行设置:https ://hazelcast.com/blog/how-to-set-up-hazelcast-imdg-on-aws-ecs/

有没有人能够在 AWS 上成功设置这样的嵌入式缓存?任何帮助表示赞赏。堆栈跟踪如下。

2021-09-28T10:51:19.518+02:00 Caused by: java.lang.RuntimeException: Failed to configure discovery strategies
2021-09-28T10:51:19.518+02:00 at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.loadDiscoveryStrategies(DefaultDiscoveryService.java:161)
2021-09-28T10:51:19.518+02:00 at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.<init>(DefaultDiscoveryService.java:58) 
2021-09-28T10:51:19.519+02:00 at com.hazelcast.spi.discovery.impl.DefaultDiscoveryServiceProvider.newDiscoveryService(DefaultDiscoveryServiceProvider.java:29)
2021-09-28T10:51:19.520+02:00 at com.hazelcast.instance.impl.Node.createDiscoveryService(Node.java:341)

2021-09-28T10:51:19.520+02:00 at com.hazelcast.instance.impl.Node.<init>(Node.java:267)
2021-09-28T10:51:19.520+02:00 at com.hazelcast.instance.impl.HazelcastInstanceImpl.createNode(HazelcastInstanceImpl.java:148)
2021-09-28T10:51:19.520+02:00 at com.hazelcast.instance.impl.HazelcastInstanceImpl.<init>(HazelcastInstanceImpl.java:117)
2021-09-28T10:51:19.520+02:00 at com.hazelcast.instance.impl.HazelcastInstanceFactory.constructHazelcastInstance(HazelcastInstanceFactory.java:211)
2021-09-28T10:51:19.520+02:00 at com.hazelcast.instance.impl.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:190)
2021-09-28T10:51:19.520+02:00 at com.hazelcast.instance.impl.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:128)
2021-09-28T10:51:19.521+02:00 at com.hazelcast.core.Hazelcast.newHazelcastInstance(Hazelcast.java:57)
2021-09-28T10:51:19.521+02:00 at org.GreetingApplication.create(GreetingApplication.java:58)
2021-09-28T10:51:19.521+02:00 at org.GreetingApplication.init(GreetingApplication.java:32)
2021-09-28T10:51:19.521+02:00 at org.GreetingApplication_Bean.create(GreetingApplication_Bean.zig:700)
2021-09-28T10:51:19.521+02:00 at org.GreetingApplication_Bean.create(GreetingApplication_Bean.zig:716)
2021-09-28T10:51:19.521+02:00 at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:96)
2021-09-28T10:51:19.521+02:00 at io.quarkus.arc.impl.AbstractSharedContext.access$000(AbstractSharedContext.java:14)
2021-09-28T10:51:19.521+02:00 at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:29)
2021-09-28T10:51:19.522+02:00 at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:26)
2021-09-28T10:51:19.522+02:00 at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
2021-09-28T10:51:19.522+02:00 at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
2021-09-28T10:51:19.522+02:00 at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:26)
2021-09-28T10:51:19.522+02:00 at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:17)
2021-09-28T10:51:19.522+02:00 at org.GreetingApplication_ClientProxy.arc$delegate(GreetingApplication_ClientProxy.zig:67)
2021-09-28T10:51:19.522+02:00 at org.GreetingApplication_ClientProxy.arc_contextualInstance(GreetingApplication_ClientProxy.zig:82)
2021-09-28T10:51:19.523+02:00 at io.quarkus.arc.runtime.ClientProxyUnwrapper.apply(ClientProxyUnwrapper.java:11)
2021-09-28T10:51:19.523+02:00 at io.quarkus.resteasy.common.runtime.ResteasyInjectorFactoryRecorder$1.apply(ResteasyInjectorFactoryRecorder.java:22)
2021-09-28T10:51:19.523+02:00 at io.quarkus.resteasy.common.runtime.QuarkusInjectorFactory$UnwrappingPropertyInjector.inject(QuarkusInjectorFactory.java:65)
2021-09-28T10:51:19.523+02:00 at org.jboss.resteasy.core.ResteasyDeploymentImpl.createApplication(ResteasyDeploymentImpl.java:423)
2021-09-28T10:51:19.523+02:00 at org.jboss.resteasy.core.ResteasyDeploymentImpl.initializeObjects(ResteasyDeploymentImpl.java:266)
2021-09-28T10:51:19.523+02:00 at org.jboss.resteasy.core.ResteasyDeploymentImpl.startInternal(ResteasyDeploymentImpl.java:138)
2021-09-28T10:51:19.524+02:00 at org.jboss.resteasy.core.ResteasyDeploymentImpl.start(ResteasyDeploymentImpl.java:122)
2021-09-28T10:51:19.525+02:00 at io.quarkus.resteasy.runtime.standalone.ResteasyStandaloneRecorder.staticInit(ResteasyStandaloneRecorder.java:35)
2021-09-28T10:51:19.525+02:00 at io.quarkus.deployment.steps.ResteasyStandaloneBuildStep$staticInit-210558872.deploy_0(ResteasyStandaloneBuildStep$staticInit-210558872.zig:906)
2021-09-28T10:51:19.525+02:00 at io.quarkus.deployment.steps.ResteasyStandaloneBuildStep$staticInit-210558872.deploy(ResteasyStandaloneBuildStep$staticInit-210558872.zig:40)
2021-09-28T10:51:19.525+02:00 at io.quarkus.runner.ApplicationImpl.<clinit>(ApplicationImpl.zig:169)
2021-09-28T10:51:19.525+02:00 ... 9 more
2021-09-28T10:51:19.526+02:00 Caused by: com.hazelcast.aws.RestClientException: Failure in executing REST call
2021-09-28T10:51:19.526+02:00 at com.hazelcast.aws.RestClient.call(RestClient.java:114)
2021-09-28T10:51:19.526+02:00 at com.hazelcast.aws.RestClient.lambda$callWithRetries$0(RestClient.java:84)
2021-09-28T10:51:19.526+02:00 at com.hazelcast.aws.RetryUtils.retry(RetryUtils.java:50)
2021-09-28T10:51:19.526+02:00 at com.hazelcast.aws.RestClient.callWithRetries(RestClient.java:84)
2021-09-28T10:51:19.527+02:00 at com.hazelcast.aws.RestClient.get(RestClient.java:76)
2021-09-28T10:51:19.527+02:00 at com.hazelcast.aws.AwsMetadataApi.metadataEcs(AwsMetadataApi.java:92)
2021-09-28T10:51:19.527+02:00 at com.hazelcast.aws.AwsClientConfigurator.resolveCluster(AwsClientConfigurator.java:143)
2021-09-28T10:51:19.527+02:00 at com.hazelcast.aws.AwsClientConfigurator.createAwsClient(AwsClientConfigurator.java:65)
2021-09-28T10:51:19.527+02:00 at com.hazelcast.aws.AwsDiscoveryStrategy.<init>(AwsDiscoveryStrategy.java:79)
2021-09-28T10:51:19.527+02:00 at com.hazelcast.aws.AwsDiscoveryStrategyFactory.newDiscoveryStrategy(AwsDiscoveryStrategyFactory.java:50)
2021-09-28T10:51:19.527+02:00 at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.buildDiscoveryStrategy(DefaultDiscoveryService.java:195)
2021-09-28T10:51:19.529+02:00 at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.loadDiscoveryStrategies(DefaultDiscoveryService.java:141)
2021-09-28T10:51:19.529+02:00 ... 44 more
2021-09-28T10:51:19.529+02:00 Caused by: java.net.SocketTimeoutException: Read timed out
2021-09-28T10:51:19.529+02:00 at java.base/java.net.SocketInputStream.socketRead0(Native Method)
2021-09-28T10:51:19.530+02:00 at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
2021-09-28T10:51:19.530+02:00 at java.base/java.net.SocketInputStream.read(SocketInputStream.java:168)
2021-09-28T10:51:19.530+02:00 at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
2021-09-28T10:51:19.530+02:00 at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252)
2021-09-28T10:51:19.530+02:00 at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:292)
2021-09-28T10:51:19.530+02:00 at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:351)
2021-09-28T10:51:19.530+02:00 at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:754)
2021-09-28T10:51:19.530+02:00 at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
2021-09-28T10:51:19.531+02:00 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1615)

编辑我使用 maven quarkus quick start 创建了一个简单的项目来再次测试(它是一个不同的 quarkus 版本,但错误是相同的)

mvn io.quarkus:quarkus-maven-plugin:1.11.7.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=getting-started -DclassName="org.acme.getting.started.GreetingResource" -Dpath="/hello"

为 hazlecast 添加了额外的依赖项:

<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-all</artifactId>
<version>4.1</version>

为其添加了一个简单的应用程序类,以在启动时初始化缓存,如下所示:https ://hazelcast.com/blog/how-to-set-up-hazelcast-imdg-on-aws-ecs/

    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(true);
config.getNetworkConfig().getInterfaces().setEnabled(true).addInterface("10.0.*.*");

标签: javaquarkus

解决方案


在进一步的比较中,我注意到用于 springboot 和 quarkus 的基本 docker 镜像是不同的。相比之下,quarkus 基础镜像启用了代理,并且 NO_PROXY 缺少一些与 AWS 相关的 IP。一旦我将它更新到下面,它就开始工作了:

ENV NO_PROXY='169.254.169.254,localhost,127.0.0.1,.amazonaws.com,169.254.170.2,\\.\pipe\docker_engine'

推荐阅读