проблемы весенней загрузки приложения MySQL при использовании docker compose - PullRequest
0 голосов
/ 24 октября 2018

Сведения об ОС

Mint version 19, 
Code name : Tara,
PackageBase : Ubuntu Bionic
Cinnamon (64-bit)

Я следовал по этому URL-адресу для установки mysql 5.7 и рабочей среды 6.3

Я могу проверить работающую службу mysql

xxxxxxxxx:~$ sudo netstat -nlpt | grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1547/mysqld  

Я также проверил bind-адрес внутри файла: mysqld.cnf в каталоге: / etc / mysql / mysql.conf.d /

bind-address = 127.0.0.1

Iнаписал простое приложение Spring с использованием mysql. Здесь написаны все классы

SpringBootDataJpaExampleApplication

@EnableJpaRepositories(basePackages = "com.springbootdev.examples.repository")
@SpringBootApplication
public class SpringBootDataJpaExampleApplication
{

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDataJpaExampleApplication.class, args);
    }
}

UserController

@RestController
@RequestMapping("/api")
public class UserController {

    @Autowired
    private UserRepository userRepository;


    @GetMapping("/create")
    public List<User> users() {
        User users = new User();
        users.setId(new Long(1));
        users.setName("Sam");
        users.setCountry("Development");

        userRepository.save(users);

        return userRepository.findAll();
    }


    @GetMapping("/users")
    public List<User> findAll()
    {
        return userRepository.findAll();
    }
}

UserRepository

public interface UserRepository extends JpaRepository<User, Long>
{

}

Пользователь

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private String country;
    //getters and setters
}

частичный pom.xml файл.Пожалуйста, убедитесь, что я использую пружинную загрузку 1.5.9 и jdk 1.8

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

application.properties

spring.datasource.url = jdbc:mysql://mysql-standalone:3306/test
spring.datasource.username = testuser
spring.datasource.password = testpassword
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

spring.jpa.hibernate.ddl-auto = create

Dockerfile

FROM openjdk:8
VOLUME /tmp
EXPOSE 8080
ADD target/spring-boot-app.jar spring-boot-app.jar
ENTRYPOINT ["java","-jar","spring-boot-app.jar"]

Когда я запускаю это приложение локально с помощью IDE, оно работает нормально, и я могу получить доступ к http://localhost:8080/api/users/ и http://localhost:8080/api/create/

Я создаю образ из своего приложения с помощью команды

docker build . -t spring-boot-app

Я вижу, что изображение строится.

xxxxxxxxxx:$ docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
spring-boot-app                   latest              069e53a7c389        27 minutes ago      652MB
mysql                             5.7                 1b30b36ae96a        8 days ago          372MB

Теперь я запускаю Command для запуска контейнера mysql

docker run --name mysql-standalone -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=test -e MYSQL_USER=testuser -e MYSQL_PASSWORD=testpassword -d mysql:5.7

Затем я подключаюсь к автономному контейнеру mysql из своего приложения (spring-boot).-app) (ссылка this )

docker run --name spring-boot-app-container --link mysql-standalone:mysql -d spring-boot-app

При этом я вижу, что мое приложение работает нормально из докера, используя http://(docker -container-ip): 8080 / api/ users / и http://(docker -container-ip): 8080 / api / create /

Здесь я хотел, чтобы то же самое работало с docker-compose.Ссылка this для установки docker compose.

xxxxxxxxxx:~$ docker-compose --version
docker-compose version 1.22.0, build f46880fe

Затем я создал файл docker-compose.yml в каталоге моего проекта.

version: '3'

services:
  mysql-docker-container:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=adminpassword
      - MYSQL_DATABASE=test
      - MYSQL_USER=testuser
      - MYSQL_PASSWORD=testpassword
    volumes:
      - /data/mysql
  spring-boot-app-container:
    image: spring-boot-app
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - mysql-docker-container
    ports:
      - 8087:8080
    volumes:
      - /data/spring-boot-app

Изменил одну строку в моем application.properties и закомментированный ранее URL источника данных, как показано ниже.

spring.datasource.url = jdbc:mysql://mysql-docker-container:3306/test
#spring.datasource.url = jdbc:mysql://mysql-standalone:3306/test

Выполнена чистая установка, так что создается новый целевой jar.Я также удалил изображения и контейнеры из докера.

Затем запустили следующую команду:

docker-compose up

Вот что я вижу в журналах

