微服务架构编码构建 环境配置 热部署配置
下面有每一步詳細步驟:
不懂的可以留言評論。
全部筆記
1、約定 > 配置 > 編碼
2、IDEA新建project工作空間
2.1、微服務cloud整體聚合父工程Project
-
父工程步驟
-
New Project
-
聚合總父工程名字
-
Maven選版本 這里選擇自己的就可以了。
-
工程名字
-
字符編碼
-
注解生效激活
-
java 編譯版本 選擇自己的就可以了。
-
File Type過濾 可有可不有
2.2、父工程POM
個人建議: 除了之前說明要統一的版本 其余的東西可以試一下把版本調到現在用的版本上來,cloud學習思想,其他的還是要跟隨主流丫。僅限于個人建議。
<?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.atguigu.springcloud</groupId><artifactId>mscloud03</artifactId><version>1.0-SNAPSHOT</version><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>5.1.47</mysql.version><druid.version>1.1.16</druid.version><mybatis.spring.boot.version>1.3.0</mybatis.spring.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>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.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.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins></build> </project>2.3、Maven工程落地細節復習
2.3.1、Maven中的DependencyManagement和Dependencies
dependencyManagement
Maven 使用dependencyManagement 元素來提供了一種管理依賴版本號的方式。
通常會在一個組織或者項目的最頂層的父POM 中看到dependencyManagement 元素。
使用pom.xml 中的dependencyManagement 元素能讓所有在子項目中引用一個依賴而不用顯式的列出版本號。
Maven 會沿著父子層次向上走,直到找到一個擁有dependencyManagement 元素的項目,然后它就會使用這個
dependencyManagement 元素中指定的版本號。
這樣做的好處就是:如果有多個子項目都引用同一樣依賴,則可以避免在每個使用的子項目里都聲明一個版本號,這樣當想升級或切換到另一個版本時,只需要在頂層父容器里更新,而不需要一個一個子項目的修改 ;另外如果某個子項目需要另外的一個版本,只需要聲明version就可。
- dependencyManagement里只是聲明依賴,并不實現引入,因此子項目需要顯示的聲明需要用的依賴。
- 如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,并且沒有指定具體版本,才會從父項目中繼承該項,并且version和scope都讀取自父pom;
- 如果子項目中指定了版本號,那么會使用子項目中指定的jar版本。
2.3.2、maven中跳過單元測試
-
配置
<build><!-- maven中跳過單元測試 --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skip>true</skip></configuration></plugin></plugins> </build>
- IDEA工具支持(推薦)
3.2.4、父工程創建完成執行mvn:install將父工程發布到倉庫方便子工程繼承
3.3、Rest微服務工程構建
3.3.1、cloud-provider-payment8001 -微服務提供者支付Module模塊
-
建cloud-provider-payment8001
-
改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>mscloud03</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-provider-payment8001</artifactId><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>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.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.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> -
寫YML
server:port: 8001spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包 com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 123456mybatis:mapperLocations: classpath:mapper/*.xmltype-aliases-package: com.atguigu.springcloud.entities # 所有Entity別名類所在包 -
業務類
-
建表SQL
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 -
entities
-
主實體Payment
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;/*** @auther zzyy* @create 2020-01-27 20:01*/ @Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable {private Long id;private String serial; } -
Json封裝體CommonResult
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @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);} }
-
-
dao
-
接口PaymentDao 用注解就可以了。
import com.atguigu.springcloud.entities.Payment; import org.apache.ibatis.annotations.Mapper;/*** @Author: crush* @Date: 2021-05-19 20:44* version 1.0*/ @Mapper public interface PaymentDao {@Insert("insert into payment(serial) values(#{serial})")int create(Payment payment);@Select("select * from payment where id=#{id}")Payment getPaymentById(@Param("id") Long id); } -
service
-
接口PaymentService
public interface PaymentService {public int create(Payment payment);public Payment getPaymentById(@Param("id") Long id);} -
實現類
@Service public class PaymentServiceImpl implements PaymentService {@Resourceprivate PaymentDao paymentDao;@Overridepublic int create(Payment payment){return paymentDao.create(payment);}@Overridepublic Payment getPaymentById(Long id){return paymentDao.getPaymentById(id);} } -
controller
@RestController @Slf4j public class PaymentController {@Resourceprivate PaymentService paymentService;@PostMapping(value = "/payment/create")public CommonResult create(@RequestBody Payment payment){int result = paymentService.create(payment);log.info("*****插入操作返回結果:" + result);if(result > 0){return new CommonResult(200,"插入數據庫成功",result);}else{return new CommonResult(444,"插入數據庫失敗",null);}}@GetMapping(value = "/payment/get/{id}")public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){Payment payment = paymentService.getPaymentById(id);log.info("*****查詢結果:{}",payment);if (payment != null) {return new CommonResult(200,"查詢成功",payment);}else{return new CommonResult(444,"沒有對應記錄,查詢ID: "+id,null);}} } -
測試
- http://localhost:8001/payment/get/31
- postman模擬post
- 運行
- 通過修改idea的workspace.xml的方式來快速打開Run Dashboard窗口 (這個看不到可以搜一下 應該是在view 那個菜單中 )
- 開啟Run DashBoard
- 部分同學可能由于idea版本不同,需要關閉重啟
-
小總結
3.3.2、熱部署Devtools
Adding devtools to your project
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>Adding plugin to your pom.xml
下段配置我們粘貼進聚合父類總工程的pom.xml里
<build><finalName>你自己的工程名字</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins> </build>Enabling automatic build
Update the value of
重啟IDEA
3.3.3、cloud-consumer-order80 —微服務消費者訂單Module模塊
-
建cloud-consumer-order80
-
改POM
<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>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> -
寫YML
server:port: 80 #服務端口 spring:application:name: cloud-order-service #服務名datasource:type: com.alibaba.druid.pool.DruidDataSource #當前數據源操作類型driver-class-name: com.mysql.jdbc.Driver #數據庫驅動包url: jdbc:mysql://localhost:3306/springcloud_2021?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=trueusername: rootpassword: 123456mybatis:mapper-locations:classpath: mapper/*.xmltype-aliases-package:com:crush:springcloud: entities #所有entity別名所在包 -
主啟動
@SpringBootApplication public class MainApp80 {public static void main(String[] args){SpringApplication.run(MainApp80.class,args);} } -
業務類
entities 主實體Payment Json封裝體CommonResult 和服務提供者中都是一樣的。
-
首說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, requestMap, ResponseBean.class)這三個參數分別代表
REST請求地址、請求參數、HTTP響應轉換被轉換成的對象類型。
-
-
config配置類 ApplicationContextConfig
@Configuration public class ApplicationContextConfig {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();} } -
controller
import com.atguigu.springcloud.entities.CommonResult; import com.atguigu.springcloud.entities.Payment; import org.springframework.beans.factory.annotation.Autowired; 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;@RestController public class OrderController {public static final String PaymentSrv_URL = "http://localhost:8001";@Autowiredprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/create") //客戶端用瀏覽器是get請求,但是底層實質發送post調用服務端8001public CommonResult create(@RequestBody 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);} } -
測試
http://localhost/consumer/payment/get/1
http://localhost/consumer/payment/create?serial=aaaaa1
3.3.4、工程重構
觀察問題 系統中有重復部分,重構
新建 cloud-api-commons
POM
<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>5.1.0</version></dependency> </dependencies>entities
-
Payment實體
@Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable {private Long id;private String serial; } -
CommonResult通用封裝類
public class CommonResult<T> {private Integer code;private String message;private T data;public CommonResult(){}public CommonResult(Integer code, String message, T data){this.code = code;this.message = message;this.data = data;}public CommonResult( Integer code,String message) {this( code, message,null);}public CommonResult(T data) {this(200, "操作成功", data);}//setter--getterpublic T getData() {return data;}public void setData(T data) {this.data = data;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;} }
maven命令clean install
訂單80和支付8001分別改造
刪除各自的原先有過的entities文件夾
各自粘貼POM內容
-
80 8001 都是一樣
<dependency><!-- 引入自己定義的api通用包,可以使用Payment支付Entity --><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version> </dependency>
3.4、目前工程樣式圖
自言自語
如果在學習過程中,有什么錯誤,大家也可以一起交流。
有什么不懂,也可以留言評論,歡迎來訪。
總結
以上是生活随笔為你收集整理的微服务架构编码构建 环境配置 热部署配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Cloud各种组件的停更/升级/替换
- 下一篇: Zookeeper 服务注册中心