`

dubbo定义及使用

阅读更多

1. Dubbo是什么?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

其核心部分包含:1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。


2. Dubbo能做什么?
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。      2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。


3. dubbo的架构
dubbo架构图如下所示:


[img]http://dl2.iteye.com/upload/attachment/0119/3214/ac7f0528-a4ae-3c5b-9bab-2b7c5c4216ef.jpg" alt="[/img]


节点说明:

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

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


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

5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。


4. dubbo使用
spring配置方式的写法:

服务提供者:
1.下载zookeeper注册中心,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/  下载后解压即可,进入D:\zookeeper\bin,双击zkServer.cmd启动注册中心服务。

2.定义服务接口:

package com.test.dubbo.service;

import java.util.List;

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

在服务提供方实现接口:

package com.test.dubbo.service.impl;

import com.test.dubbo.entity.User;
import com.test.dubbo.service.DemoService;

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("siheyuan");
        u1.setAge(20);
        u1.setSex("f");

        User u2 = new User();
        u2.setName("batasi");
        u2.setAge(21);
        u2.setSex("m");


        list.add(u1);
        list.add(u2);

        return list;
    }
}

 

3.spring服务配置

>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
        ">

    <!-- 具体的实现bean -->
<bean id="demoService" class="com.test.dubbo.service.impl.DemoServiceImpl" />

    <!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="demo_provider" />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <!--<dubbo:registry address="multicast://224.5.6.7:1234" /> -->

    <!-- 使用zookeeper注册中心暴露服务地址 即zookeeper的所在服务器ip地址和端口号 -->
<dubbo:registry address="zookeeper://192.168.1.83:2181" />

    <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

    <!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.test.dubbo.service.DemoService"
ref="demoService" />

</beans>

 

>applicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.1.xsd">

   <!-- 引入属性文件 -->
<context:property-placeholder location="classpath:config.properties" />

   <!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.test.dubbo" />

</beans>

 

>spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:task="http://www.springframework.org/schema/task" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-4.1.xsd 
      http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
      http://www.springframework.org/schema/task  
      http://www.springframework.org/schema/task/spring-task-4.1.xsd">

   <task:annotation-driven/>
   <!-- 引入属性文件 -->
<context:property-placeholder location="classpath:config.properties"/>
   <!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
   
<context:component-scan base-package="com.test.dubbo" />

   <!-- 配置页面跳转 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/default/" />
      <property name="suffix" value=".jsp" />
   </bean>
   
   <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <property name="supportedMediaTypes">
         <list>
            <value>text/plain;charset=UTF-8</value>
         </list>
      </property>
   </bean>

   <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
      <property name="messageConverters">
         <list>
            <ref bean="mappingJackson2HttpMessageConverter" /><!-- json转换器 -->
</list>
      </property>
   </bean>
   <mvc:annotation-driven   conversion-service="conversionService" />   
   <bean id="conversionService"  class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  

   </bean>  
   <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" />

   <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <property name="defaultEncoding">
         <value>UTF-8</value>
      </property>
      <property name="maxUploadSize">
         <value>32505856</value><!-- 上传文件大小限制为31M,31*1024*1024 -->
</property>
      <property name="maxInMemorySize">
         <value>4096</value>
      </property>
   </bean>
</beans>

 

>User.java

package com.test.dubbo.entity;

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

>config.properties这个可以创建空文件即可

 

启动服务

package com.test.dubbo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ProviderTest {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml","dubbo-provider.xml" });
        context.start();
        System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
}
}

 

3.服务消费者

1.配置远程服务的引用

>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="test_consumer" />

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<dubbo:registry address="zookeeper://192.168.1.83:2181" />

    <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
<dubbo:reference id="demoService"
interface="com.test.dubbo.service.DemoService" />

</beans>

 

2.调用远程服务

package com.test.dubbo.consumer;

import com.test.dubbo.service.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;
import java.util.List;

public class ConsumerTest {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml","dubbo-consumer.xml" });
        context.start();

        DemoService demoService = (DemoService) context.getBean("demoService");
        String hello = demoService.sayHello("Beijing");
        System.out.println(hello);

        List list = demoService.getUsers();
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }
        System.in.read();
    }
}

 

以上为主要代码,直接运行两个test即可。代码请下载附件。

 

 

 

 

  • 大小: 18.4 KB
分享到:
评论

相关推荐

    dubbo 使用基本功能demo

    通过这个“dubbo 使用基本功能demo”,开发者可以了解到Dubbo的基本使用流程,包括接口定义、服务提供与消费、服务注册与发现、以及SpringBoot的整合。这个实例是学习和实践Dubbo功能的一个良好起点,有助于深入理解...

    dubbo介绍和使用

    1. **高性能NIO通讯及多协议集成**:Dubbo 使用高效的 NIO 技术进行网络通信,并支持多种通信协议。 2. **服务动态寻址与路由**:支持基于服务地址的变化自动调整路由策略,确保服务请求能够准确地被定向到正确的...

    dubbo使用例子 dubbo使用例子

    总之,Dubbo作为一个强大的分布式服务框架,其使用涉及到服务的定义、实现、注册、消费等多个环节,通过合理的配置和实践,我们可以利用它来构建高可用、高性能的分布式系统。在实际开发中,还需要注意服务治理相关...

    dubbo 对外提供和使用接口方法

    #### 四、Dubbo协议选择及配置 Dubbo支持多种通信协议,包括`dubbo`、`rest`、`hessian`、`http`等,每种协议都有其适用场景。 **1. dubbo协议** - **特点**:专为Dubbo设计,性能最优。 - **配置示例**: ```...

    dubbo示例代码dubbo-sample

    例如,在`dubbo-samples-api`模块中定义的接口,会在`dubbo-samples-provider`模块中被具体实现并暴露。 2. **服务消费者(Consumer)** 服务消费者则是调用服务的组件,通过`@Reference`注解引用服务提供者提供的...

    dubbo的简单小demo

    dubbo-provider模块是服务提供者部分,它实现了dubbo-api模块中定义的服务接口,并且配置了服务暴露的相关信息,如服务版本、Group、协议、超时时间等。服务提供者在启动时会注册到Zookeeper,等待服务消费者的调用...

    dubbo环境搭建及例子

    2. **Maven**:Dubbo项目通常使用Maven作为构建工具,因此你需要安装Maven并配置好`MAVEN_HOME`环境变量。 3. **ZooKeeper**:Dubbo使用ZooKeeper作为注册中心,用于服务的注册与发现。你需要在本地或者远程服务器...

    dubbo安装使用教程

    【Dubbo安装与使用教程】 Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java服务治理框架,它致力于提供一个简单、高效的分布式服务解决方案。在本教程中,我们将深入探讨如何安装并使用Dubbo,以及如何结合...

    dubbo使用的dtd

    在Dubbo的XML配置中,DTD定义了一系列的服务、消费者、提供者等核心元素以及它们的属性,这些元素和属性用于描述服务的各个层面,如服务接口、实现类、注册中心、协议、超时、重试等。例如,`&lt;dubbo:service&gt;`元素...

    dubbo-zookeeper安装使用

    定义服务引用,使用`@Reference`注解标记接口,这样Dubbo会通过Zookeeper找到服务提供者并建立连接。在代码中,可以直接调用服务接口的方法来调用远程服务。 【源码运行】 压缩包内的`dubbo_server`和`dubbo_client...

    dubbo使用小例子

    【标题】"Dubbo使用小例子"涉及到的核心知识点主要集中在分布式服务框架Dubbo的实践应用上。Dubbo是由阿里巴巴开源的高性能、轻量级的服务治理框架,它主要应用于微服务架构中,提供服务的发布、订阅、调用等功能。...

    dubbo使用例子

    1. **服务定义**:了解如何定义服务接口,这是Dubbo通信的基础。 2. **服务暴露**:学习如何在服务提供者端通过配置暴露服务,包括服务版本、组别、协议等信息。 3. **服务消费**:查看客户端如何通过服务引用获取...

    dubbo xsd的支持

    3. `&lt;dubbo:protocol&gt;`:定义服务暴露和消费使用的协议,如dubbo、rmi、http等,以及端口设置。 4. `&lt;dubbo:service&gt;`:用于暴露服务,定义接口、版本、实现类、调用方式、超时时间等参数。 5. `&lt;dubbo:reference&gt;...

    dubbodubbo.zip

    5. **集成Spring Boot**:Dubbo可以无缝集成Spring Boot,利用Spring的自动化配置能力,简化Dubbo的使用和运维。 总结,Dubbo作为一款强大的服务治理框架,其设计理念和实现方式为开发者提供了高效、可靠的分布式...

    dubbo框架标签dubbo.xsd

    在使用Dubbo时,我们经常会遇到XML配置文件中的标签无法被识别的问题,这通常是因为缺少了对相关XML Schema定义的引用。这里的"**dubbo.xsd**"就是解决这个问题的关键。 XML Schema(简称XSD)是一种用于定义XML...

    Dubbo监控系统配置

    这些配置通常在`dubbo-admin.properties`文件中定义。 2. **监控数据源**:为了实时监控服务的状态,Dubbo Admin需要从Dubbo服务实例收集监控数据。这些配置也位于`dubbo-admin.properties`文件中。 3. **自定义配置...

    dubbo-admin包

    【描述】"dubbo-admin 包,使用的时候直接解压放到Tomcat下面的webapps目录下面就可以了"这段描述揭示了dubbo-admin的部署方式。Dubbo-admin作为一个Web应用程序,需要依赖于像Apache Tomcat这样的Servlet容器来运行...

    dubbo入门实例及性能测试

    - **服务接口定义**:创建服务接口(API)项目`lk-dubbo-api`,定义服务提供者和消费者之间交互的接口。 - **服务提供者**:在`lk-dubbo-provider`项目中实现服务接口,注册到Dubbo服务注册中心,如Zookeeper。 -...

    dubbo的.xsd文件分享

    Dubbo作为一款高性能、轻量级的Java开源服务框架,其在设计和实现过程中广泛使用了XML Schema(简称XSD)来定义服务接口和配置规范。XSD文件是XML文档的模式定义,它为XML提供了结构约束和数据类型定义,使得XML数据...

Global site tag (gtag.js) - Google Analytics