使用maven搭建微服务项目

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 使用maven搭建微服务项目

如图为基于maven搭建的 微服务springboot多模块项目经典模式图

20200401134307494.png

图中,“父模块”聚合了多个子模块,包括api、model、及server模块(当然在实际项目中可以有更多的模块,而且模块的命名可以有所不同)。这三个模块的依赖层级关系是:server依赖model,model依赖api,最终构成了典型的Maven聚合型多模块项目。

SpringBoot项目搭建流程

打开IDEA开发软件,然后选择File->New>New Project命令,即创建新项目。

20200401134307494.png

点击图中的Next按钮,进入Maven多项目模块的命名界面,将坐标命名填写完整。

20200401134307494.png

最后点击inish按钮。进入项目的初始化页面。

20200401134307494.png

指定整个项目资源的编码及项目编译时采用的JDK版本。。配置信息如下:

<!--定义项目整体资源编码及JDk 配置信息为1.8-->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

配置好以后,开始创建各个子模块及每个子模块最基本的一些依赖配置信息,首先是创建子模块api.

20200401134307494.png

依次选择model选项,并填写名称,点击next,最终成功创建。

20200401134307494.png

创建完成可以查看到父级POM文件多了 配置>api

20200401134307494.png

然后我们在api模块的pom文件里加入整个项目都将使用的依赖配置,即Lombok和 Jackson解析依赖。注意:使用Lombok之前你使用的IDEA已经安装了Lombok插件。

<properties>
    <lombok.version>1.16.6</lombok.version>
    <jackson-annotations-version>2.6.5</jackson-annotations-version>
</properties>
<dependencies>
    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
    <!--jackson-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson-annotations-version}</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

配置完成。再按照上面创建api子模块的方式,同样去创建子模块model。 点击项目,选择右键快捷菜单new命令,创建子模块model,并添加api子模块及spring-Mybatis依赖。具体操作如下:

20200401134307494.png

然后子模块model依赖信息配置如下:

    <properties>
        <mybatis-spring-boot.version>1.1.1</mybatis-spring-boot.version>
        <mybatis-pagehelper.version>4.1.2</mybatis-pagehelper.version>
    </properties>
    <dependencies>
        <!--api-->
        <dependency>
            <groupId>com.debug.middleware</groupId>
            <artifactId>api</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--spring-mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot.version}</version>
        </dependency>
    </dependencies>

按照同样的方式创建最后一个模块,即核心的server模块。可以说一个项目或者服务的大部分业务逻辑代码都将在这个模块中完成。最终新建完成的server模块如图所示:

20200401134307494.png

其中在server模块中加入了相关的依赖包括spring Boot依赖,日志log4j,及mysql、druid等最基本的依赖配置。详细信息如下:

<?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>middleware</artifactId>
        <groupId>com.debug.middleware</groupId>
        <version>1.0.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>server</artifactId>
    <packaging>jar</packaging>
    <properties>
        <start-class>com.debug.middleware.server.MainApplication</start-class>
        <spring-boot.version>1.5.6.RELEASE</spring-boot.version>
        <spring-session.version>1.2.0.RELEASE</spring-session.version>
        <mysql.version>8.0.15</mysql.version>
        <druid.version>1.0.16</druid.version>
        <guava.version>19.0</guava.version>
    </properties>
    <!-- 依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!--日志-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <version>1.3.3.RELEASE</version>
        </dependency>
        <!--model-->
        <dependency>
            <groupId>com.debug.middleware</groupId>
            <artifactId>model</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--guava-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--spring-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>log4j-over-slf4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.3.3.RELEASE</version>
        </dependency>
        <!--for test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <!--<scope>test</scope>-->
        </dependency>
    </dependencies>
    <build>
        <finalName>book_middleware_${project.parent.version}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

至此,项目的各个模块已经初步搭建好了。其中,在server模块中指定了整个项目的启动类(也称应用接口)MainApplication。为了能使用Springboot内置容器将整个项目“跑”起来,需要对MainApplication进行改造。改造后的代码如下:

