springboot+dubbo+nacos入門專案

ROAOR1發表於2020-02-27

本文環境:
springboot:2.1.12
apache dubbo:2.7.1
nacos:1.0.0
專案程式碼:
https://github.com/ROAOR1/dubbo-nacos.git

dubbo簡介

在這裡插入圖片描述
節點說明

節點角色說明
Provider暴露服務的服務提供方
Consumer呼叫遠端服務的服務消費方
Registry服務註冊與發現的註冊中心
Monitor統計服務的呼叫次數和呼叫時間的監控中心
Container服務執行容器

呼叫關係說明
1、服務容器負責啟動,載入,執行服務提供者。
2、服務提供者在啟動時,向註冊中心註冊自己提供的服務。
3、服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
4、註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
5、服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
6、服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。

nacos

Nacos是阿里巴巴最新開源的專案,核心定位是“一個更易於幫助構建雲原生應用的動態服務發現、配置和服務管理平臺”,nacos下載:https://github.com/alibaba/nacos/releases
在這裡插入圖片描述
我這裡使用的是1.0.0版本,下載完成之後解壓啟動即可

下面開始建立我們的專案,貼上我的目錄結構
在這裡插入圖片描述
public-api公共介面模組(介面),供服務消費者和服務提供者呼叫。
service-base服務提供者模組(介面實現類),引入了public-api模組
web服務消費者模組(controller),引入了public-api模組
消費者和提供者通過公共介面模組進行rpc遠端呼叫

父工程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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.top</groupId>
    <artifactId>dubbo-nacos</artifactId>
    <version>1.0.0</version>
    <name>dubbo-nacos</name>
    <description>dubbo-nacos</description>
    <packaging>pom</packaging>

    <modules>
        <module>public-api</module>
        <module>service-base</module>
        <module>web</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <dubbo.version>2.7.1</dubbo.version>
        <nacos.version>1.0.0</nacos.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>servlet-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>${nacos.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-nacos</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

建立公共介面模組

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.top</groupId>
        <artifactId>dubbo-nacos</artifactId>
        <version>1.0.0</version>
        <relativePath/>
    </parent>

    <artifactId>public-api</artifactId>
    <version>1.0.0</version>
    <name>public-api</name>
    <description>api公用介面</description>
    <packaging>jar</packaging>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

公共介面模組裡面只有一個介面,沒有配置檔案,打jar包

public interface InfoService {
    String getInfo();
}

建立服務提供者模組

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.top</groupId>
        <artifactId>dubbo-nacos</artifactId>
        <version>1.0.0</version>
        <relativePath/>
    </parent>

    <artifactId>service-base</artifactId>
    <version>1.0.0</version>
    <name>service-base</name>
    <description>base模組</description>
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--引入公共介面模組-->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>public-api</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--duboo+nacos-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.yml配置檔案

server:
  port: 8080
spring:
  application:
    name: service-base
dubbo:
  registry:
    address: nacos://127.0.0.1:8848 #註冊地址
  application:
    name: service-base #應用名
  protocol:
    name: dubbo #dubbo協議
    port: 20880 #協議埠
  scan:
    base-packages: com.top.service.base.impl #掃包範圍
  provider:
    timeout: 30000 #超時時間
service:
  version: 1.0.0 #自定義的版本

介面實現類,該類實現了上面我們在公共介面模組建立的介面

//dubbo提供的Service註解,用於宣告對外暴露服務
@Component
@Service(version = "${service.version}")
public class InfoServiceImpl implements InfoService {

    @Override
    public String getInfo() {
        return "hello,這裡是service-base模組!";
    }
}

建立服務消費者模組

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.top</groupId>
        <artifactId>dubbo-nacos</artifactId>
        <version>1.0.0</version>
        <relativePath/>
    </parent>

    <artifactId>web</artifactId>
    <version>1.0.0</version>
    <name>web</name>
    <description>web模組</description>
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--引入公共介面模組-->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>public-api</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--duboo+nacos-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.yml配置檔案

server:
  port: 8090
spring:
  application:
    name: web
dubbo:
  registry:
    address: nacos://127.0.0.1:8848 #註冊地址
  application:
    name: web #應用名
  consumer:
    timeout: 30000 #超時時間
service:
  version: 1.0.0 #自定義的版本,和消費者模組保持一致

controller,呼叫公共介面模組建立的介面

@RestController
public class InfoController {

	//dubbo提供的Reference註解,用於呼叫遠端服務
    @Reference(version = "${service.version}",check = false)
    private InfoService infoService;

    @RequestMapping("/getInfo")
    public String getInfo(){
        return infoService.getInfo();
    }
}

啟動nacos,啟動服務提供者和服務消費者,呼叫服務消費者的getInfo方法,服務提供者會返回結果
在這裡插入圖片描述
登上nacos控制檯可以看到服務消費者與服務提供者
http:127.0.0.1:8848/nacos/index.html,賬號和密碼都是nacos
在這裡插入圖片描述

相關文章