做爲一個剛剛步入職場的小白,剛進公司就接觸到springCloud,公司全部的項目構建都是基於springCloud部署的,在學校學過相關的概念可是沒實際操做過這種東西,因此想由淺入深學習下。該隨筆會記錄springCoud的構建過程。html
1.選擇 new projectjava
2.選擇Maven,不要勾選提示的內容,Nextmysql
3.寫項目名和選擇存放地址(IDEA版本不一樣此處會有差別,可是基本的步驟都是同樣的),Finishweb
4.建立完父工程後,能夠看到這樣的項目構造,右鍵src,delete刪除掉spring
5.pom.xml文件,引入相關依賴(maven地址:https://mvnrepository.com/)sql
<?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.shiwangeweishenme</groupId> <artifactId>springcloud</artifactId> <version>1.0-SNAPSHOT</version> <!-- 打包方式--> <packaging>pom</packaging> <!-- 版本控制 --> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <swagger.version>2.8.0</swagger.version> <junit.verison>4.12</junit.verison> <lombok.version>1.18.12</lombok.version> <druid.version>1.1.2</druid.version> <springboot.version>2.1.4.RELEASE</springboot.version> <springCloud.version>Greenwich.SR1</springCloud.version> <log4j.version>2.13.3</log4j.version> <logback.version>1.2.3</logback.version> <mysql.version>5.1.6</mysql.version> <mybatis-plus-boot-starter.version>3.0-RC3</mybatis-plus-boot-starter.version> <jetty.version>6.1.25</jetty.version> <devtools.version>2.1.14.RELEASE</devtools.version> <swagger.version>2.8.0</swagger.version> <druid.version>1.1.21</druid.version> <springBoot.version>2.1.4</springBoot.version> </properties> <dependencyManagement> <dependencies> <!-- 1.先導入springCloud依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${springCloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 2.springCloud是基於不少個springBoot服務的,必須導入springBoot依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 3.MySql數據庫鏈接依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 4.數據源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> <scope>import</scope> </dependency> <!-- 5.junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.verison}</version> <scope>import</scope> </dependency> <!-- 6.lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <!-- 7.log4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <!-- 8.個人項目用到了mybatis-plus,沒用到的能夠不用導入 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus-boot-starter.version}</version> </dependency> <dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty</artifactId> <version>${jetty.version}</version> </dependency> <!-- 9.Swagger依賴包,Swagger用於作接口測試,用於生成、描述、調用和可視化 RESTful 風格的 Web 服務 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <!-- 10. swagger配置--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <!-- 11.熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>${devtools.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
1.右鍵項目,New-->Module數據庫
2.一樣,不勾選,點擊Nextapache
3.子項目名字爲springCloud-api,點擊Finish(不一樣版本IDEA這一步可能不一樣)api
4.能夠看到,建立子模塊後,在springCloud父模塊下有個springCloud-api子模塊,子模塊pom.xml的parent指向父類緩存
5.引入子工程依賴
<?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>springcloud</artifactId> <groupId>com.shiwangeweishenme</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springCloud-api</artifactId> <dependencies> <!--假如父工程配置了版本信息,子工程就不須要配置版本信息了--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
6.項目上必然會涉及到鏈接數據庫,先建立數據庫(我用的是Navicat for MySQL)和數據庫表
運行下面的SQL
CREATE TABLE `dept` ( `deptNum` int(11) NOT NULL AUTO_INCREMENT COMMENT '部門編碼', `name` varchar(255) NOT NULL COMMENT '部門名字', PRIMARY KEY (`deptNum`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; NSERT INTO `dept` VALUES ('1', 'java一部'); INSERT INTO `dept` VALUES ('2', 'Java二部');
7.IDEA鏈接MySQL
接着,填寫前三個紅框內的內容,Database是數據庫的名字,填完後點擊Test Connection「」測試鏈接
在這裏,可能會提示時區錯誤的報紅,解決方法見https://www.cnblogs.com/cnsdhzzl/p/13563648.html
8.在子工程的src裏面建立包和實體類,如圖:
上述代碼
package com.feng.springCloud.pojo; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; /** * @author shiwangeweishenme * @date 2021/2/24 * @since JDK1.8 */ @Data @Accessors(chain = true) //啓用鏈式結構 @NoArgsConstructor //給類提供一個無參構造函數 @TableName("dept") public class Dept implements Serializable { /** * 部門編號 */ private int deptNum; /** * 部門名稱 */ private String name; }
9.該服務只提供一個功能,就是提供pojo,接下來將寫第二個子工程--服務提供者
1.建立子工程的步驟和"二"中的一、二、3步驟相同,這裏不反覆闡述了,只不過第3步把工程名字改成springCloud-provider便可
2.pom.xml引入依賴
<?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>springcloud</artifactId> <groupId>com.shiwangeweishenme</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springCloud-provider</artifactId> <dependencies> <!-- 這裏我須要用到api的實體類,因此必須導入api工程的依賴 --> <dependency> <groupId>com.shiwangeweishenme</groupId> <artifactId>springCloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- junit--> <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.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
3.找到src-main目錄,在resource下建立mybatis.mapper目錄,同時,建立mybatis-config.xml(mybati配置文件)
new--->Directory--->寫入「mybatis.mapper」
右鍵new resource--->XML File
mybatis-config.xml的配置信息以下:(具體見:https://mybatis.org/mybatis-3/zh/getting-started.html)
<?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> </configuration>
4.配置application.yml
在resource下new--->FIle
配置代碼
#配置端口號 server: port: 8001 #配置mybatis-plus mybatis-plus: #配置別名 type-aliases-package: com.feng.springCloud.pojo # #mybatis-plus配置路徑 # config-location: classpath:mybatis/mybatis-config.xml #mapper配置路徑 mapper-locations: classpath:mybatis/mapper/*.xml #配置spring spring: application: #給這個工程起個名字,必定要見字知義 name: springCloud-provider-8001 #配置數據源 datasource: #配置數據源 type: com.alibaba.druid.pool.DruidDataSource name: datasource #驅動 driver-class-name: org.gjt.mm.mysql.Driver #數據庫url,數據庫名稱根據本身的定 url: jdbc:mysql://localhost:3306/shiwangeweishenme?useUnicode=true&characterEncoding=UTF-8 username: root password: root #經過別名的方式配置擴展插件,stat日誌用的filter filters: stat #最大鏈接池數量 maxActive: 20 #初始化時創建物理鏈接的個數 initialSize: 5 #獲取鏈接時最大等待時間,單位毫秒 maxWait: 60000 #最小鏈接池數量,已經再也不使用了 minIdle: 1 #每60秒運行一次空閒鏈接回收器 timeBetweenEvictionRunsMillis: 60000 #池中的鏈接空閒30分鐘後被回收,默認值就是30分鐘 minEvictableIdleTimeMillis: 1800000 #驗證鏈接是否可用,使用的SQL語句 validationQuery: select 1 from dual #指明鏈接是否被空閒鏈接回收器(若是有)進行檢驗.若是檢測失敗,則鏈接將被從池中去除 testWhileIdle: true #借出鏈接時不要測試,不然很影響性能 testOnBorrow: false #歸還鏈接時執行validationQuery檢測鏈接是否有效,作了這個配置會下降性能 testOnReturn: false #是否緩存preparedStatement,也就是PSCache;PSCache對支持遊標的數據庫性能提高巨大,好比說oracle。在mysql下建議關閉 poolPreparedStatements: true #要啓用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改成true maxOpenPreparedStatements: -1
若是你使用的是springBoot1.4之前的版本,那麼以後的運行不會出現「testWhileIdle is true, validationQuery not set」的報紅信息,若是是1.4以及以後的版本,可能會出現這個報紅信息,解決方法:
1.把springBoot的版本更換爲1.4以前的;(下策)
2.不用管,不影響使用;(下策,因爲能力因素,我使用了這個辦法)
3.參考這篇博客:http://www.voidcn.com/article/p-dequqelc-bqr.html.
5.寫接口
1)建立com.feng.springCloud包,在這個包下建立controller包、service包和mapper包
2)依據通常的開發步驟,寫mapper接口和實現類、寫service層的接口和實現類,如圖
mapper層接口
package com.feng.springCloud.mapper; import com.feng.springCloud.pojo.Dept; import org.apache.ibatis.annotations.Mapper; /** * @author shiwangeweishenme * @date 2021/2/24 * @since JDK1.8 */ @Mapper public interface DeptMapper { /** * 添加部門 * @return bloolean */ public boolean addDept(Dept dept); /** * 查詢部門 * @return Dept */ public Dept slel(int id); }
在mybatis.mapper的目錄下建立DeptMapper.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="com.feng.springCloud.mapper.DeptMapper"> <!-- 博客園:拾萬個爲何--> <insert id="addDept" parameterType="com.feng.springCloud.pojo.Dept"> insert into shiwangeweishenme (name) values (#{name}) </insert> <select id="slel" parameterType="int" resultType="com.feng.springCloud.pojo.Dept"> select * from dept where deptNum = #{id} </select> </mapper>
service層接口代碼
package com.feng.springCloud.service; import com.feng.springCloud.pojo.Dept; import org.springframework.stereotype.Service; /** * @author 拾萬個爲何 * @date 2021/2/24 * @since JDK1.8 */ @Service public interface DeptService { /** * 添加部門 * @return bloolean */ public boolean addDept(Dept dept); /** * 查詢部門 * @return Dept */ public Dept selectDeptById(int id); }
service層接口實現類代碼
package com.feng.springCloud.service.Impl; import com.feng.springCloud.mapper.DeptMapper; import com.feng.springCloud.pojo.Dept; import com.feng.springCloud.service.DeptService; import org.springframework.beans.factory.annotation.Autowired; /** * @author 拾萬個爲何 * @date 2021/2/24 * @since JDK1.8 */ public class DeptServiceImpl implements DeptService { @Autowired private DeptMapper deptMapper; public boolean addDept(Dept dept) { return deptMapper.addDept(dept); } public Dept selectDeptById(int id) { return deptMapper.slel(id); } }
controller層的代碼
package com.feng.springCloud.controller; import com.feng.springCloud.pojo.Dept; import com.feng.springCloud.service.DeptService; 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.PostMapping; import org.springframework.web.bind.annotation.RestController; /** * @author 拾萬個爲何 * @date 2021/2/24 * @since JDK1.8 */ @RestController public class DeptController { @Autowired private DeptService deptService; @PostMapping(value = "/dept/add") public boolean addDept(Dept dept){ return deptService.addDept(dept); } @GetMapping(value = "/dept/get/{id}") public Dept selectDeptById(@PathVariable("id") int id){ return deptService.selectDeptById(id); } }
最後,寫啓動類(啓動類的建立必須和controller、service、mapper同級)
package com.feng.springCloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author 拾萬個爲何 * @date 2021/2/24 * @since JDK1.8 */ @SpringBootApplication public class DeptProvider { public static void main(String[] args) { SpringApplication.run(DeptProvider.class , args); } }
3)運行
寫完後運行,試一下服務提供者能夠運行不
1.建立子工程的步驟和"二"中的一、二、3步驟相同,這裏不反覆闡述了,工程名字改成springCloud-client便可
2.在這個工程的pom.xml引入依賴包
<?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>springcloud</artifactId> <groupId>com.shiwangeweishenme</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springCloud-client</artifactId> <dependencies> <!-- 實體類 --> <dependency> <groupId>com.shiwangeweishenme</groupId> <artifactId>springCloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- springBoot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
3.在application.yml配置
在resource下new--->File--->application.yml
server:
port: 80
4.寫代碼,在這裏(消費者)須要去調用服務提供者的接口
src-main-java下新建包com.feng.springCloud,在這個目錄下新建controller包和config包。
值得注意的是,消費者是不須要寫servicr層的,就好像咱們使用的手機、電腦不須要本身生產,而是調用服務提供者(生產者)提供給咱們的接口便可。
config配置
package com.feng.springCloud.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author 拾萬個爲何 * @date 2021/2/28 * @since JDK1.8 */ @Configuration public class ShiWanGeWeiShenMeConfigBean { //配置config,用於發現服務 @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
controller代碼
package com.feng.springCloud.controller; import com.feng.springCloud.pojo.Dept; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @author 拾萬個爲何 * @date 2021/2/28 * @since JDK1.8 */ @RestController public class ShiWanGeWeiShenMeController { /** * 使用這個模板來調用服務 */ @Autowired private RestTemplate restTemplate; /** * 你的服務提供者配置的是什麼port,你就按照你的你來 */ private static final String PREFIX = "http://localhost:8001"; @RequestMapping("/client/dept/get/{id}") public Dept get(@PathVariable("id") int id){ //第一個參數是你service須要調用的url,第二個參數是返回值類型 return restTemplate.getForObject(PREFIX + "/dept/get/" + id , Dept.class); } @RequestMapping("/client/dept/add") public ResponseEntity<Boolean> addDept(Dept dept){ //第一個參數是你service須要調用的url,第二個參數是須要傳遞的對象,第三個參數是返回值類型 return restTemplate.postForEntity(PREFIX + "/dept/add" , dept , Boolean.class); } }
啓動類代碼
package com.feng.springCloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; /** * @author 拾萬個爲何 * @date 2021/2/28 * @since JDK1.8 */ @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)//排除自動配置 public class DeptClient { public static void main(String[] args) { SpringApplication.run(DeptClient.class , args); } }
運行,先運行服務者啓動類,再運行消費者啓動類
運行成功,至此,一個普通的微服務項目已經搭建完成,可是在實際的工做中,微服務開發很是繁雜,咱們這樣一個小小的項目每每是其中的冰山一角,你們共同努力好了。
接下來就行進入更深刻的學習!