Creating spring-boot-data-jpa-mysql-docker-no-composer-master_mysql-docker-container_1 ... done
Creating spring-boot-data-jpa-mysql-docker-no-composer-master_spring-boot-app-container_1 ... done
Attaching to spring-boot-data-jpa-mysql-docker-no-composer-master_mysql-docker-container_1, spring-boot-data-jpa-mysql-docker-no-composer-master_spring-boot-app-container_1
spring-boot-app-container_1  | 
spring-boot-app-container_1  |   .   ____          _            __ _ _
spring-boot-app-container_1  |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
spring-boot-app-container_1  | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
spring-boot-app-container_1  |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
spring-boot-app-container_1  |   '  |____| .__|_| |_|_| |_\__, | / / / /
spring-boot-app-container_1  |  =========|_|==============|___/=/_/_/_/
spring-boot-app-container_1  |  :: Spring Boot ::        (v1.5.9.RELEASE)
spring-boot-app-container_1  | 
spring-boot-app-container_1  | 2018-10-26 01:24:48.748  INFO 1 --- [           main] .s.e.SpringBootDataJpaExampleApplication : Starting SpringBootDataJpaExampleApplication v0.0.1-SNAPSHOT on 582c035536e4 with PID 1 (/spring-boot-app.jar started by root in /)
spring-boot-app-container_1  | 2018-10-26 01:24:48.752  INFO 1 --- [           main] .s.e.SpringBootDataJpaExampleApplication : No active profile set, falling back to default profiles: default
spring-boot-app-container_1  | 2018-10-26 01:24:48.875  INFO 1 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@28c97a5: startup date [Fri Oct 26 01:24:48 UTC 2018]; root of context hierarchy
spring-boot-app-container_1  | 2018-10-26 01:24:51.022  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
spring-boot-app-container_1  | 2018-10-26 01:24:51.063  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
spring-boot-app-container_1  | 2018-10-26 01:24:51.065  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.23
spring-boot-app-container_1  | 2018-10-26 01:24:51.218  INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
spring-boot-app-container_1  | 2018-10-26 01:24:51.218  INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2399 ms
spring-boot-app-container_1  | 2018-10-26 01:24:51.335  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
spring-boot-app-container_1  | 2018-10-26 01:24:51.340  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
spring-boot-app-container_1  | 2018-10-26 01:24:51.341  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
spring-boot-app-container_1  | 2018-10-26 01:24:51.341  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
spring-boot-app-container_1  | 2018-10-26 01:24:51.341  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
spring-boot-app-container_1  | 2018-10-26 01:24:51.895 ERROR 1 --- [           main] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.
spring-boot-app-container_1  | 
spring-boot-app-container_1  | com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
spring-boot-app-container_1  | 
spring-boot-app-container_1  | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
spring-boot-app-container_1  |  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_181]

Как исправить эту ошибку: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой линии связи

Я вижу много ответов на этом форуме для этого сообщения об ошибке.Перепробовал кучу таких вариантов / ответов, но это не сработало.Нет ответа говорит об этой комбинации (linux + весенняя загрузка + mysql + docker compose)

Примечание: это работало нормально без использования docker-compose.Уже упомянул то же самое в приведенном выше описании. Я делаю какую-либо ошибку в файле свойств docker-compose или в файле свойств приложения?

1 Ответ

0 голосов
/ 28 октября 2018

Я видел много людей, которые писали о добавлении зависимости hikari в pom.xml, если вы используете любую версию с весенней загрузкой <2.0 </p>

  <!-- Spring Boot Data 2.0 includes HikariCP by default -->
  <!-- <dependency>
         <groupId>com.zaxxer</groupId>
         <artifactId>HikariCP</artifactId>
         <version>3.1.0</version>
  </dependency> -->

С этим я подумал об использовании того же приложения, но внес изменения вмой pom.xml как показано ниже

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

Затем я следовал точно так же, как упомянуто в описании проблемы.После этого я увидел более ясную ошибку, как показано ниже:

spring-boot-app-container_1  | 2018-10-27 18:51:47.259  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
spring-boot-app-container_1  | 2018-10-27 18:51:48.464 ERROR 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
spring-boot-app-container_1  | 
spring-boot-app-container_1  | com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
spring-boot-app-container_1  | 
spring-boot-app-container_1  | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Это подтверждает, что spring-boot 2.0 использует источник данных hikari по умолчанию.

Теперь вернемся к тому, как я решилпроблема.Я изменил строку подключения в application.properties , как показано ниже:

spring.datasource.url = jdbc:mysql://mysql-docker-container:3306/test?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false

вместо ранее использованного:

spring.datasource.url = jdbc:mysql://mysql-docker-container:3306/test

Ответ был прост.Ниже изменение работало для меня в Spring-boot 2.0 , а также Spring-boot 1.5.9 : (добавьте это в строку подключения)

? AutoReconnect = true & failOverReadOnly = false & maxReconnects = 10


Некоторые удобные команды:

Как только контейнеры запущены, вы можете проверить IP-адреса контейнеров с помощью команды:

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

=======================================

ОБНОВЛЕНИЕ: некоторая дополнительная полезная информация ...

Ниже УСТАРЕЛО

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Это необходимо заменить на

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Исправить HikariCPПроблема / исключение инициализации пула, пожалуйста, установите для свойства initializationFailTimeout HikariCP значение 0 (ноль) или отрицательное число.

# HikaryCP Properties
spring.datasource.hikari.initialization-fail-timeout=0

Это свойство определяет, будет ли пул быстро разрушаться, если пул не может быть заполнен с помощьюНачальное соединение успешно.Любое положительное число принимается равным количеству миллисекунд, в течение которых делается попытка установить исходное соединение;поток приложения будет заблокирован в течение этого периода.Если соединение не может быть установлено до истечения этого тайм-аута, будет выдано исключение.Этот тайм-аут применяется после периода connectionTimeout.Если значение равно нулю (0), HikariCP попытается получить и проверить соединение.Если соединение получено, но не проходит проверку, будет выдано исключение и пул не будет запущен.Однако, если соединение не может быть получено, пул запустится, но дальнейшие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пропустит любую начальную попытку подключения, и пул будет запущен немедленно при попытке получить подключения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу.По умолчанию: 1

...