Dubbo 运行原理和Java代码示例

2019-09-20 0 By admin

一、Dubbo 在工作时有以下四个角色参与

  1. Provider:暴露服务的服务提供方(工作者,用于处理任务)
  2. Consumer:调用远程服务的服务消费方(提交任务并接受任务处理结果)
  3. Registry:服务注册与发现的注册中心
  4. Monitor: 统计服务的调用次数和调用时间的监控中心
  5. Container:服务运行容器

1.1、部署阶段

  1. 服务提供者在指定端口暴露服务,并向注册中心注册服务信息。
  2. 服务消费者向注册中心发起服务地址列表的订阅。

1.2、运行阶段

  1. 注册中心向服务消费者推送地址列表信息。
  2. 服务消费者收到地址列表后,从其中选取一个向目标服务发起调用。
  3. 调用过程服务消费者和服务提供者的运行状态上报给监控中心。

二、Dubbo + Zookeeper JAVA 代码示例

Dubbo 的应用一般都是通过 Spring 来组装的。为了快速获得一个可以工作的 Dubbo 应用,这里的示例摒弃了复杂的配置,而改用面向 Dubbo API 的方式来构建服务提供者和消费者,另外,注册中心和监控中心在本示例中也不需要安装和配置。

在生产环境,Dubbo 的服务需要一个分布式的服务注册中心与之配合,比如,ZooKeeper。为了方便开发,Dubbo 提供了直连以及组播两种方式,从而避免额外搭建注册中心的工作。

三、Provider 端

3.1、定义服务接口(Consumer 端相同)

public interface UserService {
  String sayHello(String name);
  public List getUsers();
}

3.2、接口实现类

public class UserServiceImpl implements UserService {
  public String sayHello(String name) {
    return "Hello " + name;
  }
}

3.3、POM文件依赖(Consumer 端相同)

<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.9.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.7.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.6</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>2.10.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>2.10.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-client</artifactId>
      <version>2.10.0</version>
    </dependency>
  </dependencies>

3.4、XML 配置文件(provider.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/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-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  <!--Applicationname-->
  <dubbo:application name="hello-world-app"/>
  <!--registryaddress,usedforservicetoregisteritself-->
  <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
  <!--exposethisservicethroughdubboprotocol,throughport20880-->
  <dubbo:protocol name="dubbo" port="20880"/>
  <!--whichserviceinterfacedoweexpose?-->
  <dubbo:service interface="com.cn.UserService" ref="UserServiceImpl"/>
  <!--designateimplementation-->
  <bean id="UserServiceImpl" class="com.cn.UserServiceImpl"/>
</beans>

3.5、调用代码

public class Provider {
  public  static  void  main(String[] args)throws Exception {
    ClassPathXmlApplicationContext  context = new  ClassPathXmlApplicationContext(new String[]{"provider.xml"});
    context.start();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = new Date();
    System.out.println("按任意键退出,时间:"+sdf.format(date));
    //保证服务始终开启
    System.in.read();
  }
}

四、Consumer 端

4.1、XML 配置文件(customer.xml)

  <!--Applicationname-->
  <dubbo:application name="dubbo_consumer"/>
  <!--registryaddress,usedforservicetoregisteritself-->
  <dubbo:registry address="zookeeper://12.168.3.20:2181"/>
   <dubbo:reference interface="com.cn.UserService" id="UserService"/>

4.2、调用代码

public class CustomerMain {
  public static void main(String[] args) throws InterruptedException{
    ClassPathXmlApplicationContext cfig = new ClassPathXmlApplicationContext("customer.xml");
    UserService test = (UserService) cfig.getBean("UserService");
    String hello = test.sayHello("tom");
    System.out.println(hello);

    List list = test.getUsers();
    if (list != null && list.size() > 0) {
      for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
      }
    }
    System.out.println("消费者调用服务方接口结束");
  }
}