1、IDEA建立空的父Project
IDEA和Eclipse不同,沒有工作空間的概念,是以我們都是建立一個空的父Project,然後在裡面New Module。
1.1 配置Maven
在建立Project之前,需要先配置我們的maven,要求maven的版本是3.5以上,File——Other Settings——Settings For New Projects:
1.2 建立空父Project
1.2.1 建立一個Project:springcloud2020
File —— New —— Project:JDK要求1.8
1.2.2 配置字元編碼
1.2.3 開啟注解生效
1.2.4 選擇Java編譯版本為1.8
1.2.5 FileType檔案過濾,删除src目錄
因為建立的工程中,會出現字尾為 .idea 和 .iml 的檔案,為了不顯示他們,可以設定FileType,過濾掉他們:
因為父工程不會寫代碼,是以删除src目錄。隻留下一個pom.xml檔案即可。
1.3 父工程的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.zdw.springcloud</groupId>
<artifactId>springcloud2020</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloud-provider-payment8001</module>
</modules>
<!--打包方式-->
<packaging>pom</packaging>
<!--統一管理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>8.0.19</mysql.version>
<druid.version>1.1.16</druid.version>
<spring.boot.version>2.2.2.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR1</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
<druid.spring.boot.starter.version>1.1.1</druid.spring.boot.starter.version>
</properties>
<!--子子產品繼承後,提供作用:鎖定版本+子module不用groupId和version-->
<dependencyManagement>
<dependencies>
<!--springboot 2.2.2-->
<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 Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</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>${spring.cloud.alibaba.version}</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.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.spring.boot.starter.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--MyBatis的依賴-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
<!--第三方maven私服-->
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
dependencyManagement 和 dependency 的差別:
- 1、dependencyManagement 一般隻會出現在父pom檔案中,它可以讓子項目引入依賴隻會,不用顯示的指定版本号,做到統一管理版本的目的。Maven會沿着父子層次向上走,直到找到一個有dependencyManagement 元素的項目,然後就會使用 dependencyManagement 指定的版本号;是以在子項目中可以不顯示的指定版本号。
- 2、如果子項目中沒有聲明依賴,是不會從父項目中繼承下來的;隻有在子項目中聲明了該依賴項,并且沒有指定具體的版本,才會從父項目中繼承下來;
- 3、如果子項目中顯示聲明了版本号,那麼就會使用子項目中指定的版本的依賴。
這樣做的好處就是:如果有多個子項目都引用同一樣的依賴,則可以避免在每個使用的子項目裡都聲明一個版本号,這樣想更新或切換到另一個版本時,隻需在頂層父容器裡更新,而不需要一個一個子項目的修改l;另外如果某個子項目需要另外的一個版本,隻需聲明version版本 。
2、支付子產品payment8001
2.1 五個步驟和sql檔案
1、建Module
2、改pom檔案
3、寫yml檔案
4、寫主啟動類
5、編寫業務邏輯
sql檔案:
CREATE TABLE `payment` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`serial` VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '支付流水号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '支付表' ROW_FORMAT = DYNAMIC;
2.2 建立Module
在剛才建立的SpringCloud2020,右鍵 New —— Module ,JDK選擇1.8,不要使用Maven骨架:
2.3 改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">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.zdw.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8001</artifactId>
<description>支付子產品</description>
<dependencies>
<!--web和actuator基本是綁定到一塊使用的-->
<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>
<!--MyBatis的依賴-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<!--如果沒寫版本,從父層面找,找到了就直接用,全局統一-->
<!--<version>1.1.1</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.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>
2.4 寫yml
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
# 目前資料源操作類型
type: com.alibaba.druid.pool.DruidDataSource
# mysql驅動類
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123
mybatis:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.zdw.springcloud.entities
2.5 編寫主啟動類
package com.zdw.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
2.6 編寫業務代碼
參見4
3、公共子產品common
因為項目中很多地方都要用到一些實體和工具類,如果在每個工程中都要建立肯定是不行的。對于這種公共的東西,我們應該進行抽取,是以可以建立一個cloud-api-common子產品,裡面主要存放的就是相關的實體類和工具類:
建立cloud-api-common子產品的方式和payment8001是一樣的,不要選maven骨架,建立之後,修改pom檔案:
3.1 改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>springcloud2020</artifactId>
<groupId>com.zdw.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-api-common</artifactId>
<description>公共子產品</description>
<dependencies>
<!-- 熱部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 糊塗工具類的依賴 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool-all.version}</version>
</dependency>
</dependencies>
</project>
注意:裡面引入了hutool工具類,它的官網位址是: https://hutool.cn/docs/#/ ,它對很多我們常用的進行了封裝,我們可以直接使用。
3.2 建立實體
3.2.1 編寫Payment
package com.zdw.springcloud.entities;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data //get/set以及toString方法
@NoArgsConstructor //無參構造
@AllArgsConstructor //有參構造
public class Payment implements Serializable {
private Long id;
/**
* 支付流水号
*/
private String serial;
}
3.2.2 編寫統一的傳回結果類
package com.zdw.springcloud.entities;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //get/set以及toString方法
@NoArgsConstructor //無參構造
@AllArgsConstructor //有參構造
public class CommonResult<T> {
private Integer code;
private String message;
private T data;
public CommonResult(Integer code, String message) {
this(code, message, null);
}
}
建立完成之後,我們需要執行install操作,安裝到我們的倉庫裡面,然後其他的子產品才能引入它。
4、編寫支付子產品payment8001的業務代碼
4.1 改pom.xml
因為我們的業務代碼需要用到cloud-api-common的實體類,是以需要在pom.xml檔案中添加cloud-api-common的依賴:
<!--引入公共子產品的依賴-->
<dependency>
<groupId>com.zdw.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4.2 編寫dao
package com.zdw.springcloud.dao;
import com.zdw.springcloud.entities.Payment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface PaymentDao {
/**
* 新增
* @param payment
*/
int create(Payment payment);
/**
* 根據Id查詢
* @param id
*/
Payment getPaymentById(@Param("id") Long id);
}
注意:類上要用 @Mapper 注解修飾,表明這是一個MyBatis的Mapper接口
4.3 編寫service業務層代碼
4.3.1 service業務接口
package com.atguigu.springcloud.service;
import com.atguigu.springcloud.entities.Payment;
public interface PaymentService {
/**
* 新增
*/
int create(Payment payment);
/**
* 根據Id查詢
*/
Payment getPaymentById(Long id);
}
4.3.2 service實作類
package com.atguigu.springcloud.service.impl;
import com.atguigu.springcloud.dao.PaymentDao;
import com.atguigu.springcloud.entities.Payment;
import com.atguigu.springcloud.service.PaymentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PaymentServiceImpl implements PaymentService {
@Autowired
private PaymentDao paymentDao;
/**
* 新增
*/
@Override
public int create(Payment payment) {
return paymentDao.create(payment);
}
/**
* 根據Id查詢
*/
@Override
public Payment getPaymentById(Long id) {
return paymentDao.getPaymentById(id);
}
}
4.4 編寫controller
package com.zdw.springcloud.controller;
import com.zdw.springcloud.entities.CommonResult;
import com.zdw.springcloud.entities.Payment;
import com.zdw.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@RestController
@Slf4j //日志記錄,添加這個注解之後,可以直接使用 log
public class PaymentController {
@Autowired
PaymentService paymentService;
@Value("${server.port}")//從配置檔案中擷取server.port的值
String serverPort;
@PostMapping(value = "payment/create")
public CommonResult create(@RequestBody Payment payment){
int result = paymentService.create(payment);
if(result>0){
return new CommonResult(200,"++插入資料庫成功,serverPort:" + serverPort, result);
}
return new CommonResult(444,"--插入資料庫失敗,serverPort:" + serverPort, null);
}
@GetMapping(value = "payment/get/{id}")
public CommonResult<Payment> get(@PathVariable("id") Long id){
Payment payment = paymentService.getPaymentById(id);
log.info("*****查詢結果: " + payment);
if (payment != null) {
return new CommonResult(200, "查詢成功,serverPort:" + serverPort, payment);
}
return new CommonResult(444, "沒有對應記錄,查詢ID:" + id, null);
}
}
注意:類上使用@RestController注解,相當于 @ResponseBody和@Controller,傳回的json資料;
create(@RequestBody Payment payment) :注意create方法的形參一定要使用@RequestBody進行修飾,否則,資料儲存就會不成功。
4.5 測試
4.5.1 測試create進行新增操作
需要用到PostMan工具類,因為浏覽器位址不支援post請求:
傳回結果成功:
{
"code": 200,
"message": "++插入資料庫成功111,serverPort:8001",
"data": 1
}
4.5.2 測試get方法擷取資料
直接浏覽器通路:http://localhost:8001/payment/get/1 能通路到資料就是成功了,建議使用火狐浏覽器,它能格式化json資料
5、熱部署devtools
為了友善修改代碼,進行調試的友善,我們希望修改之後立馬生效,而不是重新開機工程。Spring為我們提供了熱部署操作。熱部署需要執行以下幾步:
5.1 添加devtools依賴
在需要熱部署的工程的pom檔案中,引入devtools依賴:
<!--熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
之前的工程payment8001在前面以及引入了該依賴。
5.2 添加一個maven插件
在pom檔案中添加下面的maven插件,本次我們可以在父Project的pom檔案中添加,這樣子項目就都可以使用了:
<build>
<fileName>你自己的工程名字<fileName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
5.3 IDEA開啟自動建構
5.4 IDEA開啟熱注冊,更新我們的值
快捷鍵:crtl+shift+alt+/ 選擇第一個 registry
5.5 重新開機IDEA
然後我們修改之後,idea就會自動編譯,能立馬看到結果以及改了。
6、訂單子產品order80
6.1 建立module
6.2 改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">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.zdw.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumer-order80</artifactId>
<description>訂單消費者</description>
<dependencies>
<!--引入公共子產品-->
<dependency>
<groupId>com.zdw.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web和actuator監控 一般要一起-->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>
6.3 寫yml
server:
port: 80
spring:
application:
name: cloud-consumer-order
6.4 主啟動類OrderMain80
package com.zdw.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
}
}
6.5 業務編碼
6.5.1 注冊RestTemplate
RestTemplate提供了多種便捷通路遠端Http服務的方法,是一種簡單便捷的通路RESTful服務的模闆類,是Spring提供的用于通路Rest服務的用戶端模闆工具集;
官方網址:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
package com.zdw.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class OrderConfig {
/**
* 注冊RestTemplate
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
6.5.2 編寫controller
用戶端80是通過遠端調用8001的支付服務的,是以它隻要一個Controller來接受請求就可以了,不需要編寫service和dao等;
package com.zdw.springcloud.controller;
import com.zdw.springcloud.entities.CommonResult;
import com.zdw.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderController {
//支付服務的位址
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
RestTemplate restTemplate;
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
}
@GetMapping("consumer/payment/get/{id}")
public CommonResult<Payment> get(@PathVariable("id") Long id){
log.info("====從80去查詢了8001支付子產品....");
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
6.6 測試
浏覽器通路:http://localhost/consumer/payment/create?serial=zdw19910904 新增資料成功
浏覽器通路:http://localhost/consumer/payment/get/2 可以查詢到剛才新增的資料