Springboot整合springcloud實現分佈式服務
一:創建一個maven項目作爲父工程,管理依賴版本
<groupId>com.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> |
父工程的pom文件如下
<?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.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
<modules> <module>../register-center</module> <module>../provider</module> <module>../consumer</module> </modules>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<properties> <java.version>1.8</java.version> <guli.version>0.0.1-SNAPSHOT</guli.version> <mybatis-plus.version>3.0.5</mybatis-plus.version> <velocity.version>2.0</velocity.version> <swagger.version>2.7.0</swagger.version> <!--<poi.version>3.9</poi.version>--> </properties>
<dependencies> <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> </dependencies> <dependencyManagement> <dependencies>
<!--<!–xls–>--> <!--<dependency>--> <!--<groupId>org.apache.poi</groupId>--> <!--<artifactId>poi</artifactId>--> <!--<version>${poi.version}</version>--> <!--</dependency>--> <!--<!–xlsx–>--> <!--<dependency>--> <!--<groupId>org.apache.poi</groupId>--> <!--<artifactId>poi-ooxml</artifactId>--> <!--<version>${poi.version}</version>--> <!--</dependency>-->
<!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency>
<!--mybatis-plus 持久層--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency>
<!-- velocity 模板引擎, Mybatis Plus 代碼生成器需要 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>${velocity.version}</version> </dependency>
<!--Spring Cloud--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
</project> |
引入相關得到依賴並引入相關依賴的版本控制,讓子類能有springboot-web的功能,並且引入了dpringvcoud的版本
接着創建註冊中心
註冊中心需要edueka組件,可以選擇創建項目的時候添加,我這裏選擇手動添加
註冊中心需要繼承parent父工程
#服務端口 server.port=8002
#是否將自己註冊到Eureka服務器中,本身是服務器,無需註冊 eureka.client.register-with-eureka=false #是否從Eureka中獲取註冊信息 eureka.client.fetch-registry=false #Eureka客戶端與Eureka服務端進行通信的地址 eureka.client.service-url.defaultZone=http://127.0.0.1:${server.port}/eureka/ |
啓動註冊中心,並訪問
127.0.0.1:8002
註冊中心搭建完成,接下來我們搭建消費端和提供端
首先搭建提供端
提供端的pom文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> </parent>
<groupId>com.springcloud</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>provider</name> <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> </properties>
<dependencies> <!--服務註冊--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>
<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代碼生成器需要 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> </dependency>
<!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency>
<!--lombok用來簡化實體類:需要安裝lombok插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project> |
配置application.properties,在客戶端微服務中添加註冊Eureka服務的配置信息
# 服務端口 server.port=8001 # 服務名 spring.application.name=springcloud-provider
# 環境設置:dev、test、prod spring.profiles.active=dev
# mysql數據庫連接 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://122.51.97.164:3306/jk?setUnicode=true&characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=xxxx
#指定註冊中心地址 eureka.client.service-url.defaultZone=http://127.0.0.1:8002/eureka/ #eureka服務器上獲取的是服務器的ip地址,否則是主機名 eureka.instance.prefer-ip-address=true |
我們這裏只是爲了實現分佈式的效果所以在項目中沒有具體的業務邏輯,知識在提供段返回一個string就可以,不過爲了springboot的自動掃描功能,會掃描項目的db連接,我們在這裏加上了數據庫配置,其實也可以在啓動類中排序db的掃描也可以。
在客戶端微服務啓動類中添加註解
@EnableEurekaClient
我們在這裏的controller中只返回一個string,具體業務的話可以自己實現。我們這裏只展示分佈式的效果。
Autowired private BookService bookService; @GetMapping("/book") public String getAllBookInfo(){ return "123"; } |
Controller中的簡單代碼
啓動服務,在監控中心查看服務
然後創建消費端consumer
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.springcloud</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consumer</name> <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> </properties>
<dependencies>
<!--服務註冊--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<!--mybatis-plus--> <!--<dependency>--> <!--<groupId>com.baomidou</groupId>--> <!--<artifactId>mybatis-plus-boot-starter</artifactId>--> <!--<version>3.0.5</version>--> <!--</dependency>-->
<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代碼生成器需要 --> <!--<dependency>--> <!--<groupId>org.apache.velocity</groupId>--> <!--<artifactId>velocity-engine-core</artifactId>--> <!--</dependency>-->
<!--swagger--> <!--<dependency>--> <!--<groupId>io.springfox</groupId>--> <!--<artifactId>springfox-swagger2</artifactId>--> <!--</dependency>--> <!--<dependency>--> <!--<groupId>io.springfox</groupId>--> <!--<artifactId>springfox-swagger-ui</artifactId>--> <!--</dependency>-->
<!--lombok用來簡化實體類:需要安裝lombok插件--> <!--<dependency>--> <!--<groupId>org.projectlombok</groupId>--> <!--<artifactId>lombok</artifactId>--> <!--</dependency>-->
<!--服務調用--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project> |
在consumer啓動類上加上註解
@EnableFeignClients
消費端的配置文件,其實沒什麼用
# 服務端口 server.port=8004 # 服務名 spring.application.name=springcloud-consumer
# 環境設置:dev、test、prod spring.profiles.active=dev
# mysql數據庫連接 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://122.51.97.164:3306/jk?setUnicode=true&characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=xxxx
#mybatis日誌 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#返回json的全局時間格式 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路徑 mybatis-plus.mapper-locations=classpath:com/online/edu/eduservice/mapper/xml/*.xml
#指定註冊中心地址 eureka.client.service-url.defaultZone=http://127.0.0.1:8002/eureka/ #eureka服務器上獲取的是服務器的ip地址,否則是主機名 eureka.instance.prefer-ip-address=true |
創建包和接口
創建client包
@FeignClient註解用於指定從哪個服務中調用功能 ,名稱與被調用的服務名保持一致。
@GetMapping註解用於對被調用的微服務進行地址映射。
@PathVariable註解一定要指定參數名稱,否則出錯
@RequestParam註解一定要指定參數名稱,否則出錯
@Component註解防止,在其他位置注入CodClient時idea報錯
package com.guli.edu.client;
@FeignClient("guli-vod") @Component public interface VodClient { @DeleteMapping(value = "/admin/vod/video/{videoId}") public R removeVideo(@PathVariable("videoId") String videoId); } |
@Component @FeignClient("xueyuan-vidservice") public interface VidClient { //定義調用的方法 //方法調用路徑 @DeleteMapping("/vidservice/vod/{videoId}") public R removeVideoAliyunId(@PathVariable("videoId") String videoId);
//定義調用刪除多個視頻的方法 @DeleteMapping("/vidservice/vod/removeMoreVideo") public R removeMoreVideoAlihyun(@RequestParam("videoList") List videoList); } |
調用微服務
我們這裏只是爲了演示效果,所以直接在controller裏面演示效果了
@Autowired private BookClient bookClient;
@GetMapping("/get") public String getinfo(){ String allBookInfo = bookClient.getAllBookInfo(); return allBookInfo;
} |
測試效果
啓動消費端
在註冊中心查看
然後訪問
獲取到提供端的數據。
完整的代碼在github上