idea聚合工程搭建過程詳解
注:本篇文章主要參考周陽老師講解的cloud進(jìn)行整理的!
前言
本章主要以order訂單服務(wù)來遠(yuǎn)程調(diào)用payment支付服務(wù)為例,當(dāng)然這里只是簡單的一個遠(yuǎn)程調(diào)用,沒有太復(fù)雜的邏輯,重點(diǎn)是要掌握的是maven的聚合工程搭建,微服務(wù)分模塊的思想,每一個步驟我都會詳細(xì)記錄,并且文章下方還提供了git源碼地址!

最后要實(shí)現(xiàn)的代碼結(jié)構(gòu):

框架:mybatis-plus3.4 + springboot2.2.5 + mysql + springcloud的H版本 + spring-cloud-alibaba2.1.0 + maven
本章并不會用到springcloud相關(guān)組件,只是在父工程聲明了版本!
一、創(chuàng)建父工程
1、New Project

2、聚合父工程的名字

3、指定maven倉庫

4、字符編碼

5、注解生效激活

6、java編譯版本選8

7、File Type過濾

8、父工程POM
約定 > 配置 > 編碼
<?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.gzl.cn</groupId>
<artifactId>mscloud</artifactId><packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloud-provider-payment8001</module>
</modules>
<!-- 統(tǒng)一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis-plus.boot.version>3.4.0</mybatis-plus.boot.version>
</properties>
<!-- 子模塊繼承之后,提供作用:鎖定版本+子modlue不用寫groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<!-- maven中跳過單元測試 -->
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
關(guān)于maven依賴 ${xxx.version}報(bào)錯問題:不用管他,當(dāng)我們有了子項(xiàng)目之后,這里就不報(bào)錯了。

二、Maven工程細(xì)節(jié)復(fù)習(xí)
Maven 使用dependencyManagement 元素來提供了一種管理依賴版本號的方式。
通常會在一個組織或者項(xiàng)目的最頂層的父POM 中看到dependencyManagement 元素。
作用: pom.xml 中的dependencyManagement 元素能讓所有在子項(xiàng)目中引用一個依賴而不用顯式的列出版本號。 Maven 會沿著父子層次向上走,直到找到一個擁有dependencyManagement 元素的項(xiàng)目,然后它就會使用這個dependencyManagement 元素中指定的版本號。
例如在父項(xiàng)目里:xml代碼
<dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies> </dependencyManagement>
然后在子項(xiàng)目里就可以添加mysql-connector時可以不指定版本號,例如:xml代碼
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
好處: 如果有多個子項(xiàng)目都引用同一樣依賴,則可以避免在每個使用的子項(xiàng)目里都聲明一個版本號,這樣當(dāng)想升級或切換到另一個版本時,只需要在頂層父容器里更新,而不需要一個一個子項(xiàng)目的修改 ;另外如果某個子項(xiàng)目需要另外的一個版本,只需要聲明version就可以。
注意:
- dependencyManagement里只是聲明依賴,并不實(shí)現(xiàn)引入,因此子項(xiàng)目需要顯示的聲明需要用的依賴。
- 如果不在子項(xiàng)目中聲明依賴,是不會從父項(xiàng)目中繼承下來的;只有在子項(xiàng)目中寫了該依賴項(xiàng),并且沒有指定具體版本,
- 才會從父項(xiàng)目中繼承該項(xiàng),并且version和scope都讀取自父pom;
- 如果子項(xiàng)目中指定了版本號,那么會使用子項(xiàng)目中指定的jar版本。
- 父工程創(chuàng)建完成執(zhí)行mvn:install將父工程發(fā)布到倉庫方便子工程繼承
三、創(chuàng)建子工程
1、微服務(wù)提供者支付Module模塊
創(chuàng)建過后的項(xiàng)目結(jié)構(gòu):

(1)、刪掉無用的文件

(2)、創(chuàng)建cloud-provider-payment8001項(xiàng)目
右鍵項(xiàng)目-》new-》Module