package com.debug.middleware.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @className: 启动类
* @PackageName: com.debug.middleware.server
* @author: youjp
* @create: 2020-03-29 16:00
* @description: TODO   启动类
* @Version: 1.0
*/
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

其中注解@SpringootApplication 用于表示被注解的类为整个应用的入口启动类,到时候只需要单击该左边的运行按钮,即可将整个应用运行起来。

为了将项目最终发步为完整的项目,我们为项目引入application.yml配置文件。

spring:
  profiles:
    active: test
  application:
    name: middleware
  main:
    allow-bean-definition-overriding: true
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  jmx:
    enabled: false
server:
  port: 9031
#logging\u65E5\u5FD7\u914D\u7F6E
# mybatis 配置
# mappers.xml文件配置
mybatis:
  mapper-locations: classpath*:mybatis/mappers/**/**/*.xml
  # PO包路径配置
  type-aliases-package: com.deug.middleware
  # 驼峰命名转换xx_xx xxXx
  configuration:
    map-underscore-to-camel-case: true
logging:
  path: ./logs/${spring.application.name}
  file: middleware
  level:
      org:
        springframework:  info
      com:
          fasterxml:
              jackson:  info
          debug:
              middleware: debug

application-test.yml

spring:
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/db_middleware?serverTimezone=GMT%2b8&characterEncoding=utf-8
    username: root
    password: 123456

日志配置文件:log4j.properties ,放在resource文件下即可

#Console Log
log4j.rootLogger=INFO,console,debug,info,warn,error
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - %5p [%t] --- %c{1}: %m%n
#A1--Print log to Console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.Threshold=INFO
log4j.appender.info.File=${LOG_PATH}/${LOG_FILE}_info.log
log4j.appender.info.DatePattern='.'yyyy-MM-dd
log4j.appender.info.layout = org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.Threshold=ERROR
log4j.appender.error.File=${LOG_PATH}/${LOG_FILE}_error.log
log4j.appender.error.DatePattern='.'yyyy-MM-dd
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.File=${LOG_PATH}/${LOG_FILE}_debug.log
log4j.appender.debug.DatePattern='.'yyyy-MM-dd
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.File=${LOG_PATH}/${LOG_FILE}_warn.log
log4j.appender.warn.DatePattern='.'yyyy-MM-dd
log4j.appender.warn.layout = org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=${LOG_PATTERN}

最终server模块下resources目录的配置文件包含了3个文件。如图所示:

20200401134307494.png

至此整个应用搭建 就完成了。

写个hello World吧

接下来写个hello word,用于检查上一节搭建的项目所发布的接口是否能被正常访问。


1.在server模块下分别创建controller包和entity包。并在controller包下创建BookController 类,在entity包下创建Book类。


BookController类开发的代码如下:

package com.debug.middleware.server.controller;
import com.debug.middleware.server.entity.Book;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @className:
* @PackageName: com.debug.middleware.server.controller
* @author: youjp
* @create: 2020-03-29 22:21
* @description:    TODO 书籍控制器
* @Version: 1.0
*/
@RestController
@RequestMapping("/book")
public class BookController {
    private static final Logger log=LoggerFactory.getLogger(BookController.class);
    @RequestMapping(value = "info",method = RequestMethod.GET)
    public Book info(Integer no, String name){
        Book book=new Book();
        log.info("no:"+no+"name:"+name);
        book.setBookNo(no);
        book.setName(name);
        return book;
    }
}

Book类:

package com.debug.middleware.server.entity;
import lombok.Data;
/**
* @className:
* @PackageName: com.debug.middleware.server.entity
* @author: youjp
* @create: 2020-03-29 22:19
* @description: TODO
* @Version: 1.0
*/
@Data
public class Book {
    /**
     * 书编号
     */
    private Integer bookNo;
    /**
     * 书名
     */
    private String name;
}

点击MainApplication启动项目。然后打开浏览器请求,地址栏输入

http://localhost:9031/book/info?no=1&name=jp

可查看结果:

