我已經部署了第一個 Quarkus 應用程式,其中包含 hibernate-orm-panache、resteasy-reactive、postgresql 等作為 Docker 容器。Quarkus 應用程式作為容器連接到本地機器上的 PostgreSQL,并且運行良好。在第二個版本中,我想用它額外實作 ElasticSearch,它在開發模式下運行良好。
現在我面臨著將 quarkus-app 和 elasticsearch 部署為容器的困難。我嘗試在服務器上以開發模式正常運行它,它作業正常。創建本機包后,創建 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)
uj5u.com熱心網友回復:
我們在這里遺漏了最重要的資訊:您是如何啟動應用程式容器和 Elasticsearch 容器的?
默認情況下,一個容器不會“看到”另一個容器在 localhost 上運行;您需要配置網路并使用正確的主機名來參考另一個容器。
如果您是 docker 新手,我建議您閱讀檔案(從網路概述開始)。
但簡而言之,更簡單的解決方案是創建一個自定義橋接網路并在該網路中運行所有內容:
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/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/530384.html
標籤:弹性搜索夸库斯休眠搜索
