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扩展进行加载。java
1.建立一个maven工程,如名叫dubbo-demo-provider,groupId:com.liddhome,artifactId:dubbo-demo-provider,这是服务提供者,其pom.xml依赖内容以下:spring
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.46</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.0.35.Final</version> </dependency> </dependencies>
在src下新建包,如com.liddhome.service,在该包下建接口类DemoProviderService,代码以下apache
package com.liddhome.service; public interface DemoProviderService { public String sayhello(String str); }
再新建包,如com.liddhome.serviceImpl,在该包下建实现类DemoProviderServiceImp,代码以下:json
package com.liddhome.serviceImpl; import com.liddhome.service.DemoProviderService; public class DemoProviderServiceImp implements DemoProviderService{ @Override public String sayhello(String str) { return str+"dubbo-zookeeper"; } }
在项目的resource下面新建dubbo-demo-provider.xml文件,内容以下:api
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/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-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="demo-provider"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:protocol name="dubbo" port="20881"/> <bean name="demoProvider" class="com.liddhome.serviceImpl.DemoProviderServiceImp"/> <dubbo:service interface="com.liddhome.service.DemoProviderService" ref="demoProvider"/> </beans>
写测试类:app
package dubbotest; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ProviderTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-demo-provider.xml"}); context.start(); System.out.println("Provider:20881注册服务成功!"); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // press any key to exit context.close(); } }
下载zookeeper,并启动zookeeper,而后运行测试类,控制台会显示:负载均衡
同服务提供者,新建maven项目,dubbo-demo-consumer框架
pom.xml文件依赖内容:maven
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.46</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.0.35.Final</version> </dependency> </dependencies>
在src下新建包,com.liddhome.service分布式
把服务提供者的接口类拷过来
package com.liddhome.service; public interface DemoProviderService { public String sayhello(String str); }
新建dubbo-demo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/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-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="demo-consumer"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference id="demoProviderService" check="false" interface="com.liddhome.service.DemoProviderService"/> </beans>
新建测试类:
package consumertest; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.liddhome.service.DemoProviderService; public class ConsumerTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-demo-consumer.xml"}); context.start(); DemoProviderService demoService = (DemoProviderService) context.getBean("demoProviderService"); // get remote service proxy String result = demoService.sayhello("Hello "); System.out.println("远程调用结果是:"+result); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } context.close(); } }
启动测试类去消费消费者提供的服务,咱们只定义了消费者的接口,但并无实现该接口,这是消费的是服务提供者提供的接口实现:
OK,一个demo实现了,但这一个接口写了两次,有重复,还有项目的pom中依赖也有重复,下一篇会进行一些公共内容的抽取,方便项目的管理。