如何使用elasticsearch启动quarkus原生应用?

mec1mxoz  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(140)

我已经部署了第一个Quarkus应用程序作为Docker容器,其中包含hibernate-orm-panache、resteasy-reactive、postgresql等。Quarkus应用程序作为容器连接到本地机器上的PostgreSQL,并且运行得非常好。在第二个版本中,我想用它额外实现ElasticSearch,它在开发模式下运行得非常好。
现在我面临着将quarkus-app和elasticsearch作为容器部署的困难。我试着在服务器上以dev模式正常运行它,它工作得很好。在创建了原生包,创建了Docker映像,最后将该映像作为容器运行后,我得到了一个错误消息Elasticsearch request failed:Connection refused.
属性文件如下所示:

quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=postgres
quarkus.datasource.password=postgrespw
quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.5.45:5432/b2data

#quarkus.hibernate-orm.log.sql=true

quarkus.hibernate-search-orm.elasticsearch.version=7
quarkus.hibernate-search-orm.automatic-indexing.synchronization.strategy=sync

quarkus.elasticsearch.hosts = localhost:9200
#quarkus.elasticsearch.port = 9200
#quarkus.elasticsearch.devservices.enabled = false

我也试过以localhost:9200的身份启动elasticsearch-cluster,然后连接 quarkus ,但不幸的是没有成功。我是 quarkus 的新手,尤其是elasticsearch。我知道我遗漏了一些东西,所以有人能帮我弄清楚吗?

<dependencies>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
  </dependency>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-hibernate-orm-panache</artifactId>
  </dependency>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-hibernate-search-orm-elasticsearch</artifactId>
  </dependency>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-jdbc-postgresql</artifactId>
  </dependency>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-arc</artifactId>
  </dependency>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-reactive</artifactId>
  </dependency>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-junit5</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

和错误日志

2022-11-03 15:10:05,879 ERROR [org.hib.sea.eng.rep.spi.RootFailureCollector] (JPA Startup Thread: <default>) HSEARCH000521: Hibernate Search encountered a failure during bootstrap; continuing for now to list all problems, but the process will ultimately be aborted.
Context: default backend
Failure:: org.hibernate.search.util.common.SearchException: HSEARCH400080: Unable to detect the Elasticsearch version running on the cluster: HSEARCH400007: Elasticsearch request failed: Connection refused
Request: GET  with parameters {}
Response: (no response)
        at org.hibernate.search.backend.elasticsearch.client.impl.ElasticsearchClientUtils.getElasticsearchVersion(ElasticsearchClientUtils.java:59)
        at org.hibernate.search.backend.elasticsearch.impl.ElasticsearchLinkImpl.initVersion(ElasticsearchLinkImpl.java:200)
        at org.hibernate.search.backend.elasticsearch.impl.ElasticsearchLinkImpl.onStart(ElasticsearchLinkImpl.java:142)
        at org.hibernate.search.backend.elasticsearch.impl.ElasticsearchBackendImpl.start(ElasticsearchBackendImpl.java:148)
        at org.hibernate.search.engine.common.impl.BackendNonStartedState.start(BackendNonStartedState.java:48)
        at org.hibernate.search.engine.common.impl.SearchIntegrationPartialBuildStateImpl$SearchIntegrationFinalizerImpl.finalizeIntegration(SearchIntegrationPartialBuildStateImpl.java:174)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateOrmIntegrationPartialBuildState.doBootSecondPhase(HibernateOrmIntegrationPartialBuildState.java:75)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateOrmIntegrationBooterImpl.bootNow(HibernateOrmIntegrationBooterImpl.java:176)
        at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:646)
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateSearchSessionFactoryObserver.sessionFactoryCreated(HibernateSearchSessionFactoryObserver.java:41)
        at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:402)
        at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:74)
        at io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.createEntityManagerFactory(FastBootHibernatePersistenceProvider.java:72)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
        at io.quarkus.hibernate.orm.runtime.JPAConfig$LazyPersistenceUnit.get(JPAConfig.java:165)
        at io.quarkus.hibernate.orm.runtime.JPAConfig$1.run(JPAConfig.java:66)
        at java.lang.Thread.run(Thread.java:833)
        at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:705)
        at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
Caused by: org.hibernate.search.util.common.SearchException: HSEARCH400007: Elasticsearch request failed: Connection refused
Request: GET  with parameters {}
Response: (no response)
        at org.hibernate.search.backend.elasticsearch.client.impl.ElasticsearchClientUtils.tryGetElasticsearchVersion(ElasticsearchClientUtils.java:83)
        at org.hibernate.search.backend.elasticsearch.client.impl.ElasticsearchClientUtils.getElasticsearchVersion(ElasticsearchClientUtils.java:56)
        ... 22 more
