javascript
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)...
聲明:本文來源于MLDN培訓視頻的課堂筆記,寫在這里只是為了方便查閱。
1、概念:Restful 基礎架構
2、具體內容
對于 Rest 基礎架構實現處理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已經有了明確的講解,那么本次為 了清晰可見,創建一套新的微服務架構:部門微服務(Dept)。
如果要想進行 SpringCloud 開發,那么一定要對 SpringBoot 有一定的了解,同時本次也將融合 MyBatis 開發技術實現整體的微 服務的創建處理。
2.1、搭建項目環境
對于現在的項目創建一個:microcloud 的整體父 pom 項目,那么隨后為了方便管理,將創建其三個子模塊:
· microcloud-api 模塊,作為公共的信息導入配置模塊;
· microcloud-provider-dept-8001:作為服務提供者,該提供者負責使用 Mybatis 與數據庫交互;
· microcloud-consumer-80:作為微服務調用的客戶端使用。
1、 創建一個新的 maven 項目:microcloud;
2、 【microcloud】修改 pom.xml 文件,主要追加 springcloud 與 springboot 兩個開發包的依賴關系;
注意:SpringCloud 中針對于依賴包的版本并不是像傳統那樣采用數字的形式定義的,而是使用了一系列的英國的地鐵或城鎮的名字來定義的。
<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>?3、 【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;}@Overridepublic String toString() {return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc+ "]";} }?4、 創建一個 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()) ;?由于在整個微服務里面需要進行負載均衡的操作,所以本次在使用的時候加入了數據庫的名稱信息。
備注:
創建子模塊【microcloud-api】【microcloud-provider-dept-8001】的步驟
在【microcloud】項目右鍵-new-other
?2.2、創建 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 {@Resourceprivate IDeptDAO deptDAO ;@Overridepublic Dept get(long id) {return this.deptDAO.findById(id);}@Overridepublic boolean add(Dept dept) {return this.deptDAO.doCreate(dept);}@Overridepublic 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 {@Resourceprivate IDeptService deptService ;@Testpublic void testGet() {System.out.println(this.deptService.get(1));}@Testpublic void testAdd() {Dept dept = new Dept() ;dept.setDname("測試部-" + System.currentTimeMillis());System.out.println(this.deptService.add(dept)); }@Testpublic 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 {@Resourceprivate 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.com11、 觀察 Rest 服務能否正常提供:
· 調用 get 操作:dept-8001.com:8001/dept/get/1;
· 調用 list 操作:http://dept-8001.com:8001/dept/list;
2.3、客戶端調用微服務
1、 創建一個 Maven 的新的模塊:microcloud-consumer-80;
2、 【microcloud-consumer-80】修改 application.yml 配置文件:
server:port: 803、 【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 {@Beanpublic 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以后控制器就可以調用其他微服務了@Resourceprivate 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.com7、 進行代碼測試調用:
· 調用數據返回:http://client.com/consumer/dept/get?id=1;
· 測試列表數據:http://client.com/consumer/dept/list;
· 測試數據增加:http://client.com/consumer/dept/add?dname=WEB 測試
?
總結
以上是生活随笔為你收集整理的SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Docker搭建Nexus私服
- 下一篇: 安装windows系统时遇到的大坑——鼠