Dubbo的使用入門


項目工程結構

建議采用同一個父工程的多個模塊module.

服務提供者包括api和provider.

api:存放服務接口(interface)和服務模型(pojo,輸入參數和返回值,所有的pojo都需要實現Serializable接口,因為需要進行網絡傳輸?),服務異常(Exception,服務拋出的異常),一般是jar工程。

provider:存放服務接口的實現以及暴露服務的配置,依賴api模塊,一般是war工程。

服務消費者

consumer:存放引用遠程服務的配置和調用遠程服務實現,依賴api模塊,一般是war工程。

Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行加載。

下面簡單說明一下Dubbo的用法,

服務接口

定義服務接口

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

 

該接口需要單獨打包,以便在服務提供方和消費方之間共享。

服務提供者

在服務提供者處實現接口(消費者引用的只有接口,對服務消費者隱藏接口實現細節)

package com.winner.dubbo.demo.provider.service; import com.alibaba.dubbo.rpc.RpcContext; import com.winner.dubbo.demo.api.service.DemoService; import java.text.SimpleDateFormat; import java.util.Date; /** * @author winner_0715 * @date 2017/12/17 */
public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello "
                + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress(); } }

 在classpath下用spring配置聲明暴露服務:spring-dubbo-provider.xml

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 提供方應用信息,用於計算依賴關系 -->
    <dubbo:application name="demo-provider" owner="winner_0715" organization="wireless"/>

    <!-- 使用zookeeper注冊中心暴露服務地址 -->
    <dubbo:registry protocol="zookeeper" address="zk地址" group="/demo/group/default"/>

    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="-1"/>

    <!-- 和本地bean一樣實現服務 -->
    <bean id="demoService" class="com.winner.dubbo.demo.provider.service.DemoServiceImpl"/>

    <!-- 聲明需要暴露的服務接口 -->
    <dubbo:service interface="com.winner.dubbo.demo.api.service.DemoService" ref="demoService" version="1.0" timeout="3000"/>
</beans>

(1)在根節點beans添加xml命名空間dubbo,xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"和dubbo標簽遵循的規則地址。xsi:schemaLocation=".... http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

(2)dubbo:application應用信息配置,@name應用的名稱,用於注冊中心計算應用之間的依賴關系,消費者和提供者應用名不要一樣。@owner應用負責人,出問題的時候可以找到對應的人來解決。@organization組織名稱,用於注冊中心區分服務來源。

(3)dubbo:registry注冊中心配置,@protocol 注冊中心地址協議,一般都寫zookeeper。@address 注冊中心服務器地址,同一個集群內的多個地址使用逗號進行分隔,如ip:port,ip:port,不同集群的注冊中心,配置多個<dubbo:registry>,@group 注冊服務根節點。

(4)dubbo:protocol 服務提供者協議配置 @name 協議名稱,缺省是dubbo,@port 服務端口,dubbo協議缺省端都是20880,如果配置是-1或者沒有配置port,則會分配一個沒有被占用的端口。建議寫成-1,不容易產生端口沖突.

(5)dubbo:service 服務提供者暴露服務配置

@interface 服務接口名 @ref 服務對象實現引用 @version 服務版本,建議使用兩位數字的版本@timeout服務超時時間

 

服務消費者

 通過spring配置引用遠程服務

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 消費方應用名,用於計算依賴關系,不是匹配條件,不要與提供方一樣 -->
    <dubbo:application name="demo-consumer" owner="winner_0715" organization="wireless"/>

    <!-- 使用zookeeper注冊中心暴露服務地址 -->
    <dubbo:registry protocol="zookeeper" address="zk地址" group="/demo/group/default"/>

    <!-- 生成遠程服務代理,可以和本地bean一樣使用demoService -->
    <dubbo:reference id="demoService"interface="com.winner.dubbo.demo.api.service.DemoService" check="false" version="1.0"/>
</beans>

dubbo:reference 服務消費者引用服務配置

@id服務引用bean id @interface服務接口名 @version服務版本,與服務提供者的版本一致,不然可能報no provider的錯誤 @check啟動時檢查提供者是否存在,true的話報錯,false忽略,一般配置成false

服務消費者處只要通過Spring拿到demoService,即可像使用本地接口一樣使用DemoService這個接口里面的方法:

import org.springframework.context.support.ClassPathXmlApplicationContext; import com.winner.dubbo.demo.api,service.DemoService; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = 
            new ClassPathXmlApplicationContext(new String[] {"consumer.xml"}); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // 獲取遠程服務代理
        String hello = demoService.sayHello("world"); // 執行遠程方法
 System.out.println(hello); // 顯示調用結果
 } }

看到整個過程中:

1、沒有任何Dubbo的代碼,使用Dubbo的時候全部都是Spring配置,這就是前面提到的Dubbo對應用沒有任何API侵入

2、不需要考慮底層線程模型、序列化、反序列化、url解析等問題,這些都是Dubbo底層做好的

上面是使用xml的方式,其實dubbo也支持api的方式

API類和配置標簽一對一,比如:
com.alibaba.dubbo.config.ApplicationConfig 對應 <dubbo:application/>
com.alibaba.dubbo.config.RegistryConfig 對應 <dubbo:registry/>
com.alibaba.dubbo.config.ProtocolConfig 對應 <dubbo:protocol/>
com.alibaba.dubbo.config.ProviderConfig 對應 <dubbo:provider/>
com.alibaba.dubbo.config.ReferenceConfig對應 <dubbo:reference/>
API屬性與配置項一對一,比如:ApplicationConfig.setName("xxx") 對應 <dubbo:application name="xxx" />

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM