最近项目中有用到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"));
}
}