二. SpringCloud基本Rest微服務工程搭建
阿新 • • 發佈:2021-01-25
#### 1. 父工程構建
##### 1.1 Maven專案搭建
| 環境 | 版本 |
| ----------------- | -------------------- |
| JDK | 1.8 |
| Maven | 3.6+ |
| Maven模板 | maven-archetype-size |
| 刪除父工程src檔案 | |
##### 1.2 父工程pom檔案
> 回顧:
>
> ① Maven中dependencyManagement和dependencies的區別
>
> Maven使用dependencyManagement元素來提供一種管理依賴版本號的方式。通常會在一個組織或者項 目的最頂層的父POM中看到。使用pom.xml中 的dependencyManagement元素能讓所有中引用一個依賴而不用顯示的列出版本號。Maven會沿著父子層次向上找,直到找到一個擁有dependencyManagement元素的專案,然後它就會使用這個元素中指定的版本號。另外如果某個子專案需要使用另外的版本只需要宣告version即可。**注意:dependencyManagement裡只是宣告依賴,並不實現引入,因此子專案要顯示的宣告需要的依賴**。
>
> ② Maven中如何跳過單元測試
>
> 在Idea的Maven側欄點選閃電圖示,使Maven跳過test生命週期即可。
```xml
4.0.0
com.polaris
springcloud2020
1.0-SNAPSHOT
pom
UTF-8
1.8
1.8
4.12
1.2.17
1.16.18
5.1.47
1.1.16
1.3.0
org.springframework.boot
spring-boot-dependencies
2.2.2.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR1
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis.spring.boot.version}
junit
junit
${junit.version}
log4j
log4j
${log4j.version}
org.projectlombok
lombok
${lombok.version}
true
org.springframework.boot
spring-boot-maven-plugin
true
true
```
#### 2. 微服務提供者支付Module模組
> cloud-provider-payment8001
##### 2.1 pom.xml
```xml
com.polaris.springcloud
com.polaris
1.0-SNAPSHOT
4.0.0
cloud-provider-payment8001
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.mybatis.spring.boot
mybatis-spring-boot-starter
com.alibaba
druid-spring-boot-starter
1.1.10
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
```
##### 2.2 yml配置檔案
```yml
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 當前資料來源操作型別
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包
url: jdbc:mysql://mpolaris.top:3306/cloud-test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
mybatis:
mapperLocations: classpath:mapper/*.xml
type-aliases-package: com.polaris.springcloud.entities # 所有Entity別名類所在包
```
##### 2.3 主啟動類
```java
/**
* @Author polaris
* @Date 2021/1/21 1:00
*/
@SpringBootApplication
public class PaymentMain {
public static void main(String[] args) {
SpringApplication.run(PaymentMain.class,args);
}
}
```
##### 2.4 業務類(簡單演示)
**建表**
**entities**
主實體 與 Json封裝體
```java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
private Long id;
private String serial;
}
```
```java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
private Integer code;
private String message;
private T data;
public CommonResult(Integer code, String message){
this(code,message,null);
}
}
```
**dao**
介面PaymentDao與mybatis對映檔案PaymentMapper
```java
@Mapper
public interface PaymentDao {
int save(Payment payment);
Payment getPaymentById(@Param("id") Long id);
}
```
```xml
insert into payment(serial) values(#{serial});
```
**service**
介面與實現類
```java
@Service
public class PaymentServiceImpl implements PaymentService {
@Resource
private PaymentDao paymentDao;
@Override
public int save(Payment payment) {
return paymentDao.save(payment);
}
@Override
public Payment getPaymentById(Long id) {
return paymentDao.getPaymentById(id);
}
}
```
**controller**
```java
@RestController
@Slf4j
@RequestMapping("/payment")
public class PaymentController {
@Resource
private PaymentService paymentService;
@PostMapping("/save")
public CommonResult save(Payment payment) {
int result = paymentService.save(payment);
log.info("===> result: " + result);
if(result > 0) {
return new CommonResult(200,"儲存到資料庫成功",result);
}
return new CommonResult(400,"儲存到資料庫失敗",null);
}
@GetMapping("/get/{id}")
public CommonResult save(@PathVariable("id") Long id) {
Payment paymentById = paymentService.getPaymentById(id);
log.info("===> payment: " + paymentById);
if(paymentById != null) {
return new CommonResult(200,"查詢成功",paymentById);
}
return new CommonResult(400,"查詢失敗",null);
}
}
```
#### 3. 開啟Devtools熱部署
##### 3.1 聚合父類總工程pom.xml新增配置
```xml
org.springframework.boot
spring-boot-maven-plugin
true
true
```
##### 3.2 當前工程新增devtools依賴
```xml
org.springframework.boot
spring-boot-devtools
runtime
true
```
##### 3.3 Idea開啟自動編譯選項
##### 3.4 開啟熱註冊
快捷鍵 ctrl + shift + alt + /,開啟Registry
勾選
重啟Idea,即可測試程式碼時不用手動重啟
> 注意:該功能只能在開發階段使用,上線前一定要關閉
#### 4. 微服務消費者訂單Module模組
> cloud-consumer-order80
##### 4.1 pom.xml
```xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
```
##### 4.2 yml配置檔案
```yml
server:
port: 80
```
##### 4.3 主啟動類
##### 4.4 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
使用restTemplate訪問restful介面非常的簡單粗暴。
- `url ` REST請求地址
- `requestMap` 請求引數
- `ResponseBean.classs` HTTP響應轉換被轉換成的物件型別
**config配置類**
```java
@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
```
##### 4.5 業務類
**entities**
與提供者支付模組一致
**controller**
```java
@RestController
@Slf4j
@RequestMapping("/consumer")
public class OrderController {
@Resource
private RestTemplate restTemplate;
private static final String PAYMENT_URL = "http://localhost:8001";
@GetMapping("/payment/save")
public CommonResult save(Payment payment) {
return restTemplate.postForObject(PAYMENT_URL + "/payment/save",
payment,CommonResult.class);
}
@GetMapping("/payment/get/{id}")
public CommonResult get(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id,
CommonResult.class);
}
}
```
##### 4.6 啟動兩個模組測試
啟動兩個模組沒有出現Run Dashbord的問題
> 在工程目錄下找.idea資料夾下的workspace.xml新增如下程式碼即可
```xml
```
插入成功但是沒有內容的問題
> 解決:支付模組這裡一定要加@RequestBody註解
```java
@PostMapping("/save")
public CommonResult save(@RequestBody Payment payment) {
int result = paymentService.save(payment);
log.info("===> result: " + result);
if(result > 0) {
return new CommonResult(200,"儲存到資料庫成功",result);
}
return new CommonResult(400,"儲存到資料庫失敗",null);
}
```
#### 5. 工程重構 - 公共工程模組
##### 5.1 發現問題 - 系統中有重複程式碼 entities
##### 5.2 新建公共工程 cloud-api-common
> 重複程式碼,公共介面,第三方介面,工具類等都可以放在這裡
**pom.xml**
> Hutool是一個小而全的Java工具類庫,是專案中“util”包友好的替代
```xml
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
cn.hutool
hutool-all
5.1.0
```
##### 5.3 抽取多個模組的共同程式碼
將cloud-api-common安裝到maven倉庫
修改訂單80和支付8001程式碼
- 刪除各自原先的enntities
- 各自新增pom內容
```xml
com.polaris
cloud-api-common
${project.version}
```