微服务实战-父子项目构建(1)

234 阅读4分钟

学而时习之,不亦说乎

前言

本篇基于maven来构建微服务项目的基本项目架构,我们知道所谓微服务,即会将多个业务划分成多个项目来处理,如何统一的管理这些项目,maven引出了父子项目的结构,可以方便的给我们提供:

  1. 统一依赖管理
  2. 控制插件版本
  3. 聚合项目

构建步骤

一、创建父项目

  1. 打开IDEA,File-》new-》project,选择maven方式创建,按如下方式填写,进行父项目创建。 image 作为父项目,可以把创建时自动生成的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 VersionSpring Cloud VersionSpring Boot Version
2021.0.4.0*Spring Cloud 2021.0.42.6.11
2021.0.1.0Spring Cloud 2021.0.12.6.3
2021.1Spring Cloud 2020.0.12.4.2

笔者使用的是2021.0.1.0 + Spring Cloud 2021.0.1 + 2.6.3的配套版本。

另外在父项目的pom.xml中,需要理解dependencyManagement与dependencies区别:

  1. dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
  2. dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)

二、创建子项目

创建具体业务子项目,比如现在我们创建一个最常见的用户微服务项目,为了更清晰的划分具体微服务功能结构, 将业务子项目划分三个更细化的子项目,它们是:

  1. 提供主体业务实现的微服务mingx-user-web
  2. 提供pojo类的微服务mingx-user-pojo
  3. 提供微服务之间调用的微服务mingx-user-api 再将这三个微服务归类到mingx-user父项目服务下,大致结构如下:
|-mingx-cloud-master
    |-mingx-user
      |-mingx-user-web
      |-mingx-user-pojo
      |-mingx-user-api

具体步骤:

  1. 选中父项目,右击-》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>
  1. 选中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>
  1. 同样方式创建minx-user-pojo、mingx-user-api。

三、测试

  1. 在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 "我是用户子项目";
    }
}

  1. 在resourse文件夹下创建application.yml配置文件,代码如下:
spring:
  application:
    name: user-service
server:
  port: 20010
  servlet:
    context-path: /USER


  1. 最终项目结构如下: image
  2. 启动项目,访问http://127.0.0.1:20010/USER/test,返回对应文本即可。

结束语

关于父子项目的构建,基本上已经完成了,如果你对SpringBoot很熟,也使用过Maven的话,本章基本上没有难度,尚未涉及到SpringClould微服务相关内容,按照以上步骤,分分钟搞定。

另外其他两个POJO微服务,以及内部调用微服务,在后续业务深入后再创建,过程与创建mingx-user-web微服务是一致的,略有差别。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情