Dubbo入门示例

Dubbo是一个开源的分布式服务治理框架,提供高性能和透明化的RPC远程服务调用方案及SOA服务治理方案。不再使用Web Service模式中的WSDL,而是以服务者或消费者的方式在Dubbo上进行注册。Dubbo提供3个主要功能:基于接口的远程调用、容错和负载均衡、自动服务注册和发现。

服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或者删除服务提供者。Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需要Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。





Provider:暴露服务的服务提供方

Consumer:调用远程服务的服务消费方

Registry:服务注册与发现的注册中心

Monitor:统计服务的调用次数和调用时间的监控中心

Container:服务运行容器

调用关系说明
  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo 示例

本地服务Spring配置

local.xml

<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
<bean id=“xxxAction” class=“com.xxx.XxxAction”>
    <property name=“xxxService” ref=“xxxService” />
</bean>

远程服务Spring配置

在本地服务的基础上,只需做简单配置,即可完成远程化:

  • 将上面的 local.xml 配置拆分成两份,将服务定义部分放在服务提供方 remote-provider.xml,将服务引用部分放在服务消费方 remote-consumer.xml
  • 并在提供方增加暴露服务配置 <dubbo:service>,在消费方增加引用服务配置 <dubbo:reference>

remote-provider.xml:

<!-- 和本地服务一样实现远程服务 -->
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> 
<!-- 增加暴露远程服务配置 -->
<dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” />
remote-consumer.xml:
<!-- 增加引用远程服务配置 -->
<dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” />
<!-- 和本地服务一样使用远程服务 -->
<bean id=“xxxAction” class=“com.xxx.XxxAction”> 
    <property name=“xxxService” ref=“xxxService” />
</bean>


在github下载dubbo,在Eclipse中import这个maven项目

https://github.com/alibaba/dubbo

选中dubbo-admin项目,右键maven--update project

双击dubbo-admin项目中的pom.xml,查看到dubbo的版本号为2.5.8,packaging为war即一个web项目


修改dubbo-admin项目中的WEB-INF目录下的dubbo.properties


选中dubbo-admin项目,右键run as--maven install,在target目录下可以看到新生成的war包


将dubbo-admin-2.5.8.war上传到192.168.0.217 Linux虚拟机的tomcat的webapps下

启动tomcat,查看catalina.out输出的信息,发现无异常

此时,在Windows上的浏览器中输入http://192.168.0.217:8080/dubbo-admin-2.5.8/   ,访问dubbo管控台。

输入用户名root和密码root后,进入管控台界面,如下图。


在Eclipse中打开dubbo-demo-provider项目,修改文件dubbo-demo-provider.xml中注册中心地址为zookeeper集群中相关机器。

<dubbo:registry address="zookeeper://192.168.0.217:2181?backup=192.168.0.218:2181,192.168.0.219:2181"/>



DemoServiceImpl.java

package com.alibaba.dubbo.demo.provider;

import com.alibaba.dubbo.demo.DemoService;
import com.alibaba.dubbo.rpc.RpcContext;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DemoServiceImpl implements DemoService {

    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();
    }
}

选中dubbo-demo-provider项目中的Provider.java,右键run as --java application

package com.alibaba.dubbo.demo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {

    public static void main(String[] args) throws Exception {
        //Prevent to get IPV6 address,this way only work in debug mode
        //But you can pass use -Djava.net.preferIPv4Stack=true,then it work well whether in debug mode or not
        System.setProperty("java.net.preferIPv4Stack", "true");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});
        context.start();

        System.in.read(); // press any key to exit
    }

}

此时,在浏览器中查看dubbo控制台内容





在Eclipse中打开dubbo-demo-consumer项目,修改文件dubbo-demo-consumer.xml中注册中心地址为zookeeper集群中相关机器。

<dubbo:registry address="zookeeper://192.168.0.217:2181?backup=192.168.0.218:2181,192.168.0.219:2181"/>


选中dubbo-demo-consumer项目中的Consumer.java,右键run as --java application

package com.alibaba.dubbo.demo.consumer;

import com.alibaba.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer {

    public static void main(String[] args) {
        //Prevent to get IPV6 address,this way only work in debug mode
        //But you can pass use -Djava.net.preferIPv4Stack=true,then it work well whether in debug mode or not
        System.setProperty("java.net.preferIPv4Stack", "true");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});
        context.start();
        DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy

        while (true) {
            try {
                Thread.sleep(1000);
                String hello = demoService.sayHello("world"); // call remote method
                System.out.println(hello); // get result

            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

    }
}

此时,在Consumer对应的console中,显示内容如下:


同时,在Provider对应的console中,显示内容如下:


其中,192.168.0.107为运行dubbo-demo-consumer与dubbo-demo-provider所在windows机器的ip地址


此时,在dubbo-admin管控台查看消费者信息



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值