1. 程式人生 > 實用技巧 >在 Spring 框架中使用 Dubbo

在 Spring 框架中使用 Dubbo

在 Spring 框架中使用 Dubbo

參考網址

http://dubbo.apache.org/zh-cn/ Dubbo 官網

http://dubbo.apache.org/zh-cn/docs/user/quick-start.html Dubbo 文件

框架組成

spring 5.1.3 + zookeeper 3.6.2 + dubbo 2.6.5;

工具:IDEA 2019.1.2

Dubbo 體系結構

執行流程:

  1. 啟動註冊中心:例如 zookeeper,接受 provider 的註冊,接受 consumer 的訂閱,當 provider 有變化的時候,會主動通知 consumer;

  2. 啟動Provider:provider是服務的提供者,例如提供 com.xian.service.impl.UserServiceImpl 這個服務,它是服務的具體實現,provider 啟動的時候會向 zookeeper 這個註冊中心註冊,表明自己可以提供哪些服務;

  3. 啟動Consumer:consumer 是服務的消費者,例如通過 com.xian.controller.UserController 去呼叫 UserServiceImpl,consumer 啟動的時候會去 zookeeper 這個註冊中心 訂閱自己需要的服務;

  4. 啟動Registry:註冊中心,例如 zookeeper,接受 provider 的註冊,接受 consumer 的訂閱,當 provider 有變化的時候,會主動通知 consumer;

  5. consumer 呼叫 provider 的具體服務,例如 UserController 呼叫 UserServiceImpl,但是具體由那一臺 provider 伺服器提供服務,取決於 負載均衡排程演算法;

  6. Monitor:監控中心,統計服務被呼叫的次數和時間,服務的消費者和提供者會在記憶體中累計呼叫次數和
    呼叫時間,定時每分鐘向監控中心傳送一次統計資料;

建立 Project

選單欄:File| New Project, 建立一個空的 Project

填 Project 的名稱和存放路徑,然後點選右下角的【Finish】:

要在這個 Project 下建立 3 個子 module,最終目錄 module 結構如下:

工程:dubbo-spring-common

建立工程

填專案的座標:GroupId, ArtifactId

工程結構

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xian</groupId>
    <artifactId>dubbo-spring-common</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

</project>

User.java

package com.xian.entity;

import java.io.Serializable;

/**
 * Author: xian
 * Date: 2020-10-19 21:02
 * Description: 描述
 */
public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

UserService.java

package com.xian.service;

import com.xian.entity.User;

/**
 * Author: xian
 * Date: 2020-10-19 21:04
 * Description: 描述
 */
public interface UserService {
    public User findById(int id);
}

工程:dubbo-spring-provider

建立工程

父 module 和父工程全部選【None】:

填專案的座標:GroupId, ArtifactId

https://mvnrepository.com/

工程結構

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xian</groupId>
    <artifactId>dubbo-spring-provider</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>

        <!-- 依賴於 dubbo-spring-common -->
        <dependency>
            <groupId>com.xian</groupId>
            <artifactId>dubbo-spring-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- 依賴於 spring 的 4 個包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- dubbo 的核心包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.5</version>
        </dependency>

        <!-- zookeeper 核心包 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!-- zookeeper 的客戶端實現 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.1</version>
        </dependency>

    </dependencies>
    <properties>
        <spring.version>5.1.3.RELEASE</spring.version>
    </properties>

</project>

provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 配置應用程式的名稱,一般使用專案名 -->
    <dubbo:application name="dubbo-spring-provider"/>

    <!-- 指定註冊中心 zookeeper 的地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <!-- 協議和開放的訪問埠-->
    <dubbo:protocol name="dubbo" port="8888"/>

    <!-- 配置要暴露的埠-->
    <dubbo:service interface="com.xian.service.UserService" ref="userService"/>

    <bean id="userService" class="com.xian.service.impl.UserServiceImpl"/>

</beans>

UserServiceImpl.java

package com.xian.service.impl;

import com.xian.entity.User;
import com.xian.service.UserService;

/**
 * Author: xian
 * Date: 2020-10-19 21:22
 * Description: 描述
 */
public class UserServiceImpl implements UserService {
    @Override
    public User findById(int id) {
        System.out.println("UserServiceImpl.findById");

        User user = new User();
        user.setId(id);
        user.setUsername("xian");
        user.setPassword("123");

        return user;
    }
}

Test.java

這是測試程式

package com.xian;

import javassist.ClassPath;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Scanner;

/**
 * Author: xian
 * Date: 2020-10-19 22:17
 * Description: 描述
 */
public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:provider.xml");

        new Scanner(System.in).next();
    }
}

工程:dubbo-spring-consumer

建立工程

建立 ioc 容器檔案:consumer.xml

建立後的效果:

工程結構

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xian</groupId>
    <artifactId>dubbo-spring-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- 依賴於 dubbo-spring-common -->
        <dependency>
            <groupId>com.xian</groupId>
            <artifactId>dubbo-spring-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- spring 的 4 個核心包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- dubbo 核心包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.5</version>
        </dependency>

        <!-- zookeeper 的客戶端實現 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

    <properties>
        <spring.version>5.1.3.RELEASE</spring.version>
    </properties>

</project>

consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <dubbo:application name="dubbo-spring-consumer"/>

    <dubbo:reference id="userService" interface="com.xian.service.UserService" retries="3" check="false" url="dubbo://127.0.0.1:8888"/>

    <bean class="com.xian.controller.UserController">
        <property name="userService" ref="userService"/>
    </bean>

</beans>

UserController.java

package com.xian.controller;

import com.xian.entity.User;
import com.xian.service.UserService;

/**
 * Author: xian
 * Date: 2020-10-19 22:24
 * Description: 描述
 */
public class UserController {
    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void findUser() {
        User user = userService.findById(1001);
        System.out.println(user);
    }
}

Test.java

package com.xian;

import com.xian.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Scanner;

/**
 * Author: xian
 * Date: 2020-10-19 22:39
 * Description: 描述
 */
public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:consumer.xml");
        UserController userController = ac.getBean(UserController.class);
        userController.findUser();

        new Scanner(System.in).next();
    }
}

啟動 zookeeper

啟動 dubbo-spring-provider

開啟 Test.java (dubbo-spring-provider) ,按 Ctrl + Shift + F10,或者右鍵 【Run 'Test main'】執行此檔案;

啟動 dubbo-spring-consumer

開啟 Test.java (dubbo-spring-consumer) ,按 Ctrl + Shift + F10,或者右鍵 【Run 'Test main'】執行此檔案;

列印

Test.java (dubbo-spring-provider) 列印:

Test.java (dubbo-spring-consumer) 列印:

可以看到,consumer 訪問了 provider 提供的服務;