(3)、改pom
<?xml version="1.0" encoding="UTF-8"?>
<?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>mscloud</artifactId><groupId>com.gzl.cn</groupId><version>1.0-SNAPSHOT</version></parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8001</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
(4)、寫yml
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 當(dāng)前數(shù)據(jù)源操作類型
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2022?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
# mybatis-plus配置打印sql日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
(5)、創(chuàng)建表
CREATE TABLE `payment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `serial` varchar(200) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
(6)、創(chuàng)建啟動類
@SpringBootApplication
@MapperScan("com.gzl.cn.mapper")
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class, args);
}
}(7)、創(chuàng)建實(shí)體類
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("payment")
public class Payment implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "serial")
private String serial;
}
這個類用于作為controller統(tǒng)一接口返回參數(shù)類
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
private Integer code;
private String message;
private T data;
public CommonResult(Integer code, String message) {
this(code, message, null);
}
}
(8)、創(chuàng)建mapper類
@Repository
public interface PaymentMapper extends BaseMapper<Payment> {
}
(9)、創(chuàng)建controller類
@RestController
@Slf4j
public class PaymentController {
@Autowired
private PaymentMapper paymentMapper;
@PostMapping(value = "/payment/create")
public CommonResult create(@RequestBody Payment payment) {
int result = paymentMapper.insert(payment);
log.info("*****插入操作返回結(jié)果:" + result);
if (result > 0) {
return new CommonResult(200, "插入數(shù)據(jù)庫成功", result);
} else {
return new CommonResult(444, "插入數(shù)據(jù)庫失敗", null);
}
}
@GetMapping(value = "/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
Payment payment = paymentMapper.selectById(id);
log.info("*****查詢結(jié)果:{}", payment);
if (payment != null) {
return new CommonResult(200, "查詢成功", payment);
} else {
return new CommonResult(444, "沒有對應(yīng)記錄,查詢ID: " + id, null);
}
}
}
(10)、測試一下兩個接口,確保接口可以正常訪問
2、微服務(wù)消費(fèi)者訂單Module模塊
創(chuàng)建過后的項(xiàng)目結(jié)構(gòu):

(1)、創(chuàng)建cloud-provider-payment8001項(xiàng)目
(2)、改pom(pom跟上個model的pom一樣就行)
(3)、寫yml(跟上面的model也一樣,端口不一樣,名稱不一樣)
server:
port: 80
spring:
application:
name: cloud-order-service(4)、主啟動
(5)、創(chuàng)建配置類,遠(yuǎn)程調(diào)用我用的RestTemplate,所以這個配置類主要就是把RestTemplate注入到容器
@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}(6)、創(chuàng)建實(shí)體類(跟上個服務(wù)的實(shí)體類一模一樣)
(7)、創(chuàng)建controller
@RestController
public class OrderController {
public static final String PaymentSrv_URL = "http://localhost:8001";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/create") //客戶端用瀏覽器是get請求,但是底層實(shí)質(zhì)發(fā)送post調(diào)用服務(wù)端8001
public CommonResult create(Payment payment) {
return restTemplate.postForObject(PaymentSrv_URL + "/payment/create", payment, CommonResult.class);
}
@GetMapping("/consumer/payment/get/{id}")
public CommonResult getPayment(@PathVariable Long id) {
return restTemplate.getForObject(PaymentSrv_URL + "/payment/get/" + id, CommonResult.class, id);
}
}(8)、測試接口
3、創(chuàng)建common共用
(1)、觀察問題,我們可以創(chuàng)建一個model來專門存放公用的 entity 或者 util 等等,甚至共用的pom依賴我們都可以放到這個里面來。
假如要是存放公用的依賴一定要注意點(diǎn),例如mysql的依賴,一旦放到公共的model里面,那也就是意味著只要是web的模塊引入了公用model,就需要配置mysql,否則項(xiàng)目啟動就會報(bào)錯!所以向model存放公用依賴的時候一定要慎重!

(2)、新建cloud-api-common
(3)、創(chuàng)建pom
<dependencies>
<!--實(shí)體類當(dāng)中用到了lombok所以需要引入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
<!--我們用的mybatis-plus所以實(shí)體類會存在一些mybatis-plus的注解,所以需要引入這個-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.4.0</version>
<scope>compile</scope>
</dependency>
</dependencies>(4)、將entity放到這個項(xiàng)目當(dāng)中
(5)、maven命令clean install一下,或者可以在這里clean install

clean install就是打成jar包放到我們的maven本地倉庫當(dāng)中,然后我們別的項(xiàng)目就可以通過坐標(biāo)來引用他。
(6)、刪除各自的原先有過的entity文件夾
(7)、添加依賴,在8001和80的model當(dāng)中添加,讓他引入我們自己的common
<dependency>
<groupId>com.gzl.cn</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
創(chuàng)建過后的項(xiàng)目結(jié)構(gòu):

git源碼:https://gitee.com/gzl_com/spring-cloud.git
到此這篇關(guān)于idea聚合工程搭建詳解的文章就介紹到這了,更多相關(guān)idea聚合工程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java調(diào)用DOS實(shí)現(xiàn)定時關(guān)機(jī)的實(shí)例
Java調(diào)用DOS實(shí)現(xiàn)定時關(guān)機(jī)的實(shí)例,需要的朋友可以參考一下2013-04-04
并行Stream與Spring事務(wù)相遇會發(fā)生什么?
這篇文章主要介紹了并行Stream與Spring事務(wù)相遇會發(fā)生什么?文章主要解決實(shí)戰(zhàn)中的Bug及解決方案和技術(shù)延伸,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
Java純代碼實(shí)現(xiàn)導(dǎo)出pdf合并單元格
這篇文章主要為大家詳細(xì)介紹了Java如何純代碼實(shí)現(xiàn)導(dǎo)出pdf與合并單元格功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
Mybatis控制臺打印Sql語句的實(shí)現(xiàn)代碼
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,下面給大家介紹Mybatis控制臺打印Sql語句的實(shí)現(xiàn)代碼,非常不錯,感興趣的朋友一起看下吧2016-07-07
Spring Cache監(jiān)控配置與使用規(guī)范的建議
這篇文章主要介紹了Spring Cache監(jiān)控配置與使用規(guī)范的建議,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

