1. 程式人生 > 其它 >SpringCloud學習筆記(二) 提供者和消費者

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);
	}
}

寫業務類

  1. 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;
    
  2. 建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;
    }
    
  3. 新建返回結果類

    這個類一般會單獨提取到一個模組中,步驟後續再說

    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);
    	}
    }
    
  4. 書寫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);
    }
    
  5. 配置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>
    
  6. 建立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);
    	}
    }
    
  7. 執行專案,訪問網頁獲取結果集

    訪問localhost:8001/payment/get/3

    獲取以下結果

    對於method為post的請求,瀏覽器對get以外的訪問方式支援較差,因此使用postman、swagger或者apifox等api除錯工具

    使用post方式訪問localhost:8001/payment/create?serial=111

    獲取以下結果

    {
        "code": 200,
        "message": "資料插入成功",
        "data": 1
    }
    

提取常用類到子模組

有一些常用的類如果每一個模組都單獨建立無疑會增加程式碼冗餘度

為了增強程式碼複用性可以將這些類單獨提取到一個模組中

  1. 建立一個子模組

  2. 配置其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>
    
  3. 將常用的類copy到這個模組中

之後將CommonComponent模組使用mvc:install打包就可以在其他子模組中引入了

在其它模組中新增CommonComponent的依賴

<dependency>
    <groupId>zjc</groupId>
    <artifactId>CommonComponent</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

建立消費者子模組

建立多個子模組時可能會出現如下提醒,點選Use Services可以進入Services面板可以更好的處理多個模組

建立新模組後別忘了引入CommonComponent模組的相關依賴

  1. 建立新模組並編輯其springboot配置檔案

    server:
    	port: 80 # 將消費者模組的啟動埠設定為80
    
  2. 配置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();
    	}
    }
    
    
  3. 使用restTemplate訪問restful介面

    restTemplate的三個引數urlresultMap, 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);
    	}
    }
    
    
  4. 啟動專案並訪問

    先啟動提供者再啟動消費者

    之後訪問localhost/consumer/payment/get/3

    訪問結果如下

    再訪問localhost/consumer/payment/create/?serial=safaffyug

    訪問結果如下


熱部署

推薦使用jrebel來進行熱部署

在setting中的plugins中安裝jrebel外掛

然後進行啟用

線上GUID地址

伺服器地址:https://jrebel.qekang.com/{GUID}

啟用會用到伺服器地址

在啟用面板中的Team URL中填入上面獲取到的伺服器地址

之後再填寫自己的郵箱完成啟用

啟用jrebel後進行以下設定

按快捷鍵 Ctrl+Shift+Alt+/ ,選擇 Registry

設定後之後就可以使用jrebel熱部署專案了

點選左下角的jrebel panel

勾選需要熱部署的專案

Jrebel會自動生成rebel.xml配置檔案

執行專案時只需要點選右上角的小火箭即可用jrebel熱部署專案

修改專案後,只需要使用Ctrl + Shift + F9就能實現修改的效果