Spring Cloud雲架構-Restful 基礎架構

it小飛俠的微博發表於2019-03-01

對於 Rest 基礎架構實現處理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已經有了明確的講解,那麼本次為 了清晰可見,建立一套新的微服務架構:部門微服務(Dept)。願意瞭解原始碼的朋友直接求求交流分享技術一七九一七四三三八零

如果要想進行 SpringCloud 開發,那麼一定要對 SpringBoot 有一定的瞭解,同時本次也將融合 MyBatis 開發技術實現整體的微 服務的建立處理。

1、搭建專案環境

對於現在的專案建立一個:microcloud 的整體父 pom 專案,那麼隨後為了方便管理,將建立其三個子模組:

· microcloud-api 模組,作為公共的資訊匯入配置模組;

· microcloud-provider-dept-8001:作為服務提供者,該提供者負責使用 Mybatis 與資料庫互動;

· microcloud-consumer-80:作為微服務呼叫的客戶端使用。

1.1 建立一個新的 maven 專案:microcloud;

1.2 【microcloud】修改 pom.xml 檔案,主要追加 springcloud 與 springboot 兩個開發包的依賴關係;

<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>cn.study</groupId>
    <artifactId>microcloud</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>
    <name>microcloud</name>
    <url>http://maven.apache.org</url>
    <properties>
        <jdk.version>1.8</jdk.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>    <!-- 進行SpringCloud依賴包的匯入處理 -->
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>    <!-- SpringCloud離不開SpringBoot,所以必須要配置此依賴包 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <finalName>microcloud</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${jdk.version}</source><!-- 原始碼使用的開發版本 -->
                    <target>${jdk.version}</target><!-- 需要生成的目標class檔案的編譯版本 -->
                    <encode>${project.build.sourceEncoding}</encode>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
複製程式碼

2、 【microcloud-api】建立一個 api 的公共模組,該模組的主要功能是提供有公共處理類,本次預計建立一個 Dept 資料表,裡面 的欄位:deptno(Long)、dname(String)、loc(儲存的資料庫的名字);

package cn.study.vo;
 
import java.io.Serializable;
 
