学而时习之,不亦说乎
前言
本篇基于maven来构建微服务项目的基本项目架构,我们知道所谓微服务,即会将多个业务划分成多个项目来处理,如何统一的管理这些项目,maven引出了父子项目的结构,可以方便的给我们提供:
- 统一依赖管理
- 控制插件版本
- 聚合项目
构建步骤
一、创建父项目
- 打开IDEA,File-》new-》project,选择maven方式创建,按如下方式填写,进行父项目创建。 作为父项目,可以把创建时自动生成的src文件夹直接删除,按如下方式修改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>
<groupId>com.mingx</groupId>
<artifactId>mingx-cloud-master</artifactId>
<version>1.0-SNAPSHOT</version>
<name>mingx-cloud-master</name>
<!-- 父项目以pom方式打包 -->
<packaging>pom</packaging>
<description>微服务父项目</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring.boot.version>2.6.3</spring.boot.version>
<spring.cloud.dependencies.version>2021.0.1</spring.cloud.dependencies.version>
<spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring-boot主版本管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud主版本管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba主版本管理 -->
<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>
<!-- spring-boot-starter-web主版本管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- spring-boot-starter-test主版本管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>central</id>
<url>https://maven.aliyun.com/repository/central</url>
<name>aliyun</name>
</repository>
</repositories>
</project>
以上pom的修改主要包括:1、父项目修改为以pom的方式打包,2、增加Spring Clould版本、Spring Cloud Alibaba版本等版本控制。
此处需要注意的是:因为Spring Cloud Alibaba是基于Spring Cloud Common的规范实现的,所以在构建项目时,一定要注意Spingboot、Spring Cloud和Spring Cloud Alibaba三者之间的关系,具体的版本关系如下:
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2021.0.4.0* | Spring Cloud 2021.0.4 | 2.6.11 |
2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 |
2021.1 | Spring Cloud 2020.0.1 | 2.4.2 |
笔者使用的是2021.0.1.0 + Spring Cloud 2021.0.1 + 2.6.3的配套版本。
另外在父项目的pom.xml中,需要理解dependencyManagement与dependencies区别:
- dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
- dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)
二、创建子项目
创建具体业务子项目,比如现在我们创建一个最常见的用户微服务项目,为了更清晰的划分具体微服务功能结构, 将业务子项目划分三个更细化的子项目,它们是:
- 提供主体业务实现的微服务mingx-user-web
- 提供pojo类的微服务mingx-user-pojo
- 提供微服务之间调用的微服务mingx-user-api 再将这三个微服务归类到mingx-user父项目服务下,大致结构如下:
|-mingx-cloud-master
|-mingx-user
|-mingx-user-web
|-mingx-user-pojo
|-mingx-user-api
具体步骤:
- 选中父项目,右击-》new-》Module,同样使用maven构建,创建一个mingx-user的父项目,修改器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>mingx-cloud-master</artifactId>
<groupId>com.mingx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<name>mingx-user</name>
<!-- 父项目以pom方式打包 -->
<packaging>pom</packaging>
<description>用户微服务父项目</description>
<artifactId>mingx-user</artifactId>
</project>
- 选中mingx-user父项目,同样右击-》new-》Module,使用maven创建mingx-user-web子项目,修改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>mingx-user</artifactId>
<groupId>com.mingx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mingx-user-web</artifactId>
<groupId>com.boc</groupId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<!-- SpringBoot web相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 同样方式创建minx-user-pojo、mingx-user-api。
三、测试
- 在mingx-user-web的src文件夹下,创建com.mingx.user包,创建springboot启动类文件UserServiceApplication.java. 代码如下:
package com.mingx.user.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zj
* @version 1.0.0
* @ClassName
* @Description
* @createTime 2023/01/24 10:21
*/
@RestController
public class TestController {
@GetMapping("/test")
public String test(){
return "我是用户子项目";
}
}
2.在com.mingx.user下创建controller包,并创建测试类Test.java,代码如下:
package com.mingx.user.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zj
* @version 1.0.0
* @ClassName
* @Description
* @createTime 2023/01/24 10:21
*/
@RestController
public class TestController {
@GetMapping("/test")
public String test(){
return "我是用户子项目";
}
}
- 在resourse文件夹下创建application.yml配置文件,代码如下:
spring:
application:
name: user-service
server:
port: 20010
servlet:
context-path: /USER
- 最终项目结构如下:
- 启动项目,访问http://127.0.0.1:20010/USER/test,返回对应文本即可。
结束语
关于父子项目的构建,基本上已经完成了,如果你对SpringBoot很熟,也使用过Maven的话,本章基本上没有难度,尚未涉及到SpringClould微服务相关内容,按照以上步骤,分分钟搞定。
另外其他两个POJO微服务,以及内部调用微服务,在后续业务深入后再创建,过程与创建mingx-user-web微服务是一致的,略有差别。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情