1. 程式人生 > >二. SpringCloud基本Rest微服務工程搭建

二. SpringCloud基本Rest微服務工程搭建

#### 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} ```