1. 程式人生 > >Dubbo呼叫示例

Dubbo呼叫示例

用dubbo做一個“hello world”。

此次demo十分簡單,旨在對Dubbo有個整體上的初步瞭解。服務提供者(程式)和服務消費者(程式)雖然都是執行在同個伺服器上(本地tomcat),但是呼叫是通過Dubbo的RPC。

註冊中心是redis,部署在本地虛擬機器,地址為192.168.1.66:6379(在配置檔案中需要用到)。最終達到效果是服務消費者(Consumer)呼叫服務提供者(Provider)的sayHello()方法在控制檯輸出“Hello world”。

需要做的事情:

  • 在pom.xml 當中引入Dubbo 依懶
  • 編寫服務介面類
  • 編寫服務實現類
  • 編寫服務提供者 xml 配置
  • 編寫服務消費者 xml 配置
  • 啟動服務提供者
  • 編寫並執行遠端服務呼叫

pom.xml

	<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.5.3</version>
    </dependency>

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.2.0</version>
    </dependency>

服務介面DemoService

public interface DemoService {
    String sayHello(String str);
}

服務介面實現DemoService

public class DemoServiceImpl implements DemoService {
    public String sayHello(String str) {
        return "Hello " + str;
    }
}

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://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://code.alibabatech.com/schema/dubbo
                           http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <dubbo:application name="demo-consumer"/>
    <dubbo:registry protocol="redis" address="192.168.1.66:6379" check="true"/>
    <dubbo:consumer timeout="5000" retries="2"
                    group="snowman"
                    version="1.0.0"/>
    <dubbo:reference
            timeout="3000" retries="1"
            id="demoService"
            version="*"
            interface="com.snowman.service.DemoService"/>
</beans>

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://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://code.alibabatech.com/schema/dubbo
                           http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <dubbo:application name="demo-provider"/>
    <dubbo:registry protocol="redis" address="192.168.1.66:6379" check="true"/>
    <dubbo:protocol name="dubbo" port="20880"/>
    <dubbo:provider group="snowman"
                    threadpool="fixed"
                    threads="500"
                    timeout="5000"
                    retries="2"
    />
    <dubbo:service interface="com.snowman.service.DemoService"
                   timeout="5000"
                   retries="1"
                   version="3.0.0"
                   ref="demoService">
        <dubbo:method name="sayHello" timeout="2000"/>
    </dubbo:service>
    <bean id="demoService" class="com.snowman.service.DemoServiceImpl"/>
</beans>

服務提供者Provider

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
               "config/spring-dubbo-redis-provider.xml");
        context.start();
        System.out.println("dubbo redis 服務啟動成功 ");
        System.in.read();
    }
}

服務消費者Consumer

import com.snowman.server.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "config/spring-dubbo-redis-consumer.xml");
        context.start();
        DemoService demoService = (DemoService) context.getBean("demoService"); //獲取遠端服務
        String hello = demoService.sayHello("world"); //執行遠端服務
        System.out.println(hello);
    }
}

專案工程結構
在這裡插入圖片描述
先啟動redis(如何安裝可參考《Redis之在Linux上安裝和簡單的使用》),因為它是註冊中心(在兩個xml都配置了redis的地址),沒起來會報錯,也沒辦法通知Consumer呼叫。

執行Provider,可以在控制檯看到輸出“dubbo redis 服務啟動成功 ”
在這裡插入圖片描述

再執行Consumer,可以在控制檯看到輸出“Hello world ”,遠端呼叫Provider的服務成功。
在這裡插入圖片描述

再去看redis,可以看到Provider和Consumer都把相關資訊傳送到註冊中心
在這裡插入圖片描述
(RedisDesktopManager,一個redis視覺化工具)

流程簡述:

  1. 啟動Provider,Provider根據配置檔案找到要提供的服務介面及其相關引數(版本號、超時時間等),向提供的註冊中心傳送資訊進行註冊。
  2. 啟動Consumer,Consumer根據配置檔案找到所需服務介面及其相關引數,向註冊中心傳送資訊進行註冊。
  3. 註冊中心接收到註冊資訊後盡心匹配,將服務和介面資訊傳送給Consumer。
  4. Consumer接到註冊資訊的資訊進行快取,並根據資訊進行介面的遠端呼叫。
    (呼叫過程跟註冊中心沒半毛錢關係,資訊是從快取取得,取得註冊中心的資訊後,就算註冊中心掛掉可以正常呼叫)

demo:https://github.com/soarsnowman/dubbo.git