I'm using Spring Cloud Config Server with a simple Spring Boot project. So I have a service for Spring Cloud Config Service and another simple service that connect to Spring Cloud Config Service to get some properties like database credentials and other properties. If I test it on local everything works good, but if I try to start these 2 services as docker containers it isn't working. The Spring Cloud Config Service starts fine, and then I try to start the other service and it's not working. It cannot connect to the config server and I don't understand why.
spring cloud config server application.yml:
server:
port: 8888
spring:
application:
name: spring-cloud-config-server
cloud:
config:
label: master
server:
git:
uri: https://github.com/...
security:
user:
name: gigi
password: $2a$10$QpA9JjOQiciPKokmwlxEYOPtZLIHfTFECvDeL8in.ZGWVUY24Cx/a
spring cloud config server pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gab.microservices</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-config-server</name>
<description>Centralized Configuration Server</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>2021.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<name>eveningstar33/mmv2-${project.artifactId}:${project.version}</name>
<pullPolicy>IF_NOT_PRESENT</pullPolicy>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
I start the spring cloud config server as a docker container on local:
$ docker run -p 8888:8888 eveningstar33/mmv2-spring-cloud-config-server:0.0.1-SNAPSHOT
Setting Active Processor Count to 4
Calculating JVM memory based on 4828376K available memory
`For more information on this calculation, see https://paketo.io/docs/reference/java-reference/#memory-calculator
Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx4211948K -XX:MaxMetaspaceSize=104427K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 4828376K, Thread Count: 250, Loaded Class Count: 16023, Headroom: 0%)
Enabling Java Native Memory Tracking
Adding 127 container CA certificates to JVM truststore
Spring Cloud Bindings Enabled
Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_bellsoft-liberica/java-security-properties/java-security.properties -XX: ExitOnOutOfMemoryError -XX:ActiveProcessorCount=4 -XX:MaxDirectMemorySize=10M -Xmx4211948K -XX:MaxMetaspaceSize=104427K -XX:ReservedCodeCacheSize=240M -Xss1M -XX: UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX: PrintNMTStatistics -Dorg.springframework.cloud.bindings.boot.enable=true
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.0)
2022-06-26 15:40:12.369 INFO 1 --- [ main] g.m.s.SpringCloudConfigServerApplication : Starting SpringCloudConfigServerApplication v0.0.1-SNAPSHOT using Java 11.0.15.1 on 058d17df827b with PID 1 (/workspace/BOOT-INF/classes started by cnb in /workspace)
2022-06-26 15:40:12.376 INFO 1 --- [ main] g.m.s.SpringCloudConfigServerApplication : No active profile set, falling back to 1 default profile: "default"
2022-06-26 15:40:14.409 INFO 1 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=e8bf239d-fb47-310c-99e0-8c15e49dfb55
2022-06-26 15:40:15.015 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8888 (http)
2022-06-26 15:40:15.034 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-06-26 15:40:15.035 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
2022-06-26 15:40:15.158 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-06-26 15:40:15.158 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2630 ms
2022-06-26 15:40:16.137 INFO 1 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@5dbbb292, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@613f7eb7, org.springframework.security.web.context.SecurityContextPersistenceFilter@1ac730cd, org.springframework.security.web.header.HeaderWriterFilter@b5b9333, org.springframework.security.web.csrf.CsrfFilter@30bbcf91, org.springframework.security.web.authentication.logout.LogoutFilter@487cd177, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3375ebd3, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@6467ddc7, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@565aa4ac, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@40717ed, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5aa62ee7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1f7cec93, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@587c5c1, org.springframework.security.web.session.SessionManagementFilter@38588dea, org.springframework.security.web.access.ExceptionTranslationFilter@79627d27, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2199e845]
2022-06-26 15:40:17.116 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8888 (http) with context path ''
2022-06-26 15:40:17.148 INFO 1 --- [ main] g.m.s.SpringCloudConfigServerApplication : Started SpringCloudConfigServerApplication in 5.731 seconds (JVM running for 6.46)
And I can do a request at the url http://localhost:8888/currency-exchange/master and these are the informations:
{
"name": "currency-exchange",
"profiles": [
"master"
],
"label": null,
"version": "7b6626f321d73191ca6cfc55f518f7158e1a2313",
"state": null,
"propertySources": [
{
"name": "https://github.com/...
"source": {
"spring.cloud.config.label": "master",
"spring.cloud.config.uri": "http://localhost:8888",
"spring.cloud.config.username": "gigi",
"spring.cloud.config.password": "test1234",
"spring.datasource.url": "jdbc:mysql://docker-mysql:3306/testdb",
"spring.datasource.username": "root",
"spring.datasource.password": "test1234",
"spring.security.user.name": "admin",
"spring.security.user.password": "$2a$10$QpA9JjOQiciPKokmwlxEYOPtZLIHfTFECvDeL8in.ZGWVUY24Cx/a"
}
}
]
}
After that I try to start the other service and I get connection refused:
$ docker run -p 8000:8000 eveningstar33/mmv2-currency-exchange-service:0.0.1-SNAPSHOT
Setting Active Processor Count to 4
Calculating JVM memory based on 4502728K available memory
`For more information on this calculation, see https://paketo.io/docs/reference/java-reference/#memory-calculator
Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx3840722K -XX:MaxMetaspaceSize=150005K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 4502728K, Thread Count: 250, Loaded Class Count: 24070, Headroom: 0%)
Enabling Java Native Memory Tracking
Adding 127 container CA certificates to JVM truststore
Spring Cloud Bindings Enabled
Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_bellsoft-liberica/java-security-properties/java-security.properties -XX: ExitOnOutOfMemoryError -XX:ActiveProcessorCount=4 -XX:MaxDirectMemorySize=10M -Xmx3840722K -XX:MaxMetaspaceSize=150005K -XX:ReservedCodeCacheSize=240M -Xss1M -XX: UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX: PrintNMTStatistics -Dorg.springframework.cloud.bindings.boot.enable=true
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.0)
2022-06-26 15:47:01.483 INFO [currency-exchange,,] 1 --- [ main] g.m.c.CurrencyExchangeServiceApplication : Starting CurrencyExchangeServiceApplication v0.0.1-SNAPSHOT using Java 11.0.15.1 on 08358a26aa24 with PID 1 (/workspace/BOOT-INF/classes started by cnb in /workspace)
2022-06-26 15:47:01.490 INFO [currency-exchange,,] 1 --- [ main] g.m.c.CurrencyExchangeServiceApplication : No active profile set, falling back to 1 default profile: "default"
2022-06-26 15:47:01.591 INFO [currency-exchange,,] 1 --- [ main] o.s.c.c.c.ConfigServerConfigDataLoader : Fetching config from server at : http://localhost:8888
2022-06-26 15:47:01.592 INFO [currency-exchange,,] 1 --- [ main] o.s.c.c.c.ConfigServerConfigDataLoader : Connect Timeout Exception on Url - http://localhost:8888. Will be trying the next url if available
2022-06-26 15:47:01.592 WARN [currency-exchange,,] 1 --- [ main] o.s.c.c.c.ConfigServerConfigDataLoader : Could not locate PropertySource ([ConfigServerConfigDataResource@4aeaadc1 uris = array<String>['http://localhost:8888'], optional = true, profiles = list['default']]): I/O error on GET request for "http://localhost:8888/currency-exchange/default/master": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
2022-06-26 15:47:04.088 INFO [currency-exchange,,] 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2022-06-26 15:47:04.511 INFO [currency-exchange,,] 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 403 ms. Found 1 JPA repository interfaces.
2022-06-26 15:47:05.655 INFO [currency-exchange,,] 1 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=14f08c66-f514-36a3-965b-ebd56a472fd5
2022-06-26 15:47:07.788 INFO [currency-exchange,,] 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8000 (http)
2022-06-26 15:47:07.814 INFO [currency-exchange,,] 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-06-26 15:47:07.816 INFO [currency-exchange,,] 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
2022-06-26 15:47:08.034 INFO [currency-exchange,,] 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-06-26 15:47:08.034 INFO [currency-exchange,,] 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6437 ms
2022-06-26 15:47:08.484 ERROR [currency-exchange,,] 1 --- [ main] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'webMvcMetricsFilter' defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.class]: Unsatisfied dependency expressed through method 'webMvcMetricsFilter' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'simpleMeterRegistry' defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/export/simple/SimpleMetricsExportAutoConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourcePoolMetadataMeterBinder' defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfiguration$DataSourcePoolMetadataMetricsConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourcePoolMetadataMeterBinder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
2022-06-26 15:47:08.521 INFO [currency-exchange,,] 1 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2022-06-26 15:47:08.547 WARN [currency-exchange,,] 1 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
2022-06-26 15:47:08.618 INFO [currency-exchange,,] 1 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-06-26 15:47:08.663 ERROR [currency-exchange,,] 1 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
Native Memory Tracking:
Total: reserved=4647673752, committed=360292248
- Java Heap (reserved=3934257152, committed=181403648)
(mmap: reserved=3934257152, committed=181403648)
- Class (reserved=192943772, committed=52971164)
(classes #9559)
( instance classes #8950, array classes #609)
(malloc=1590940 #24005)
(mmap: reserved=191352832, committed=51380224)
( Metadata: )
( reserved=46137344, committed=44564480)
( used=43492240)
( free=1072240)
( waste=0 =0.00%)
( Class space:)
( reserved=145215488, committed=6815744)
( used=6117872)
( free=697872)
( waste=0 =0.00%)
- Thread (reserved=20055984, committed=1083312)
(thread #19)
(stack: reserved=19968000, committed=995328)
(malloc=68136 #116)
(arena=19848 #35)
- Code (reserved=254867960, committed=18545144)
(malloc=1235448 #5350)
(mmap: reserved=253632512, committed=17309696)
- GC (reserved=190061883, committed=50801979)
(malloc=9997627 #7092)
(mmap: reserved=180064256, committed=40804352)
- Compiler (reserved=11178686, committed=11178686)
(malloc=35638 #532)
(arena=11143048 #15)
- Internal (reserved=389891, committed=389891)
(malloc=357123 #1153)
(mmap: reserved=32768, committed=32768)
- Symbol (reserved=13126528, committed=13126528)
(malloc=11383312 #133295)
(arena=1743216 #1)
- Native Memory Tracking (reserved=2835432, committed=2835432)
(malloc=8120 #101)
(tracking overhead=2827312)
- Arena Chunk (reserved=27594984, committed=27594984)
(malloc=27594984)
- Tracing (reserved=97, committed=97)
(malloc=97 #5)
- Logging (reserved=4572, committed=4572)
(malloc=4572 #192)
- Arguments (reserved=19067, committed=19067)
(malloc=19067 #495)
- Module (reserved=172456, committed=172456)
(malloc=172456 #1850)
- Synchronizer (reserved=157096, committed=157096)
(malloc=157096 #1302)
- Safepoint (reserved=8192, committed=8192)
(mmap: reserved=8192, committed=8192)
So it cannot connect to the config server, and because of that it cannot connect to the database and it cracks.
currency-exchange service application.yml:
spring:
application:
name: currency-exchange
config:
import: optional:configserver:http://localhost:8888
cloud:
config:
label: master
uri: http://localhost:8888
username: gigi
password: test1234
jpa:
show-sql: true
server:
port: 8000
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gab.microservices</groupId>
<artifactId>currency-exchange-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>currency-exchange-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>2021.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.h2database</groupId>-->
<!-- <artifactId>h2</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<name>eveningstar33/mmv2-${project.artifactId}:${project.version}</name>
<pullPolicy>IF_NOT_PRESENT</pullPolicy>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
Any feedback will be apreciated! Thank you!
CodePudding user response:
try adding the jdbc driver as a dependency on your pom.xml, I don't see it in your dependencies.
It seems like the error is that it's not finding a driver class in your dependencies, so I'd start looking there.
CodePudding user response:
Every container is another host. You can't use loopback address for inter-container communication. The easiest way is to use docker-compose. It will configure dns names, and you will be able to use them for inter-container communication. Like http://config-server:8888 , http://currency-exchange:8000 , jdbc:mysql://docker-mysql:3306/testdb
maybe that answer will be usefull Docker how to send request(curl - get, post) one container to another container
and you should check runtime classpath for db driver, like @jeekiii said.
i have not enought reputation for commenting, but i can edit my answer, if you comment it with any question.