dubbo小例子

1.   概述java

Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。主要核心部件算法

Remoting: 網絡通訊框架,實現了sync-over-async 和 request-response 消息機制.spring

RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集羣功能express

Registry: 服務目錄框架用於服務的註冊和服務事件發佈和訂閱。apache

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

dubbo架構圖以下所示:架構

節點角色說明:app

Provider: 暴露服務的服務提供方。負載均衡

Consumer: 調用遠程服務的服務消費方。框架

Registry: 服務註冊與發現的註冊中心。

Monitor: 統計服務的調用次調和調用時間的監控中心。

Container: 服務運行容器。

調用關係說明:

0 服務容器負責啓動,加載,運行服務提供者。

1. 服務提供者在啓動時,向註冊中心註冊本身提供的服務。

2. 服務消費者在啓動時,向註冊中心訂閱本身所需的服務。

3. 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。

4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。

5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。


2.   實例

2.1 pom.xml

首先maven項目增長dubbo的jar依賴,由於要用到zookeeper註冊中心,也要依賴可是要去掉自帶的log4j。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>test</groupId>  <artifactId>test</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>jar</packaging>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <spring.version>3.1.4.RELEASE</spring.version>    <slf4j.version>1.6.6</slf4j.version>  </properties>  <dependencies>    <!-- dubbo  -->    <dependency>      <groupId>com.alibaba</groupId>      <artifactId>dubbo</artifactId>      <version>2.5.3</version>    </dependency>    <!-- zookeeper  -->    <dependency>      <groupId>org.apache.zookeeper</groupId>      <artifactId>zookeeper</artifactId>      <version>3.4.6</version>      <exclusions>        <exclusion>          <groupId>log4j</groupId>          <artifactId>log4j</artifactId>        </exclusion>      </exclusions>    </dependency>    <!-- Spring -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-aop</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-asm</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-core</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-beans</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context</artifactId>      <version>${spring.version}</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-expression</artifactId>      <version>${spring.version}</version>    </dependency>    <!-- log -->    <dependency>      <groupId>log4j</groupId>      <artifactId>log4j</artifactId>      <version>1.2.16</version>    </dependency>  </dependencies></project>

由於要增長zookeeper的註冊管理,因此若是有可用的zookeeper就用可用的zookeeper。本實例使用的zk地址是192.168.4.114:2181

2.2 dubbo-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 = "hello-world-app-provider" />  <!--zookeeper註冊中心 -->  <dubbo:registry protocol="zookeeper" address="192.168.4.114:2181" />  <!-- 用dubbo協議在20880端口暴露服務 -->  <dubbo:protocol name="dubbo" port="20880" />  <!-- 聲明須要暴露的服務接口 -->  <dubbo:service interface="com.mt.test.DemoService" ref="demoProvideService"/>  <!-- 具體的實現bean -->  <bean id="demoProvideService" class="com.mt.test.DemoServiceImpl" /></beans>

2.3 dubbo-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="hello-world-app-consumer"/>  <!-- 使用zookeeper註冊中心暴露服務地址 -->  <dubbo:registry protocol="zookeeper" address="192.168.4.114:2181"/>  <!-- 生成遠程服務代理,能夠和本地bean同樣使用demoService -->  <dubbo:reference id="demoConsumeService" interface="com.mt.test.DemoService"/></beans>

2.4 DemoService.java

package com.mt.test;import java.util.List;public interface DemoService {
    public String sayHello(String name);    public List getUsers();
}

2.5 DemoServiceImpl.java

package com.mt.test;import java.util.ArrayList;import java.util.List;public class DemoServiceImpl implements DemoService{
    @Override
    public String sayHello(String name) {  return "Hello " + name;
    }    @Override
    public List getUsers() {  List list = new ArrayList();  User u1 = new User();  u1.setName("jack");  u1.setAge(20);  u1.setSex("男");  User u2 = new User();  u2.setName("tom");  u2.setAge(21);  u2.setSex("女");  User u3 = new User();  u3.setName("rose");  u3.setAge(19);  u3.setSex("女");  list.add(u1);  list.add(u2);  list.add(u3);  return list;
    }
}

2.6 LuncherProvider.java

package com.mt.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;public class LuncherProvider {  public static void main(String[] args) throws Exception {    LuncherProvider luncher = new LuncherProvider();    luncher.start();    System.in.read(); // 爲保證服務一直開着,利用輸入流的阻塞來模擬  }  public void start() {    String configLocation = "spring/dubbo-provider.xml";    ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);    String[] names = context.getBeanDefinitionNames();    System.out.print("Beans:");    for (String string : names)      System.out.print(string + ",");    System.out.println();  }
}

2.7 LuncherConsumer.java

package com.mt.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class LuncherConsumer {  public static void main(String[] args) throws Exception {    LuncherConsumer luncher = new LuncherConsumer();    luncher.start();  }  void start() {    String configLocation = "spring/dubbo-consumer.xml";    ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);    String[] names = context.getBeanDefinitionNames();    System.out.print("Beans:");    for (String string : names) {      System.out.print(string);      System.out.print(",");    }    System.out.println();    DemoService ds = (DemoService) context.getBean("demoConsumeService");    System.out.println(ds.sayHello("hehe"));    System.out.println(ds.getUsers());  }
}

2.8 User.java

package com.mt.test;import java.io.Serializable;//必須實現Serializable接口public class User implements Serializable {  private static final long serialVersionUID = -2814022769568306965L;  private String name;  private Integer age;  private String sex;  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public Integer getAge() {    return age;  }  public void setAge(Integer age) {    this.age = age;  }  public String getSex() {    return sex;  }  public void setSex(String sex) {    this.sex = sex;  }  @Override  public String toString() {    return "User{" +        "name='" + name + '\'' +        ", age=" + age +        ", sex='" + sex + '\'' +        '}';  }
}<strong>
</strong>

運行結果:

(1)provider:

Beans:hello-world-app-provider,com.alibaba.dubbo.config.RegistryConfig,dubbo,com.mt.test.DemoService,demoProvideService,

(2)consumer:

Beans:hello-world-app-consumer,com.alibaba.dubbo.config.RegistryConfig,demoConsumeService,

Hello hehe

[User{name='jack', age=20, sex='男'}, User{name='tom', age=21, sex='女'}, User{name='rose', age=19, sex='女'}]

相關文章
相關標籤/搜索