Dubbo入门Demo

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扩展进行加载。

2.Dubbo入门Demo搭建

1.创建一个maven工程,如名叫dubbo-demo-provider,groupId:com.liddhome,artifactId:dubbo-demo-provider,这是服务提供者,其pom.xml依赖内容如下:

<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,代码如下

package com.liddhome.service;

public interface DemoProviderService {

	public String sayhello(String str);
}

再新建包,如com.liddhome.serviceImpl,在该包下建实现类DemoProviderServiceImp,代码如下:

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文件,内容如下:

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

写测试类:

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,然后运行测试类,控制台会显示:

3.消费者

同服务提供者,新建maven项目,dubbo-demo-consumer

pom.xml文件依赖内容:

<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中依赖也有重复,下一篇会进行一些公共内容的抽取,方便项目的管理。

猜你喜欢

转载自my.oschina.net/liddhome/blog/1802570