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即可。代码请下载附件。
相关推荐
通过这个“dubbo 使用基本功能demo”,开发者可以了解到Dubbo的基本使用流程,包括接口定义、服务提供与消费、服务注册与发现、以及SpringBoot的整合。这个实例是学习和实践Dubbo功能的一个良好起点,有助于深入理解...
1. **高性能NIO通讯及多协议集成**:Dubbo 使用高效的 NIO 技术进行网络通信,并支持多种通信协议。 2. **服务动态寻址与路由**:支持基于服务地址的变化自动调整路由策略,确保服务请求能够准确地被定向到正确的...
总之,Dubbo作为一个强大的分布式服务框架,其使用涉及到服务的定义、实现、注册、消费等多个环节,通过合理的配置和实践,我们可以利用它来构建高可用、高性能的分布式系统。在实际开发中,还需要注意服务治理相关...
#### 四、Dubbo协议选择及配置 Dubbo支持多种通信协议,包括`dubbo`、`rest`、`hessian`、`http`等,每种协议都有其适用场景。 **1. dubbo协议** - **特点**:专为Dubbo设计,性能最优。 - **配置示例**: ```...
例如,在`dubbo-samples-api`模块中定义的接口,会在`dubbo-samples-provider`模块中被具体实现并暴露。 2. **服务消费者(Consumer)** 服务消费者则是调用服务的组件,通过`@Reference`注解引用服务提供者提供的...
dubbo-provider模块是服务提供者部分,它实现了dubbo-api模块中定义的服务接口,并且配置了服务暴露的相关信息,如服务版本、Group、协议、超时时间等。服务提供者在启动时会注册到Zookeeper,等待服务消费者的调用...
2. **Maven**:Dubbo项目通常使用Maven作为构建工具,因此你需要安装Maven并配置好`MAVEN_HOME`环境变量。 3. **ZooKeeper**:Dubbo使用ZooKeeper作为注册中心,用于服务的注册与发现。你需要在本地或者远程服务器...
【Dubbo安装与使用教程】 Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java服务治理框架,它致力于提供一个简单、高效的分布式服务解决方案。在本教程中,我们将深入探讨如何安装并使用Dubbo,以及如何结合...
在Dubbo的XML配置中,DTD定义了一系列的服务、消费者、提供者等核心元素以及它们的属性,这些元素和属性用于描述服务的各个层面,如服务接口、实现类、注册中心、协议、超时、重试等。例如,`<dubbo:service>`元素...
定义服务引用,使用`@Reference`注解标记接口,这样Dubbo会通过Zookeeper找到服务提供者并建立连接。在代码中,可以直接调用服务接口的方法来调用远程服务。 【源码运行】 压缩包内的`dubbo_server`和`dubbo_client...
【标题】"Dubbo使用小例子"涉及到的核心知识点主要集中在分布式服务框架Dubbo的实践应用上。Dubbo是由阿里巴巴开源的高性能、轻量级的服务治理框架,它主要应用于微服务架构中,提供服务的发布、订阅、调用等功能。...
1. **服务定义**:了解如何定义服务接口,这是Dubbo通信的基础。 2. **服务暴露**:学习如何在服务提供者端通过配置暴露服务,包括服务版本、组别、协议等信息。 3. **服务消费**:查看客户端如何通过服务引用获取...
3. `<dubbo:protocol>`:定义服务暴露和消费使用的协议,如dubbo、rmi、http等,以及端口设置。 4. `<dubbo:service>`:用于暴露服务,定义接口、版本、实现类、调用方式、超时时间等参数。 5. `<dubbo:reference>...
5. **集成Spring Boot**:Dubbo可以无缝集成Spring Boot,利用Spring的自动化配置能力,简化Dubbo的使用和运维。 总结,Dubbo作为一款强大的服务治理框架,其设计理念和实现方式为开发者提供了高效、可靠的分布式...
在使用Dubbo时,我们经常会遇到XML配置文件中的标签无法被识别的问题,这通常是因为缺少了对相关XML Schema定义的引用。这里的"**dubbo.xsd**"就是解决这个问题的关键。 XML Schema(简称XSD)是一种用于定义XML...
这些配置通常在`dubbo-admin.properties`文件中定义。 2. **监控数据源**:为了实时监控服务的状态,Dubbo Admin需要从Dubbo服务实例收集监控数据。这些配置也位于`dubbo-admin.properties`文件中。 3. **自定义配置...
【描述】"dubbo-admin 包,使用的时候直接解压放到Tomcat下面的webapps目录下面就可以了"这段描述揭示了dubbo-admin的部署方式。Dubbo-admin作为一个Web应用程序,需要依赖于像Apache Tomcat这样的Servlet容器来运行...
- **服务接口定义**:创建服务接口(API)项目`lk-dubbo-api`,定义服务提供者和消费者之间交互的接口。 - **服务提供者**:在`lk-dubbo-provider`项目中实现服务接口,注册到Dubbo服务注册中心,如Zookeeper。 -...
Dubbo作为一款高性能、轻量级的Java开源服务框架,其在设计和实现过程中广泛使用了XML Schema(简称XSD)来定义服务接口和配置规范。XSD文件是XML文档的模式定义,它为XML提供了结构约束和数据类型定义,使得XML数据...