微服务框架(九)Spring Boot 通用Dubbo Parent POM

此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。
  本文为通用Dubbo Maven POM的集成,只需继承Parent POM即可使用

本系列文章中所使用的框架版本为Spring Boot 2.0.3-RELEASE,Spring 5.0.7-RELEASE,Dubbo 2.6.2。

通用Dubbo POM

为了封装项目间通用的依赖及配置,Maven使用POM Reference来解决这个问题,通过定义Parent POM供子类POM继承,即可实现“一处申明,多处使用”的目的。

Maven POM 中可继承元素见POM ReferenceMaven POM元素继承

dubbo通用POM通过以下配置引用

<parent>
    <groupId>com.test</groupId>
    <artifactId>dubbo.common.pom</artifactId>
    <version>${version}</version>
</parent>

自定义的Maven属性

maven参数

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<nexus.url>N/A</nexus.url>

dubbo依赖版本

<dubbo.version>2.6.2</dubbo.version>
<disruptor.version>3.3.6</disruptor.version>
<netty.version>4.0.35.Final</netty.version>
<spring.version>5.0.7.RELEASE</spring.version>
<springboot.version>2.0.3.RELEASE</springboot.version>
<dubbo.springboot.version>0.2.0</dubbo.springboot.version>
<kryo.version>4.0.1</kryo.version>
<kryo-serializers.version>0.42</kryo-serializers.version>

项目的部署配置

<distributionManagement>
	<repository>
		<id>maven-releases</id>
		<name>Nexus Release Repository</name>
		<url>http://${nexus.url}/repository/maven-releases/</url>
	</repository>
	<snapshotRepository>
		<id>maven-snapshots</id>
		<name>Nexus Snapshot Repository</name>
		<url>http://${nexus.url}/repository/maven-snapshots/</url>
	</snapshotRepository>
</distributionManagement>

项目的依赖

dubbo通用的项目依赖,主要包括dubbospring bootmybatis等起步依赖及dubbo相关的性能调优依赖

项目必须继承的依赖

groupIdartifactIdversionscope(默认为compile)description
junitjunit4.12test单元测试
com.alibaba.bootdubbo-spring-boot-starter2.6.2dubbo-spring-boot启动器
org.springframeworkspring-context5.0.7.RELEASEspring上下文
org.springframework.bootspring-boot-starter-log4j22.0.3.RELEASEspring-boot log4j2
com.lmaxdisruptor3.3.6log4j2日志异步化
io.nettynetty-all4.0.35.Finaldubbo集成netty4
org.springframework.bootspring-boot-starter-web2.0.3.RELEASEspring-boot web
org.springframework.bootorg.spring-boot-actuator2.0.3.RELEASEspring-boot actuator
org.springframework.bootspring-boot-starter-test2.0.3.RELEASEspring-boot test
org.springframework.bootspring-boot-starter-aop2.0.3.RELEASEspring-boot aop
<dependencies>
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>

<dependency>
	<groupId>com.alibaba.boot</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>${dubbo.springboot.version}</version>
	<exclusions>
		<exclusion>
			<artifactId>spring-boot-starter-logging</artifactId>
			<groupId>org.springframework.boot</groupId>
		</exclusion>
	</exclusions>
</dependency>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>${spring.version}</version>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
	<version>${springboot.version}</version>
</dependency>

<dependency>
	<groupId>com.lmax</groupId>
	<artifactId>disruptor</artifactId>
	<version>${disruptor.version}</version>
</dependency>

<dependency>
	<groupId>io.netty</groupId>
	<artifactId>netty-all</artifactId>
	<version>${netty.version}</version>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<version>${springboot.version}</version>
	<exclusions>
		<exclusion>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<groupId>org.springframework.boot</groupId>
		</exclusion>
	</exclusions>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-actuator</artifactId>
	<version>${springboot.version}</version>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<version>${springboot.version}</version>
	<scope>test</scope>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
	<version>${springboot.version}</version>
</dependency>

项目可选继承的依赖

