dubbo學(xué)習(xí)筆記——簡單案例

最近在學(xué)習(xí)dubbo框架,dubbo是一個遠程RPC調(diào)用框架,提供了很多角色,如下所示:

節(jié)點角色說明
節(jié)點 角色說明
Provider 暴露服務(wù)的服務(wù)提供方
Consumer 調(diào)用遠程服務(wù)的服務(wù)消費方
Registry 服務(wù)注冊與發(fā)現(xiàn)的注冊中心
Monitor 統(tǒng)計服務(wù)的調(diào)用次數(shù)和調(diào)用時間的監(jiān)控中心
Container 服務(wù)運行容器
調(diào)用關(guān)系說明
  1. 服務(wù)容器負責(zé)啟動,加載,運行服務(wù)提供者。
  2. 服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。
  3. 服務(wù)消費者在啟動時,向注冊中心訂閱自己所需的服務(wù)。
  4. 注冊中心返回服務(wù)提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
  5. 服務(wù)消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。
  6. 服務(wù)消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。

本文采用zookeeper作為注冊中心(版本3.6.1)

服務(wù)提供方實現(xiàn)如下:

  1. maven依賴如下:
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.1</version>
        </dependency>

    </dependencies>
  1. 提供dubbo遠程調(diào)用的API
package com.huang.dubbo.api;

/**
 * @Author: huangyichun
 * @Date: 2021/3/30
 */
public interface GreetingsService {
    String sayHi(String name);
}

package com.huang.dubbo.api;

import org.apache.dubbo.config.annotation.DubboService;

/**
 * @Author: huangyichun
 * @Date: 2021/3/30
 */
@DubboService
public class GreetingsServiceImpl implements GreetingsService {
    @Override
    public String sayHi(String name) {
        return "hi, " + name;
    }
}
  1. dubbo配置
# dubbo-provider.properties
dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
  1. 加載配置文件
package com.huang.dubbo;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.huang.dubbo.api")
@PropertySource("classpath:/dubbo-provider.properties")
public class DubboApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboApplication.class, args);
    }

}

消費端實現(xiàn):

  1. dubbo配置
<?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-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消費方應(yīng)用名,用于計算依賴關(guān)系,不是匹配條件,不要與提供方一樣 -->
    <dubbo:application name="consumer-of-helloworld-app"  />

    <!-- 使用multicast廣播注冊中心暴露發(fā)現(xiàn)服務(wù)地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 生成遠程服務(wù)代理,可以和本地bean一樣使用demoService -->
    <dubbo:reference id="greetingsService" interface="com.huang.dubbo.api.GreetingsService" check="true"/>

</beans>
  1. 測試類
package com.huang.dubbo;

import com.huang.dubbo.api.GreetingsService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author: huangyichun
 * @Date: 2021/3/30
 */
public class Consumer {


    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"});
        context.start();
        GreetingsService demoService = (GreetingsService)context.getBean("greetingsService"); // 獲取遠程服務(wù)代理
        String hello = demoService.sayHi("world ------------------------"); // 執(zhí)行遠程方法
        System.out.println( hello );
    }
}

輸出結(jié)果如下:

hi, world ------------------------

查看zookeeper節(jié)點信息如下:

ls /dubbo/com.huang.dubbo.api.GreetingsService/providers 
[dubbo%3A%2F%2F10.12.214.93%3A20880%2Fcom.huang.dubbo.api.GreetingsService%3Fanyhost%3Dtrue%26application%3Dannotation-provider%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26interface%3Dcom.huang.dubbo.api.GreetingsService%26metadata-type%3Dremote%26methods%3DsayHi%26pid%3D10258%26release%3D2.7.9%26side%3Dprovider%26timestamp%3D1617332790089]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容