dubbo示例


Dubbo是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。

我也不明白這是什么意思,使用了之后大概就是提供一個將多個項目進行聯合的一種分布式,使用的是一種長鏈接的方法,具體沒有深入研究,只是試用了一下。

 

其核心部分包含:

  • 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。(具體應該是一種長連接的方式,所以速度較快)
  • 集群容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。(使用dubbo,一般會使用zookeeper來做集群)
  • 自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。(統一的注冊中心,如果注冊中心掛掉了,已經注冊的會存在於緩存中,不會斷掉。)

Dubbo能做什么?

  • 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
  • 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
  • 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。

另外dubbo進行了與spring的完全融合,所以可以直接通過spring的xml文件進行配置,至於怎么與spring-boot整合,還不知道。

 

上實現:

1.首先需要一個zookeeper;具體用法請百度。

 

2.啟動zookeeper,以這個服務作為注冊中心

 

3.生產者,首先引入zookeeper的jar

<!-- zookeeper -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <artifactId>jmxtools</artifactId>
                    <groupId>com.sun.jdmk</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jmxri</artifactId>
                    <groupId>com.sun.jmx</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jms</artifactId>
                    <groupId>javax.jms</groupId>
                </exclusion>
            </exclusions>
        </dependency>

然后是dubbo

    <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.4.9</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

別忘了還有spring的,這里就不貼了

3.1:

      首先定義一個接口,用來發布的:

public interface ProvideService {

    public String sayHello(String name);
}

進行實現:

@Service(value = "provideService")
public class ProvideServiceImpl implements ProvideService {

    public String sayHello(String name){
        System.out.println ("ProvideServiceImpl  sayHello 走到了");
        return name + " say Hello";
    }

}

然后是最關鍵的spring 配置dubbo

applicationContext.xml

    <!-- 啟動spring注解掃描 -->
    <context:annotation-config /> 

    <context:component-scan base-package="com.dubbo.*" />

    <!-- 提供方應用信息,用於計算依賴關系 -->
    <dubbo:application name="lclc_provider" />


    <!-- 使用zookeeper注冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" /> 

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

    <!-- 聲明需要暴露的服務接口 -->
    <dubbo:service interface="com.dubbo.ProvideService"
        ref="provideService" />

啟動spring即可

 public static void main(String[] args){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext ("applicationContext.xml");
        context.start ();
        try {
            System.in.read ();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace ();
        }// 按任意鍵退出
    }

4.然后是消費者

引入的jar包與生產者一樣,但是需要多加一個,即生產者方提供的接口,因為是通過接口進行代理的

4.1:消費

  public static void main(String[] args){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext ("applicationContext.xml");

        context.start ();

        ProvideService demoService = (ProvideService) context.getBean ("ProvideService");// 獲取遠程服務代理

        String hello = demoService.sayHello ("lclc");// 執行遠程方法

        System.err.println (hello);// 顯示調用結果
    }

application.xml

<!-- 啟動spring注解掃描 -->
    <context:annotation-config /> 

    <context:component-scan base-package="com.dubbo.*" />

    <!-- 提供方應用信息,用於計算依賴關系 -->
    <dubbo:application name="lclc_consumer" />

    <!-- 使用zookeeper注冊中心暴露服務地址 -->
     <dubbo:registry address="zookeeper://127.0.0.1:2181" />

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

    <dubbo:reference id="ProvideService"  interface="com.dubbo.ProvideService" />

 

請注意:生產者與消費者是兩個項目,是部署在兩個服務器上的,通過dubbo進行鏈接起來,消費者調用生產者的接口就像調用本地一樣。

 


免責聲明!

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



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