`

dubbo框架例子探究

阅读更多

       最近项目中有用到dubbo技术框架作为分布式服务的架子,作为用了一段时间的使用者来讲,dubbo确实是一个不错的SOA框架,用着很舒服,而且还比较轻量,这里写一个例子来简单介绍一下dubbo.

      在任何的SOA框架中,面向服务都得需要三个参与者,第一个是服务提供者,第二个是消费者,第三个是提供服务路由的服务监控者。在dubbo中同样也是基于这三部分的。

      1.服务提供者:基于接口编程,提供对该接口的实现,把接口注册到注册中心。

      2.注册中心:提供服务路由的管理中心,方便消费者找到提供者

      3.消费者:根据路由到的服务提供者,调用接口服务实现。

      Dubbo的路由规则,在服务中有接口类、组名、版本号唯一定位一个服务,大体的格式如下:

        com.DemoService/group1/0.0.1,如果对于同一个服务有不同的实现,可以通过组名和版本号区分,而消费者在调用服务时,也是需要指定对应的组名和版本号。

     以下是一个很简单的例子:

     首先是服务端:

      1.先定义一个接口类

       

package service;

public interface DemoService {

	public String sayHello(String name);
}

    2.增加一个该接口的实现

   

import service.DemoService;


public class DemoServiceImpl implements DemoService{

	@Override
	public String sayHello(String name) {
		// TODO Auto-generated method stub
		return "你好," + name;
	}

}

    3.服务暴露

    对于服务的暴露,有一个地方是要注意的,就是最后一句话System.out.println("暴露成功");dubbo服务是需要一直提供的,这句话的含义就是为了阻塞线程。但是在linux后台启动服务的方式下,这样的方式有时候是不起作用的,根据线程阻塞的原理,使用了第二种的方式,以下会有介绍。

import java.io.IOException;

import service.DemoService;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;


public class Main {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//加载应用配置
    	ApplicationConfig config = new ApplicationConfig();
    	config.setName("1111");
    	
    	RegistryConfig registry = new RegistryConfig();
    	//registry.setProtocol(iniUtil.getValue("zookeeper.protocol"));
    	registry.setAddress("zookeeper://192.168.6.184:2181");
    	
    	ProtocolConfig protocol = new ProtocolConfig();
    	protocol.setName("dubbo");
    	protocol.setPort(20191);
    	protocol.setThreads(200);
    	
    	//应用服务启动
    	DemoService service = new DemoServiceImpl();
    	ServiceConfig<DemoService> appService = new ServiceConfig<DemoService>();
    	appService.setApplication(config);
    	appService.setRegistry(registry);
    	appService.setProtocol(protocol);
    	appService.setInterface(DemoService.class);
    	appService.setRef(service);
    	//增加组名和版本
//    	appService.setGroup("group1");
//    	appService.setVersion("0.0.1");
    	
    	
    	appService.export();
    	System.out.println("暴露成功");
    	
    	System.in.read();
	}

}

   线程阻塞方式

synchronized (obj) {
			try {
				obj.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

    再看看注册中心

1.对于注册中心,只需要启动zookeeper即可,真正的配置是在消费者和提供者中配置的。

  registry.setAddress("zookeeper://192.168.6.184:2181");

这里要注意正确地址的写法,zookeeper要写完整

 

再来看看消费者

消费者只需要提供注册中心地址,以及要获取的服务接口(如有需要组名和版本号也是需要的),就可以直接获取服务调用了。

import service.DemoService;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;


public class ClientMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// 当前应用配置
		ApplicationConfig application = new ApplicationConfig();
		application.setName("yyy");

		// 连接注册中心配置
		RegistryConfig registry = new RegistryConfig();
		registry.setAddress("zookeeper://192.168.6.184:2181");

		// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接

		// 引用远程服务
		ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
		reference.setApplication(application);
		reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
		reference.setInterface(DemoService.class);

		// 和本地bean一样使用xxxService
		DemoService re = reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
	
		System.out.println(re.sayHello("ss"));
	}

}

 

  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics