Springboot整合springcloud實現分佈式服務 簡單demo 完整示例

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>

 

            <!--&lt;!&ndash;xls&ndash;&gt;-->

            <!--<dependency>-->

                <!--<groupId>org.apache.poi</groupId>-->

                <!--<artifactId>poi</artifactId>-->

                <!--<version>${poi.version}</version>-->

            <!--</dependency>-->

            <!--&lt;!&ndash;xlsx&ndash;&gt;-->

            <!--<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註解防止,在其他位置注入CodClientidea報錯

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;

 

    }

測試效果

啓動消費端

在註冊中心查看

然後訪問

http://127.0.0.1:8004/get

獲取到提供端的數據。

完整的代碼在github上

https://github.com/Wujungang/springcloud-demo01.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章