SpringCloud學習筆記(二) 提供者和消費者
建立提供者子模組
建module
選擇新建module
不選擇任何模板直接建立maven模組
最終目錄結構如下
改pom.xml
新建模組後,父工程的pom檔案會自動引入<modole>
標籤,這時需要將<packaging>
標籤移到<module>
標籤之上
之後為子模組新增依賴
<dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
寫yml
在子工程的資原始檔夾下新建yml配置檔案
在application.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 # 資料庫驅動 url: jdbc:mysql://localhost:3306/sp?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 12345 mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: zjc.entities # Entity所在包
配置主啟動類
新建一個類作為主啟動類
程式碼如下
package zjc;
import org.springframework.boot.SpringApplication;
@SpringBootApplication // 標記這個類是主啟動類
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class, args);
}
}
寫業務類
-
mysql建表
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
新建如下model類
package zjc.entities; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable { private Long id; private String serial; }
-
新建返回結果類
這個類一般會單獨提取到一個模組中,步驟後續再說
package zjc.common; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Result { private Integer code; private String message; private Object data; public Result(Integer code, String message) { this(code, message, null); } }
-
書寫dao介面
package zjc.dao; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import zjc.entities.Payment; @Mapper public interface PaymentDao { public int create(Payment payment); public Payment getPaymentById(@Param("id") Long id); }
-
配置Mapper
在資原始檔夾下新建mapper資料夾,以後的Mapper.xml配置檔案都會放到這裡面
Mapper.xml預設配置如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="DAO對應的類"> </mapper>
根據之前寫的dao介面在
<mapper>
標籤中配置響應的sql<insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id"> insert into payment(serial) values(#{serial}) </insert> <!--為了防止駝峰命名衝突,建議使用結果集對映--> <resultMap id="BaseResultMap" type="zjc.entities.Payment"> <!--欄位一一對映--> <id column="id" property="id" jdbcType="BIGINT"/> <id column="serial" property="serial" jdbcType="VARCHAR"/> </resultMap> <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap"> select `id`,`serial` from payment where id=#{id} </select>
-
建立service
根據dao建立相應的service介面
package zjc.service; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Service; import zjc.entities.Payment; public interface PaymentService { public int create(Payment payment); public Payment getPaymentById(@Param("id") Long id); }
以及service介面的實現類
springcloud中推薦使用Resource註解進行注入
package zjc.service.impl; import org.springframework.stereotype.Service; import zjc.dao.PaymentDao; import zjc.entities.Payment; import zjc.service.PaymentService; import javax.annotation.Resource; @Service public class PaymentServiceImpl implements PaymentService { @Resource private PaymentDao paymentDao; @Override public int create(Payment payment) { return paymentDao.create(payment); } @Override public Payment getPaymentById(Long id) { return paymentDao.getPaymentById(id); } }
-
執行專案,訪問網頁獲取結果集
訪問
localhost:8001/payment/get/3
獲取以下結果
對於method為post的請求,瀏覽器對get以外的訪問方式支援較差,因此使用postman、swagger或者apifox等api除錯工具
使用post方式訪問
localhost:8001/payment/create?serial=111
獲取以下結果
{ "code": 200, "message": "資料插入成功", "data": 1 }
提取常用類到子模組
有一些常用的類如果每一個模組都單獨建立無疑會增加程式碼冗餘度
為了增強程式碼複用性可以將這些類單獨提取到一個模組中
-
建立一個子模組
-
配置其pom檔案
<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>
-
將常用的類copy到這個模組中
之後將CommonComponent模組使用mvc:install
打包就可以在其他子模組中引入了
在其它模組中新增CommonComponent的依賴
<dependency>
<groupId>zjc</groupId>
<artifactId>CommonComponent</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
建立消費者子模組
建立多個子模組時可能會出現如下提醒,點選Use Services可以進入Services面板可以更好的處理多個模組
建立新模組後別忘了引入CommonComponent模組的相關依賴
-
建立新模組並編輯其springboot配置檔案
server: port: 80 # 將消費者模組的啟動埠設定為80
-
配置config類
package zjc.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextConfig { @Bean // 注入restTemplate public RestTemplate getRestTemplate() { return new RestTemplate(); } }
-
使用restTemplate訪問restful介面
restTemplate的三個引數
url
,resultMap
,ResponseBean.class
分別到表Rest請求地址、請求引數和HTTP響應轉換的物件型別建立消費者的controller
因為使用者是用瀏覽器訪問,所以Mapping是用@GetMapping註解
package zjc.controller; 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 zjc.common.Result; import zjc.entities.Payment; import javax.annotation.Resource; @Slf4j @RestController public class OrderController { public static final String PAYMENT_URL = "http://localhost:8001"; @Resource private RestTemplate restTemplate; @GetMapping("consumer/payment/create") public Result create(Payment payment) { return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, Result.class); } @GetMapping("/consumer/payment/get/{id}") public Result create(@PathVariable("id") Long id) { return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, Result.class); } }
-
啟動專案並訪問
先啟動提供者再啟動消費者
之後訪問localhost/consumer/payment/get/3
訪問結果如下
再訪問localhost/consumer/payment/create/?serial=safaffyug
訪問結果如下
熱部署
推薦使用jrebel來進行熱部署
在setting中的plugins中安裝jrebel外掛
然後進行啟用
伺服器地址:https://jrebel.qekang.com/{GUID}
啟用會用到伺服器地址
在啟用面板中的Team URL中填入上面獲取到的伺服器地址
之後再填寫自己的郵箱完成啟用
啟用jrebel後進行以下設定
按快捷鍵 Ctrl+Shift+Alt+/ ,選擇 Registry
設定後之後就可以使用jrebel熱部署專案了
點選左下角的jrebel panel
勾選需要熱部署的專案
Jrebel會自動生成rebel.xml配置檔案
執行專案時只需要點選右上角的小火箭即可用jrebel熱部署專案
修改專案後,只需要使用Ctrl + Shift + F9就能實現修改的效果