@SuppressWarnings("serial")
public class Dept implements Serializable {
    private Long deptno ;
    private String dname ;
    private String loc ;
    public Long getDeptno() {
        return deptno;
    }
    public void setDeptno(Long deptno) {
        this.deptno = deptno;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    public String getLoc() {
        return loc;
    }
    public void setLoc(String loc) {
        this.loc = loc;
    }
    @Override
    public String toString() {
        return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc
                + "]";
    }
}
複製程式碼

3、 建立一個 Rest 提供者的【microcloud-provider-dept-8001】專案模組,在這個模組裡面主要定義要使用的資料庫指令碼:

DROP DATABASE IF EXISTS "study8001" ;
CREATE DATABASE study8001 CHARACTER SET UTF8 ;
USE study8001 ;
CREATE TABLE dept (
    deptno        BIGINT        AUTO_INCREMENT ,
    dname        VARCHAR(50) ,
    loc            VARCHAR(50) ,
    CONSTRAINT pk_deptno PRIMARY KEY(deptno)
) ;
INSERT INTO dept(dname,loc) VALUES ('開發部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('財務部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('市場部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('後勤部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('公關部',database()) ;
複製程式碼

由於在整個微服務裡面需要進行負載均衡的操作,所以本次在使用的時候加入了資料庫的名稱資訊。

3、建立 Dept 微服務

所謂的微服務的核心本質就是 JSON 的傳輸,那麼既然現在要求使用 MyBatis 進行資料庫操作,所以應該在專案裡面配置 Druid 資料庫連線池,而後對外進行專案的釋出。

1、 【microcloud-provider-dept-8001】修改 pom.xml 配置檔案,追加相關的依賴程式支援包:

    <dependencies>
       <dependency>
           <groupId>cn.study</groupId>
           <artifactId>microcloud-api</artifactId>
       </dependency>
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>
       <dependency> 
           <groupId>com.alibaba</groupId>
           <artifactId>druid</artifactId>
       </dependency>
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-core</artifactId>
       </dependency>
       <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-jetty</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>springloaded</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-devtools</artifactId>
       </dependency>
   </dependencies>
複製程式碼

2、 【microcloud-provider-dept-8001】建立一個 IDeptDAO 資料操作介面,這個介面裡面將提供有三個資料操作方法:

package cn.study.microcloud.dao;
 
import java.util.List;
 
import org.apache.ibatis.annotations.Mapper;
 
import cn.study.vo.Dept;
@Mapper
public interface IDeptDAO {
    public boolean doCreate(Dept vo) ;
    public Dept findById(Long id) ;
    public List<Dept> findAll() ;
}
複製程式碼

3、 【microcloud-provider-dept-8001】修改 application.yml 配置檔案,追加 mybatis 和服務的相關配置資訊:

server:
  port: 8001
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml    # mybatis配置檔案所在路徑
  type-aliases-package: cn.study.vo            # 定義所有操作類的別名所在包
  mapper-locations:                                     # 所有的mapper對映檔案
  - classpath:mybatis/mapper/**/*.xml
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource    # 配置當前要使用的資料來源的操作型別
    driver-class-name: org.gjt.mm.mysql.Driver      # 配置MySQL的驅動程式類
    url: jdbc:mysql://localhost:3306/study8001           # 資料庫連線地址
    username: root                                  # 資料庫使用者名稱
    password: mysqladmin                            # 資料庫連線密碼
    dbcp2:                                          # 進行資料庫連線池的配置
      min-idle: 5                                   # 資料庫連線池的最小維持連線數    
      initial-size: 5                               # 初始化提供的連線數
      max-total: 5                                  # 最大的連線數
      max-wait-millis: 200                          # 等待連線獲取的最大超時時間
複製程式碼

4、 【microcloud-provider-dept-8001】定義 src/main/resources/mybatis/mybatis.cfg.xml 配置檔案:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration   
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- 進行Mybatis的相應的環境的屬性定義 -->
    <settings>    <!-- 在本專案之中開啟二級快取 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>
複製程式碼

5、 【microcloud-provider-dept-8001】修改 src/main/resources/mybatis/mapper/cn/mldn/Dept.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="cn.study.microcloud.dao.IDeptDAO">
    <select id="findById" resultType="Dept" parameterType="long">
        SELECT deptno,dname,loc FROM dept WHERE deptno=#{deptno} ;
    </select>
    <select id="findAll" resultType="Dept">
        SELECT deptno,dname,loc FROM dept ;
    </select>
    <insert id="doCreate" parameterType="Dept">
        INSERT INTO dept(dname,loc) VALUES (#{dname},database()) ;
    </insert>
</mapper> 
複製程式碼

6、 【microcloud-provider-dept-8001】建立 IDeptService 介面,做業務實現:

package cn.study.microcloud.service;
 
import java.util.List;
 
import cn.study.vo.Dept;
 
public interface IDeptService {
    public Dept get(long id) ;
    public boolean add(Dept dept) ;
    public List<Dept> list() ;
}
package cn.study.microcloud.service.impl;
 
import java.util.List;
 
import javax.annotation.Resource;
 
import org.springframework.stereotype.Service;
 
import cn.study.microcloud.dao.IDeptDAO;
import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;
@Service
public class DeptServiceImpl implements IDeptService {
    @Resource
    private IDeptDAO deptDAO ;
    @Override
    public Dept get(long id) {
        return this.deptDAO.findById(id);
    }
 
    @Override
    public boolean add(Dept dept) {
        return this.deptDAO.doCreate(dept);
    }
 
    @Override
    public List<Dept> list() {
        return this.deptDAO.findAll();
    }
 
}
複製程式碼

7、 【microcloud-provider-dept-8001】定義程式的執行主類

package cn.study.microcloud;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Dept_8001_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args);
    }
}
複製程式碼

8、 【microcloud-provider-dept-8001】進行業務介面測試編寫:

package cn.study.test;
 
import static org.junit.Assert.fail;
 
import javax.annotation.Resource;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
 
import cn.study.microcloud.Dept_8001_StartSpringCloudApplication;
import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;
@SpringBootTest(classes = Dept_8001_StartSpringCloudApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class IDeptServiceTest {
    @Resource
    private IDeptService deptService ;
    @Test
    public void testGet() {
        System.out.println(this.deptService.get(1));
    }
 
    @Test
    public void testAdd() {
        Dept dept = new Dept() ;
        dept.setDname("測試部-" + System.currentTimeMillis());
        System.out.println(this.deptService.add(dept)); 
    }
 
    @Test
    public void testList() {
        System.out.println(this.deptService.list());
    }
 
}
複製程式碼

9、 【microcloud-provider-dept-8001】建立Restful的DeptRest 服務類:

package cn.study.microcloud.rest;
 
import javax.annotation.Resource;
 
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;
 
@RestController
public class DeptRest {
    @Resource
    private IDeptService deptService ;
    @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
    public Object get(@PathVariable("id") long id) {
        return this.deptService.get(id) ;
    }
    @RequestMapping(value="/dept/add",method=RequestMethod.GET)
    public Object add(@RequestBody Dept dept) {
        return this.deptService.add(dept) ;
    }
    @RequestMapping(value="/dept/list",method=RequestMethod.GET)
    public Object list() {
        return this.deptService.list() ;
    }
}
複製程式碼

10、 修改 hosts 配置檔案,追加一個對映路徑(路徑:C:\Windows\System32\drivers\etc\hosts)。

127.0.0.1 dept-8001.com
複製程式碼

11、 觀察 Rest 服務能否正常提供:

· 呼叫 get 操作:dept-8001.com:8001/dept/get/1;

· 呼叫 list 操作:dept-8001.com:8001/dept/list;

2.3、客戶端呼叫微服務

1、 建立一個 Maven 的新的模組:microcloud-consumer-80;

2、 【microcloud-consumer-80】修改 application.yml 配置檔案:

server:
  port: 80
複製程式碼

3、 【microcloud-consumer-80】建立一個 Rest 的配置程式類,主要進行 RestTemplate 類物件建立,這裡很重要,編寫這個類然後在控制器裡面使用@Resource註解注入以後控制器就可以呼叫其他微服務了

package cn.study.microcloud.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
 
@Configuration
public class RestConfig {
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate() ;
    }
}
複製程式碼

4、 【microcloud-consumer-80】建立一個控制器,為了簡化處理,本次不再進行頁面定義了,所有服務結果都使用 Rest 返回;

package cn.study.microcloud.controller;
 
import java.util.List;
 
import javax.annotation.Resource;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
 
import cn.study.vo.Dept;
 
@RestController
public class ConsumerDeptController {
    public static final String DEPT_GET_URL = "http://dept-8001.com:8001/dept/get/";
    public static final String DEPT_LIST_URL = "http://dept-8001.com:8001/dept/list/";
    public static final String DEPT_ADD_URL = "http://dept-8001.com:8001/dept/add";
    //使用@Resource註解注入RestTemplate以後控制器就可以呼叫其他微服務了
    @Resource
    private RestTemplate restTemplate;
    @RequestMapping(value = "/consumer/dept/get")
    public Object getDept(long id) {
        Dept dept = this.restTemplate.getForObject(DEPT_GET_URL + id,
                Dept.class);
        return dept;
    }
    @SuppressWarnings("unchecked")
    @RequestMapping(value = "/consumer/dept/list")
    public Object listDept() {
        List<Dept> allDepts = this.restTemplate.getForObject(DEPT_LIST_URL,
                List.class); 
        return allDepts;
    }
    @RequestMapping(value = "/consumer/dept/add")
    public Object addDept(Dept dept) {
        Boolean flag = this.restTemplate.postForObject(DEPT_ADD_URL, dept,
                Boolean.class);
        return flag;
    }
}
複製程式碼

5、 【microcloud-consumer-80】編寫啟動程式類

package cn.study.microcloud;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Consumer_80_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,
                args);
    }
}

複製程式碼

6、 修改 hosts 配置檔案,追加訪問控制路徑:

127.0.0.1 client.com
複製程式碼

7、 進行程式碼測試呼叫:

呼叫資料返回:client.com/consumer/de…

測試列表資料:client.com/consumer/de…

測試資料增加:client.com/consumer/de… 測試

相關文章