Caused by: org.hibernate.search.util.common.SearchException: Connection refused
        at org.hibernate.search.util.common.impl.Throwables.toRuntimeException(Throwables.java:33)
        at org.hibernate.search.util.common.impl.Futures.unwrappedExceptionJoin(Futures.java:196)
        at org.hibernate.search.backend.elasticsearch.client.impl.ElasticsearchClientUtils.tryGetElasticsearchVersion(ElasticsearchClientUtils.java:67)
        ... 23 more
Caused by: java.net.ConnectException: Connection refused
        at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VA_LIST_ConnectException_constructor_026ed3e065cc052585fca43de83265b2d1381f28(JNIJavaCallWrappers.java:0)
        at sun.nio.ch.Net.pollConnect(Net.java)
        at sun.nio.ch.Net.pollConnectNow(Net.java:672)
        at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946)
        at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvent(DefaultConnectingIOReactor.java:174)
        at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvents(DefaultConnectingIOReactor.java:148)
        at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:351)
        at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221)
        at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64)
        ... 3 more

2022-11-03 15:10:05,882 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): org.hibernate.search.util.common.SearchException: HSEARCH000520: Hibernate Search encountered failures during bootstrap. Failures:

    default backend:
        failures:
          - HSEARCH400080: Unable to detect the Elasticsearch version running on the cluster: HSEARCH400007: Elasticsearch request failed: Connection refused
            Request: GET  with parameters {}
            Response: (no response)
        at org.hibernate.search.engine.reporting.spi.RootFailureCollector.checkNoFailure(RootFailureCollector.java:53)
        at org.hibernate.search.engine.common.impl.SearchIntegrationPartialBuildStateImpl$SearchIntegrationFinalizerImpl.finalizeIntegration(SearchIntegrationPartialBuildStateImpl.java:177)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateOrmIntegrationPartialBuildState.doBootSecondPhase(HibernateOrmIntegrationPartialBuildState.java:75)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateOrmIntegrationBooterImpl.bootNow(HibernateOrmIntegrationBooterImpl.java:176)
        at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:646)
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateSearchSessionFactoryObserver.sessionFactoryCreated(HibernateSearchSessionFactoryObserver.java:41)
        at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:402)
        at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:74)
        at io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.createEntityManagerFactory(FastBootHibernatePersistenceProvider.java:72)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
        at io.quarkus.hibernate.orm.runtime.JPAConfig$LazyPersistenceUnit.get(JPAConfig.java:165)
        at io.quarkus.hibernate.orm.runtime.JPAConfig$1.run(JPAConfig.java:66)
        at java.lang.Thread.run(Thread.java:833)
        at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:705)
        at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
qeeaahzv

qeeaahzv1#

我们遗漏了最重要的信息:您是如何启动应用程序容器和Elasticsearch容器的?
默认情况下,一个容器不会“看到”另一个容器在本地主机上运行;您需要配置网络并使用正确的主机名来引用其他容器。
如果您是docker的新手,我建议您阅读文档(从overview of networking开始)。
但简而言之,更简单的解决方案是创建一个自定义网桥网络,然后在该网络中运行所有内容:

docker network create my-net

# Run postgres
# WARNING: in a real-world scenario you should configure named volumes or mounts,
# to properly persist data.
# See https://docs.docker.com/storage/
docker run --name mypostgres --network my-net \
  -e POSTGRES_USER=admin \                                                                    
  -e POSTGRES_PASSWORD=admin \        
  -e POSTGRES_DB=my-db \              
  postgres:14.5

# Run elasticsearch
# WARNING: in a real-world scenario you should configure named volumes or mounts,
# to properly persist data.
# See https://docs.docker.com/storage/
docker run --name myelasticsearch --network my-net \
  --ulimit memlock=-1:-1 --memory-swappiness=0 \                                                                               
  -e "xpack.security.enabled=false" \
  -e "discovery.type=single-node" \
  elastic/elasticsearch:7.17.7

# Run the application,
# passing the connection info as environment variables
docker run --name myapp --network my-net -p 8080:8080 \
  -e QUARKUS_DATASOURCE_JDBC_URL=jdbc:postgresql://mypostgres/my-db \
  -e QUARKUS_DATASOURCE_USERNAME=admin \
  -e QUARKUS_DATASOURCE_PASSWORD=admin \
  -e QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_HOSTS=myelasticsearch:9200 \
  my-app-container-image

您可能希望使用docker-compose将所有配置整齐地存储在一个文件中:https://docs.docker.com/compose/gettingstarted/

相关问题