20200401134307494.png

源码地址:

https://gitee.com/yjp245/middleware_study.git

有兴趣的老爷,可以关注我的公众号【一起收破烂】,回复【006】获取2021最新java面试资料以及简历模型120套哦~


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
XML Java Maven
【Maven技术专题】「实战开发系列」盘点Maven项目中打包需要注意到的那点事儿
【Maven技术专题】「实战开发系列」盘点Maven项目中打包需要注意到的那点事儿
44 0
|
4天前
|
Java Apache Maven
Maven 项目文档
在 `C:/MVN` 目录下创建 Maven 项目 `consumerBanking` 使用命令:`mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false`。为解决 `mvn site` 命令执行时的 `NoClassDefFoundError`
|
12天前
|
Java Maven
idea中maven项目pom文件Could not acquire lock(s)
idea中maven项目pom文件Could not acquire lock(s)
|
1月前
|
Java Maven Spring
【操作宝典】IntelliJ IDEA新建maven项目详细教程
【操作宝典】IntelliJ IDEA新建maven项目详细教程
38 1
|
3天前
|
XML Java 测试技术
Maven 构建 & 项目测试
本文介绍了如何使用Maven构建和测试Java应用。在`C:/MVN/consumerBanking`项目中,`pom.xml`配置了JUnit作为测试框架。执行`mvn clean package`命令进行构建,Maven会清理目标目录,编译源码和测试代码,运行测试用例,最后生成`consumerBanking-1.0-SNAPSHOT.jar`。测试报告位于`surefire-reports`文件夹。添加新Java类`Util.java`到项目后,更新`App.java`以使用`Util`类。
|
5天前
|
Java 项目管理 Maven
【揭秘】Maven聚合与继承:如何轻松实现项目依赖管理?
Maven的聚合和继承是Java开发中重要的概念。聚合允许将多个项目组合成一个构建单元,简化多模块项目的构建过程,提高构建效率。继承则让子项目重用父项目的配置和属性,避免了重复定义,增强了项目的一致性和可维护性。通过聚合和继承,Maven为多模块项目的构建和管理提供了高效且灵活的支持,减少了配置冗余,提升了开发效率。
【揭秘】Maven聚合与继承:如何轻松实现项目依赖管理?
|
6天前
|
Java Maven
Maven 项目文档
学习Maven项目文档创作,借助Doxia引擎将内容转化为通用模型。支持Apt(纯文本)、Xdoc(Maven 1.x格式)、FML(FAQ)和XHTML。
|
7天前
|
Java Apache Maven
Maven 项目文档Maven 项目文档
Maven使用Doxia引擎将多种格式(如Apt、Xdoc、FML和XHTML)转换为通用文档模型。在创建Maven项目文档时,例如在C:/MVN下创建consumerBanking项目,需运行指定的mvn archetype:generate命令。接着,更新pom.xml,确保包含maven-site-plugin和maven-project-info-reports-plugin的最新版本(至少3.3和2.7),以避免NoClassDefFoundError。执行`mvn site`命令生成文档。
|
7天前
|
Java Apache Maven
Maven 项目文档
本教程介绍如何创建 Maven 项目文档。在 C:/MVN 目录下,使用命令 `mvn archetype:generate` 创建 `consumerBanking` 项目。为解决运行 `mvn site` 时的 NoClassDefFoundError,需在 `pom.xml` 中添加并更新 `maven-site-plugin` 至版本 3.3。执行 `mvn site` 后,Maven 生成包括&quot;About&quot;, &quot;Issue Tracking&quot;等报告的文档。成功后,文档位于 `target/site/index.html`。
|
9天前
|
Java Scala Maven
Maven 项目模板
Maven的`archetype`用于创建定制项目结构,即项目模板。通过`mvn archetype:generate`命令能快速生成如Java应用的项目。在命令行中执行该命令后,会列出多个远程模板选项供选择。用户可输入数字或应用过滤器,按Enter选择默认(203:maven-archetype-quickstart)来创建简单Java应用程序。

推荐镜像

更多