groupIdartifactIdversionscope(默认为compile)description
org.mybatis.spring.bootmybatis-spring-boot-starter1.3.2springboot集成mybatis
org.springframework.bootspring-boot-starter-jdbc2.0.3.RELEASEspring-boot jdbc
org.springframework.bootspring-boot-autoconfigure2.0.3.RELEASEspring-boot autoconfigure
mysqlmysql-connector-java5.1.24mysql
com.github.pagehelperpagehelper-spring-boot-starter1.2.5分页
com.alibabadruid-spring-boot-starter1.1.10springboot集成druid
com.esotericsoftwarekryo4.0.1kryo实现
de.javakaffeekryo-serializers0.42kryo序列化
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>${mybatis.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>spring-boot-starter-logging</artifactId>
					<groupId>org.springframework.boot</groupId>
				</exclusion>
				<exclusion>
					<artifactId>spring-boot-starter</artifactId>
					<groupId>org.springframework.boot</groupId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
			<version>${springboot.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>spring-boot-starter</artifactId>
					<groupId>org.springframework.boot</groupId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
			<version>${springboot.version}</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>

		<!-- 分页插件 -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>${pagehelper.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>spring-boot-starter</artifactId>
					<groupId>org.springframework.boot</groupId>
				</exclusion>
			</exclusions>
		</dependency>

		<!-- alibaba的druid数据库连接池 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>${druid.version}</version>
		</dependency>

		<!-- kyro序列化依赖 -->
		<dependency>
			<groupId>com.esotericsoftware</groupId>
			<artifactId>kryo</artifactId>
			<version>${kryo.version}</version>
		</dependency>
		<dependency>
			<groupId>de.javakaffee</groupId>
			<artifactId>kryo-serializers</artifactId>
			<version>${kryo-serializers.version}</version>
		</dependency>
	</dependencies>
</dependencyManagement>

build构建属性

包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

项目输出目录配置

<resources>
	<!--recources文件夹下的所有文件都打进jar包 -->
	<resource>
		<targetPath>${project.build.directory}/classes</targetPath>
		<directory>src/main/resources</directory>
		<filtering>true</filtering>
		<includes>
			<include>**/*.xml</include>
			<include>**/*.properties</include>
			<include>**/*.json</include>
			<include>**/*.yml</include>
			<include>META-INF/dubbo/*</include>
		</includes>
	</resource>

	<!-- 满足docker-maven-plugin的约定:将 dockerfile文件拷贝到docker目录下 -->
	<resource>
		<targetPath>${project.build.directory}/docker</targetPath>
		<directory>src/main/resources/docker</directory>
		<filtering>true</filtering>
		<includes>
			<include>Dockerfile</include>
			<include>.dockerignore</include>
		</includes>
	</resource>
</resources>

插件管理配置

<pluginManagement><!-- lock down plugins versions to avoid using Maven 
		defaults (may be moved to parent pom) -->
	<plugins>
		<plugin>
			<artifactId>maven-clean-plugin</artifactId>
			<version>3.0.0</version>
		</plugin>
		<plugin>
			<artifactId>maven-resources-plugin</artifactId>
			<version>3.0.2</version>
		</plugin>
		<plugin>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.7.0</version>
		</plugin>
		<plugin>
			<artifactId>maven-surefire-plugin</artifactId>
			<version>2.20.1</version>
		</plugin>
		<plugin>
			<artifactId>maven-install-plugin</artifactId>
			<version>2.5.2</version>
		</plugin>
		<plugin>
			<artifactId>maven-deploy-plugin</artifactId>
			<version>2.8.2</version>
		</plugin>
	</plugins>
</pluginManagement>

JAVA源码插件

<plugin>
	<artifactId>maven-source-plugin</artifactId>
	<version>2.3</version>
	<executions>
		<execution>
			<id>attach-source</id>
			<goals>
				<goal>jar</goal>
			</goals>
		</execution>
	</executions>
</plugin>

JAVA文档插件

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-javadoc-plugin</artifactId>
	<version>2.9.1</version>
	<configuration>
		<charset>UTF-8</charset>
		<encoding>UTF-8</encoding>
		<docencoding>UTF-8</docencoding>
		<includePom>true</includePom>
		<excludeResources>true</excludeResources>
		<attach>true</attach>
	</configuration>
	<executions>
		<execution>
			<id>attach-javadocs</id>
			<goals>
				<goal>jar</goal>
			</goals>
			<configuration>
				<encoding>UTF-8</encoding>
				<additionalparam>${javadoc.opts}</additionalparam>
			</configuration>
		</execution>
	</executions>
</plugin>

jar生成插件

继承POM后需在properties中定义springboot.starter变量,值为spring-boot启动类路径

<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<classesDirectory>target/classes/</classesDirectory>
		<archive>
			<manifest>
				<mainClass>${springboot.starter}</mainClass>
				<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
				<useUniqueVersions>false</useUniqueVersions>
				<addClasspath>true</addClasspath>
				<classpathPrefix>lib/</classpathPrefix>
			</manifest>
			<manifestEntries>
				<Class-Path>.</Class-Path>
			</manifestEntries>
		</archive>
	</configuration>
</plugin>

项目依赖拷贝插件

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-dependency-plugin</artifactId>
	<executions>
		<execution>
			<id>copy-dependencies</id>
			<phase>package</phase>
			<goals>
				<goal>copy-dependencies</goal>
			</goals>
			<configuration>
				<type>jar</type>
				<includeTypes>jar</includeTypes>
				<useUniqueVersions>false</useUniqueVersions>
				<outputDirectory> ${project.build.directory}/lib </outputDirectory>
			</configuration>
		</execution>
	</executions>
</plugin>

Docker镜像化插件

使用方法详见Docker镜像化Dubbo微服务,详细信息可见官方文档

<plugin>
	<groupId>com.spotify</groupId>
	<artifactId>docker-maven-plugin</artifactId>
	<version>1.0.0</version>
	<configuration>
		<imageName>${registry.url}dubbo/${project.artifactId}</imageName>
		<dockerDirectory>src/main/resources/docker</dockerDirectory>
		<imageTags>
			<imageTag>${image.tag}</imageTag>
			<imageTag>latest</imageTag>
		</imageTags>
		<resources>
			<resource>
				<targetPath>/</targetPath>
				<directory>${project.build.directory}</directory>
				<includes>
					<include>${project.build.finalName}.jar</include>
					<include>lib/*.jar</include>
				</includes>
			</resource>
		</resources>
	</configuration>
</plugin>

参考资料:

  1. POM Reference
  2. Maven POM元素继承
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值