Dubbo作为阿里巴巴的一个开源架构,其目标是完成传统程序的分布式部署,为大数据并发提供技术支撑。
1、系统架构
消费者:负责订阅注册中心的服务和接收注册中心的通知。另外,消费者能够根据本身的服务记录直接调用生产者的服务。
生产者:对外提供服务和向注册中心注册服务。
注册中心:注册订阅服务和主动发现服务状态并通知。
监控中心:负责监控消费者和生产者的服务调用次数
在消费者、生产者和注册中心维持者长连接,因此注册中心能够及时的了解生产的服务状态,并将其通知到消费者。在生产者和消费者之间的核心因素为通信协议,Dubbo支持的通信协议包括Dubbo、RMI、Hessian、Http、webService、memcached和Redis,其调用都通过代理方式实现。
2、Maven配置
Dubbo项目的版本维护采用Maven,因此在开发之前需要首先配置Maven的依赖关系,配置信息如下:
<dependency>
<groupId>com.alibabagroupId>
<artifactId>dubboartifactId>
<version>2.5.7version>
dependency>
3、最佳实践
Dubbo的实现可以采用配置文件和注解,其官方建议采用XML的配置方式实现。
3.1采用组播技术注册生产者
作为一个快速实现的案例,我们定义一个简单的接口和简单的实现,如下:
public interface GreetingsService {
String sayHi(String name);
}
public class GreetingsServiceImpl implements GreetingsService {
@Override
public String sayHi(String name) {
return "hi, " + name;
}
}
消费者为了进行远程调用,必须与服务方公用服务调用接口。另外,服务方必须依托于服务容器,此案例采用Spring+Tomcat作为容器方。
3.2服务实现后需要将其注册到祖册服务中心:
<dubbo:application name="demo-provider" version="1.0"/>
<dubbo:registry address="multicast://224.1.1.1:9090"/>
<dubbo:protocol name="dubbo" port="20880"/>
<bean id="greetingsService" class="com.baeldung.dubbo.remote.GreetingsServiceImpl"/>
<dubbo:service interface="com.baeldung.dubbo.remote.GreetingsService"
ref="greetingsService"/>
具体参数解析:
注册服务地址为:multicast://224.1.1.1:9090
注册协议采用dubbo,接口采用20880
另,将生产服务接口和实现也通过服务实现。
3.3服务消费者注册
<dubbo:application name="demo-consumer" version="1.0"/>
<dubbo:registry address="multicast://224.1.1.1:9090"/>
<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"
id="greetingsService"/>
3.4 启动服务
public class MulticastRegistryTest {
@Before
public void initRemote() {
ClassPathXmlApplicationContext remoteContext
= new ClassPathXmlApplicationContext("multicast/provider-app.xml");
remoteContext.start();
}
@Test
public void givenProvider_whenConsumerSaysHi_thenGotResponse(){
ClassPathXmlApplicationContext localContext
= new ClassPathXmlApplicationContext("multicast/consumer-app.xml");
localContext.start();
GreetingsService greetingsService
= (GreetingsService) localContext.getBean("greetingsService");
String hiMessage = greetingsService.sayHi("baeldung");
assertNotNull(hiMessage);
assertEquals("hi, baeldung", hiMessage);
}
}
当生产者启动时,Dubbo自动将服务注册到服务中心,本机为组播注册。消费者向注册中心订阅,并创建服务代理调用服务方的服务。此外,消费者也可以直接向服务方发起服务,
<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"
id="greetingsService" url="dubbo://127.0.0.1:20880"/>
4、简单注册服务
组播注册服务适用于服务方和消费方在同一局域网的情景,如果在公网上建议采用单独的注册服务。如果在测试环境,则可以通过简单的注册服务实现;如果在生产环境,建议采用zookeeper实现服务注册于发现。
4.1启动简单注册服务
<dubbo:application name="simple-registry" />
<dubbo:protocol port="9090" />
<dubbo:service interface="com.alibaba.dubbo.registry.RegistryService"
ref="registryService" registry="N/A" ondisconnect="disconnect">
<dubbo:method name="subscribe">
<dubbo:argument index="1" callback="true" />
dubbo:method>
<dubbo:method name="unsubscribe">
<dubbo:argument index="1" callback="true" />
dubbo:method>
dubbo:service>
<bean class="com.alibaba.dubbo.registry.simple.SimpleRegistryService"
id="registryService" />
服务方服务注册替换为:
<dubbo:registry address="127.0.0.1:9090"/>
5、集群服务配置
5.1可以通过Zookeeper实现注册服务集群的配置管理,配置如下
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
另外,在Maven依赖中,需要做如下配置:
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>3.4.11version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.10version>
dependency>
5.2Dubbo支持服务集群的另一个特性是在前端支持负载均衡,配置如下:
<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService" id="greetingsService" loadbalance="roundrobin" /> 通过以上的特性,Dubbo能够实现注册服务的集群化和服务的集群化,从而能够使得服务实现横向的扩展,最终完成大规模集群的应用。 5.3为了保证服务集群的稳定,Dubbo还实现了服务的容灾处理,包括: 失败重连、失败安全、快速重启、失败回复等技术,保证服务的稳定可靠,其配置方式如下: <dubbo:service interface="com.baeldung.dubbo.remote.GreetingsService" ref="greetingsService" cluster="failover"/> <dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService" id="greetingsService" retries="2" timeout="2000" /> 通过以上讲述,我们能够看到Dbubbo作为中台的广阔应用前景。当然,此处也会是作为架构的管中窥豹,向服务的协议、服务的调用 远程代理模式、注册服务、监控等服务还没有深入的讲述,本篇文章仅仅作为Dubbo的入门之作,希望能够帮到大家。 参考文献: http://www.baeldung.com/dubbo
|