1. 程式人生 > >Dubbo之旅--Provider示例

Dubbo之旅--Provider示例

在本篇文章中我們將通過集體的示例來對Dubbo的提供和消費進行程式碼層面的認識.這裡所介紹的是基本的提供者和消費者通過Spring容器來進行相關的提供和消費的服務.首先看整個示例的專案結構如下:

計算機生成了可選文字:dubbo-demo dubbo-demo-consumer d ubbo-d d er

我們通過Maven的方式來進行示例,其中dubbo-demo-api為提供者所定義的介面,專案結構如下:

計算機生成了可選文字:d u b 60 -demo dubbo-demo-api java org pactera u b 60 DemoService.Java DemoService2java DemoService3.ja va main4.iml test ta rget dubbo-demo-api.iml pom.xml d u bbo-demo-consu mer d u 660 -demo-provider

此專案裡的內容很簡單,為服務的一個介面DemoService:

/dubbo-demo/dubbo-demo-api/src/main/java/org/pactera/dubbo/DemoService.java

packageorg.pactera.dubbo;

/**

 *

 * @author Qing

 *

 */

publicinterface DemoService {

    public String sayHello(String str);

}

      Dubbo-demo-provider為服務提供者的示例專案,結構如下圖:

計算機生成了可選文字:d u bbo-demo-provider mal n Java org pactera provid er @ Bootstrapjava @ DubboProvİderDemojava resou rces d u bbo-demo-provider.xml [X] logback.xml maİn3.İml test ta rget dependency-reduced -pom.xml dubbo-demo-provİder.İml pom.xml

Dubbo-demo-consumer為服務消費者的示例專案,結構如下圖:

計算機生成了可選文字:d u bbo-demo-consu mer Java org pactera d u 880 model provid er thread Bootstrap java DemoServiceConsu merjava resou rces d u bbo-demo-consu mer.xml logback.xml main2.iml test ta rget dependency-red uced -pom.xml dubbo-demo-consumer.iml pom.xml

以上是整個示例程式的整體框架.

接下來我們將從提供者的專案入手開始.在提供者的專案裡先要對相關提供的服務進行配置.

1   Dubbo-demo-provider的專案裡我們需要用到Dubbo,Zookeeper,以及dubbo-demo-api

的相關java,因此需要在pom.xml對其進行引用,如下:

    <dependencies>

        <dependency>

           <groupId>org.pactera.dubbo</groupId>

           <artifactId>dubbo-demo-api</artifactId>

           <version>1.0-SNAPSHOT</version>

        </dependency>

        <dependency>

           <groupId>com.alibaba</groupId>

           <artifactId>dubbo</artifactId>

           <version>2.4.10</version>

        </dependency>

        <dependency>

           <groupId>com.101tec</groupId>

           <artifactId>zkclient</artifactId>

            <version>0.3</version>

        </dependency>

        <dependency>

           <groupId>junit</groupId>

           <artifactId>junit</artifactId>

           <version>3.8.1</version>

            <scope>test</scope>

        </dependency>

    </dependencies>

2  接下來為了能夠讓Dubbo的提供者通過Spring方式載入,我們需要對其進行相關配置,如下檔案內容.

/dubbo-demo/dubbo-demo-provider/src/main/resources/dubbo-demo-provider.xml

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="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

        ">

    <!-- 提供方應用資訊,用於計算依賴關係 -->

    <dubbo:applicationname="hello-world-app"  />

     <!-- 使用zookeeper廣播註冊中心暴露服務地址 -->

    <dubbo:registryprotocol="zookeeper" address="127.0.0.1:2181" />

    <!-- 用dubbo協議在20880埠暴露服務 -->

    <dubbo:protocol name="dubbo"port="20881" />

    <dubbo:monitorprotocol="registry"></dubbo:monitor>

    <!-- 宣告需要暴露的服務介面 -->

    <dubbo:serviceinterface="org.pactera.dubbo.DemoService" ref="demoService"/>

    <!-- 和本地bean一樣實現服務 -->

    <bean id="demoService"class="org.pactera.dubbo.provider.DemoServiceImpl" />

</beans>

3  需要將dubbo提供的服務介面進行實現.

/dubbo-demo/dubbo-demo-provider/src/main/java/org/pactera/dubbo/provider/DemoServiceImpl.java

packageorg.pactera.dubbo.provider;

importcom.alibaba.dubbo.rpc.RpcContext;

importlombok.extern.slf4j.Slf4j;

importorg.pactera.dubbo.DemoService;

@Slf4j

publicclass DemoServiceImpl implements DemoService {

    public String sayHello(String str) {

      System.out.println("reqInfo: "+ str + ", request form consumer: " +RpcContext.getContext().getRemoteHost());

        return "Hello " + str;

    }

}

接下來我們需要再寫一個提供者啟動服務的程式,主要是用來啟動Spring容器,並注入相關的服務,同時將提供者的內容註冊到Zookeeper.

啟動程式如下:

/dubbo-demo/dubbo-demo-provider/src/main/java/org/pactera/dubbo/Bootstrap.java

packageorg.pactera.dubbo;

importcom.google.common.util.concurrent.AbstractIdleService;

importlombok.extern.slf4j.Slf4j;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

@Slf4j

publicclass Bootstrap extends AbstractIdleService {

    private ClassPathXmlApplicationContextcontext;

    public static void main(String[] args) {

        Bootstrap bootstrap = new Bootstrap();

        bootstrap.startAsync();

        try {

            Object lock = new Object();

            synchronized (lock) {

                while (true) {

                    lock.wait();

                }

            }

        } catch (InterruptedException ex) {

            System.err.println("ignoreinterruption");

        }

    }

    /**

     * Start the service.

     */

    @Override

    protected void startUp() throws Exception {

        context = newClassPathXmlApplicationContext("dubbo-demo-provider.xml");

        context.start();

        context.registerShutdownHook();

       System.out.println("----------------provider service startedsuccessfully------------");

    }

    /**

     * Stop the service.

     */

    @Override

    protected void shutDown() throws Exception{

        context.stop();

       System.out.println("-------------service stoppedsuccessfully-------------");

    }

}

       5    提供者服務啟動日誌:

計算機生成了可選文字:B cc.tstra 2m5-a3- 383) t c urn ins i sta cc of singleton i tance of singleton r start cd (13 liason) kl .7.0_1 c on ca 2ø1s-øs-3e (Def.u1tSins c of simglcton • dubbc• STARTING) DEBUG STARr1w,J 2g15-gy-3a 2g15-g3-3a Finished 2ø15-ø3-3e to for o. s. b.f.s.DefaultListablegeanF.ctory creating of ' tubbo• of 'ors-p t Eagerly DEBUG STARTING) DEBUG INFO pre-Lnst.ntlatlng s Lngletæ•.s Ln (DefaultLista definint STARTING) STARTING) STARTING) urn n urning e urning of factory håæ-archy 2ø15-ø3-3a 2us-ø3-se 2ø1S-ø3-3ø 2m5-g3-3a . java zm5-g3-3g 2ø1s-ø3-3e a•214) R t 8:21') Ret •214) Ret •214) R t c a c hÆd •app b.f. (AbstractSu B _ dubEE. b.f. s.CRfauLtListabLe3eanFactory C AbstractSu ton 'dubbo' • . alibaba. dubbc. b.f. (Abstract3e instance of singleton STARTING)

至此,服務者Provider的示例基本上已經結束,如果讀者配置監控中心的話,可以開啟監控中心搜尋demoService,你便可以在監控中心看到此提供者服務的具體資訊.限於篇幅的原因,關於消費者的相關示例將在接下來的文章進行闡述.