предисловие
Что касается извлечения общедоступных модулей зависимостей микросервисов, унифицированного управления версиями, унифицированной конфигурации частного сервера и т. д., я пробовал различные решения, организовывал и оптимизировал много раз и делился ими.
Ожидаемый эффект:
1. Единое трехстороннее управление версиями библиотек
2. Единая конфигурация приватного сервера (загрузка, загрузка, загрузка плагина)
3, унифицированная конфигурация управления зависимостями версии springcloud springalibaba springboot
текст
Создайте общий проект maven отдельно и сгенерируйте основной модуль внутри.
Есть только два ядра, одно из которых является самым внешним общим родителем (имя pom artifacId), а другое — внутренним общим
диаграмма отношений
общий проект
Общие функции:
- общественный класс, общественный класс полезности
- общедоступные сторонние зависимости
- Примечание: обычная упаковка-банка
Общие родительские функции:
- Единое управление версиями
- springboot springcloud управление версиями springalibaba
- Конфигурация частного сервера
- Примечание: упаковка общего родителя-pom
Внешний файл 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 http://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.2.8.RELEASE</version>
</parent>
<groupId>com.xiaoxi</groupId>
<artifactId>common-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<description>common-parent</description>
<packaging>pom</packaging>
<modules><module>core</module></modules>
<!-- 统一版本管理 -->
<properties>
<mybatis-plus.version>3.4.0</mybatis-plus.version>
<dynamic-datasource.version>3.3.2</dynamic-datasource.version>
<p6sy.version>3.8.7</p6sy.version>
<mysql-connector.version>8.0.13</mysql-connector.version>
<knife4j.version>2.0.7</knife4j.version>
<lombok.version>1.18.12</lombok.version>
<hutool.version>5.3.8</hutool.version>
<java.version>1.8</java.version>
<seata.version>1.4.0</seata.version>
<nacos.version>2.2.1.RELEASE</nacos.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<!-- springcloud springAlibaba 依赖版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<type>pom</type>
<version>${spring-cloud.version}</version>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${seata.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--拉取仓库-->
<repositories>
<repository>
<id>maven_xiaoxi</id>
<url>http://192.168.148.237:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!--插件拉取仓库-->
<pluginRepositories>
<pluginRepository>
<id>maven_xiaoxi</id>
<url>http://192.168.148.237:8081/repository/maven-public/</url>
<releases>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<!--发布仓库-->
<distributionManagement>
<repository>
<id>maven_xiaoxi</id>
<url>http://192.168.148.237:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>maven_xiaoxi</id>
<url>http://192.168.148.237:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>common-parent</artifactId>
<groupId>com.xiaoxi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<artifactId>common</artifactId>
<!-- 公共依赖 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic-datasource.version}</version>
</dependency>
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>${p6sy.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
</exclusions>
<version>${nacos.version}</version>
</dependency>
<!-- seata -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${seata.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
</project>
выпуск
Для каждого выпуска лучше сначала очистить его, а затем развернуть в самом внешнем слое maven. (потому что это отношения родитель-потомок)
Микросервисы
xxxx-interface
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.xiaoxi</groupId>
<artifactId>common-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<version>1.0-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<artifactId>test1-interface</artifactId>
<dependencies>
<dependency>
<groupId>com.xiaoxi</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>maven_xiaoxi</id>
<url>http://192.168.148.237:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</project>
Как вы можете видеть, интерфейс здесь наследует общий-родительский, потому что он находится на частном сервере, поэтому вам также необходимо настроить репозиторий извлечения частного сервера в любом случае. Но преимущество в том, что вы наследуете общий родитель, а это означает, что конфигурация загрузки, загрузки плагина и выпуска есть, поэтому вам не нужно настраивать и выпускать.
xxxx-service
<?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>com.xiaoxi</groupId>
<artifactId>common-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>test1-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test1-service</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>test1-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!-- 通过maven的profile来 动态修改spring的profile 达到多套配置切换使用的效果 -->
<profiles>
<profile>
<!-- 本地环境 -->
<id>local</id>
<properties>
<profiles.active>local</profiles.active>
<skipDocker>true</skipDocker>
<dockerHost></dockerHost>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 开发环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
<skipDocker>true</skipDocker>
<dockerHost>http://192.168.148.236:2375</dockerHost>
</properties>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
<skipDocker>false</skipDocker>
<dockerHost>http://192.168.148.235:2375</dockerHost>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
<skipDocker>false</skipDocker>
<dockerHost>http://xxxx:2375</dockerHost>
</properties>
</profile>
</profiles>
<!-- maven插件发布到docker中 -->
<build>
<!-- 引用我们的项目名字 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>maven_xiaoxi</id>
<url>http://192.168.148.237:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</project>
сервис, сейчас намного круче. Нужно только наследовать общий родитель, а также тянуть частный сервер, вы можете сохранить много конфигурации. Если вы зависимы, вам нужны только зависимости между модулями микросервиса и их собственный интерфейс.
Зависимости:
xxxx-service -> xxxx-interface -> common
Отношения по наследству это
xxx-interface -> common-parent
xxx-service -> common-parent
О реализации сервиса желающим кастомной версии
В процессе сортировки и оптимизации обнаружилась проблема, а именно:
Версия Seata, настроенная в наших общедоступных зависимостях, — 1.4.0, а окончательная версия в службе — 1.1.0.
Почему это? Это как-то связано с порядком загрузки зависимостей maven.
Есть хорошая статья, поделитесь
Вот также краткое описание:
Мы грубо делим зависимости на эти уровни:
- этот уровень
Прямая зависимость собственного проекта
- начальство
Родительское наследование собственного проекта
- Нижний уровень
Зависимость зависимых библиотек Зависимость сторонних библиотек, от которых зависят их собственные проекты
- Управление версиями
Управление версиями собственного проекта
Порядок приоритета следующий:
Этот уровень > Управление версиями этого уровня > Высшее > Управление высшей версией > Подчиненный (без управления подчиненными версиями)
И по сравнению с нашей общедоступной библиотекой зависимостей:
Приоритет версии общего родителя, унаследованного нашим родителем, выше, чем версия зависимого стороннего общего
То есть общий — 1.4.0, а родительский — 1.1.0 (springalibaba), в настоящее время 1.1.0 будет иметь наивысший приоритет.
Ниже картинка
Так что же делать в этой ситуации?
Мы знаем, что если есть несколько одинаковых зависимостей maven, последняя перезапишет предыдущую конфигурацию.
В нашем общем родительском элементе dependencyManagement был определен springalibaba, затем мы можем повторно указать версию Seata как 1.4.0 ниже, так что для общего родителя окончательная версия Seata фактически будет 1.4.0.
Порядок загрузки такой:
- оказалось:
Этот уровень (нет) > управление версиями этого уровня (нет) > верхний уровень (нет) > управление версиями верхнего уровня (общий-родительский 1.1.0) > нижний уровень (общий 1.4.0) (без управления версиями нижнего уровня)
- В настоящее время:
Этот уровень (нет) > управление версиями этого уровня (нет) > верхний уровень (нет) > управление версиями верхнего уровня (общий-родительский 1.4.0) > нижний уровень (общий 1.4.0)
Об авторе
Автор — программист, который любит учиться, открывать исходный код, делиться, распространять положительную энергию, любит играть в баскетбол и имеет много волос. -
Приглашаем всех подписаться, лайкнуть, прокомментировать и обменяться!
Краткая книга:1569 из 234 из 234 на Brief.com/u/…
гитхаб:github.com/fly7632785
Самородки:Наггетс Талант /user/993614…