Dubbo|注解/API/XML三种使用方式

使用Springboot+Zookeeper演示Dubbo的三种使用方式,官网有简单的介绍和示例,这里实战一番加深理解。

1.准备工作

1.1安装Zookeeper

Zookeeper(3.5.6版本)以单机形式在linux上安装,并通过命令开启服务。
开启zk服务:zkServer.sh start

开启zk服务


查看zk服务:zkServer.sh status

查看zk服务


备注:Zookeeper在Linux上的安装可自行百度,这里不做过多介绍。不过注意,若启动过程发生“org.apache.zookeeper.server.quorum.QuorumPeerMain”异常且zk版本为3.5.5以上,请下载带有“-bin”的安装包,因为普通的tar.gz包只有源码而没有编译

 

1.2生成Springboot项目

利用IDEA自带的“Spring Initializr”生成Springboot项目,填写Group和Artifact信息,点击next直到finish。【提前配置JDK和Maven】

 

idea生成springboot

 

此时会自动生成一个Springboot项目。找到项目自动生成的类xxxxApplication和Main方法,能启动则表明基础Springboot项目构建完成。
下面基于该项目分别展示Dubbo的三种用法。

2 基于XML使用Dubbo

2.1服务提供者

第一步:在工程“test-xml-provider”的pom.xml文件中引入dubbo和zkClient的jar包。

 

<!-- 整合dubbo -->
<dependency>
    <groupId>io.dubbo.springboot</groupId>
    <artifactId>spring-boot-starter-dubbo</artifactId>
    <version>1.0.0</version>
</dependency>

<!-- zookeeper客户端 -->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.7</version>
</dependency>

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

注意maven-plugin插件需要配置configuration属性,springboot工程在maven打包时就不会生成boot-inf文件。

第二步:服务提供者需要提供服务接口和实现。
服务接口:

 

package com.starry.testxmlprovider.service;

public interface TestDubbo {
    String getStr();
}

服务接口实现:

 

package com.starry.testxmlprovider.service.impl;

import com.starry.testxmlprovider.service.TestDubbo;

public class TestDubboImpl implements TestDubbo {

    @Override
    public String getStr() {
        return "hello world...test xml provider";
    }
}

第三步:通过XML文件暴露并注册服务。
新建provider.xml文件;并增加如下内容:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
    <dubbo:application name="test-xml-provider" owner="programmer" organization="dubbox"/>
    <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
    <dubbo:registry address="zookeeper://10.19.50.225:2181"/>
    <!-- 用dubbo协议在20890端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20890" />
    <!--使用 dubbo 协议实现定义好的 api.TestDubbo 接口-->
    <dubbo:service interface="com.starry.testxmlprovider.service.TestDubbo" ref="dubboService" protocol="dubbo" />
    <!--具体实现该接口的 bean-->
    <bean id="dubboService" class="com.starry.testxmlprovider.service.impl.TestDubboImpl"/>
</beans>

该配置文件的目的就是暴露服务并注册服务到zk上。此处简单演示使用,至于原理后续再详细解说。

注意:配置文件的头部http://code.alibabatech.com/schema/dubbo地址已经不可用,需要手动维护。先下载dubbo.xsd,然后通过下图指定映射关系。

指定映射关系

 

此时项目的整体目录结构为:

 

目录结构

在启动类TestXmlProviderApplication中初始化provider.xml配置文件:

 

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();

第四步:查看服务是否注册成功。
登录服务器进入zk,通过命令查看zookeeper上是否注册服务。
命令直接到zk的bin目录,利用命令./zkCli.sh –server ip:port连接客户端,然后通过命令ls /dubbo查看zk上注册的服务:

zk服务


图上表明服务已经注册到zk上。

 

2.2服务调用者

第一步:根据1.2节生成工程“test-xml-consumer”,并在pom.xml文件新增依赖包。

 

<!-- 整合dubbo -->
<dependency>
    <groupId>io.dubbo.springboot</groupId>
    <artifactId>spring-boot-starter-dubbo</artifactId>
    <version>1.0.0</version>
</dependency>

<!-- zookeeper客户端 -->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.7</version>
</dependency>

<!-- test-xml-provider -->
<dependency>
    <groupId>test-xml</groupId>
    <artifactId>test-xml-provider</artifactId>
    <version>0.0.1</version>
</dependency>

相比服务提供者,除了dubbo和zkClient包外,还需要依赖provider的jar包。(jar包须手动上传至本地仓库

第二步:新增consumer.xml配置文件。

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <dubbo:application name="test-xml-consumer" owner="programmer" organization="dubbox"/>
    <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
    <dubbo:registry address="zookeeper://10.19.50.225:2181"/>
    <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
    <dubbo:reference id="dubboService" interface="com.starry.testxmlprovider.service.TestDubbo"/>
</beans>

用于连接zk,并且生成服务对象。

第三步:启动类TestXmlConsumerApplication内加载consumer.xml文件,获取服务对象并调用其方法。

 

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
TestDubbo test = context.getBean(TestDubbo.class);
System.out.println(test.getStr());

启动springboot项目,可以看到打印出方法返回的内容。(注意,在启动过程中很可能会报8080端口被占用;这是因为服务提供者和服务消费者在一台机器上启动,所需只需要在application.properties文件中配置端口为其他即可)

3基于API使用Dubbo

3.1 服务提供者

第一步:利用1.2节生成工程“test-api-provider”,在pom.xml文件内增加dubbo和zkClient的依赖,并且新建服务接口和服务实现。(同上)

第二步:通过API的方式暴露并注册服务,因此通过编码的方式代替provider.xml文件的配置。
新增加类MyConfig.class:

 

@Configuration
public class MyConifg {

    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("test-api-provider");
        System.out.println("application init...");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("10.19.50.225");
        registryConfig.setPort(2181);
        registryConfig.setProtocol("zookeeper");
        registryConfig.setCheck(false);
        return registryConfig;
    }

    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20890);
        return protocolConfig;
    }

    @Bean
    public ServiceConfig<TestDubbo> serviceConfig() {
        ServiceConfig<TestDubbo> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(TestDubbo.class);
        serviceConfig.setRef(new TestDubboImpl());
        serviceConfig.setApplication(applicationConfig());
        serviceConfig.setProtocol(protocolConfig());
        serviceConfig.setRegistry(registryConfig());
    
        // 方法属性
        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getStr");
        methodConfig.setTimeout(3000);
        methodConfig.setRetries(3);
    
        List<MethodConfig> list = new ArrayList<>();
        list.add(methodConfig);
    
        serviceConfig.setMethods(list);
        serviceConfig.export();  // 服务暴露
        return serviceConfig;
    }

}

注意在MyConifg类上添加注解@Configuration,把类当做一个容器;@Bean修饰的方法返回的对象注入容器。

第三步:登录服务器,查看服务是否注册成功。

查看服务注册

 

3.2 服务消费者

第一步:根据1.2节生成工程“test-api-consumer”,在pom.xml文件增加dubbo和zkClient的依赖,同时添加“test-api-provider”架包的依赖。(架包提前通过maven命令上传至本地仓库)。

第二步:通过api的方式代替xml文件的形式调用服务。
增加MyConfig.class

 

@Configuration
public class MyConfig {

    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("test-api-consumer");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("10.19.50.225:2181");
        registryConfig.setProtocol("zookeeper");
        return registryConfig;
    }

    @Bean
    public ConsumerConfig consumerConfig() {
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setTimeout(10000);
        consumerConfig.setCheck(false);
        return consumerConfig;
    }

    @Bean
    public ReferenceConfig<TestDubbo> referenceConfig() {
        ReferenceConfig<TestDubbo> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(TestDubbo.class);
        referenceConfig.setApplication(applicationConfig());
        referenceConfig.setRegistry(registryConfig());
        TestDubbo testDubbo = referenceConfig.get();  // 调用服务
        System.out.println(testDubbo.getStr());
        return referenceConfig;
    }
}

控制台打印方法返回的内容即表明远程调用成功。

API方式实现Dubbo的使用比较易懂,直接以对象的形式注册服务和调用服务,也是XML和注解的底层实现形式。

4基于注解和YML使用Dubbo

4.1 服务生产者

第一步:根据1.2小节生成工程“test-yml-provider”,在pom.xml文件内增加dubbo和zkClient架包的依赖。

第二步:在服务提供端新增服务接口和服务实现类,接口同上,注意下面的服务实现类:

 

import com.alibaba.dubbo.config.annotation.Service;
import com.starry.testymlprovider.service.TestDubbo;

@Service(version = "1.0.0", timeout = 3000, retries = 3)
public class TestDubboImpl implements TestDubbo {
    @Override
    public String getStr() {
        return "hello world... test yml provider";
    }
}

服务实现类增加注解@Service以及注解相关元素,该注解为dubbo包中提供的注解,与Spring框架的@Service有很大区别。它的主要作用是作为一个服务注册到zk上,具体注册过程后续分析。

第三步:通过.properties或者.yml格式的配置文件代替xml文件或者api方式连接ZK,下面分别是.yml格式的配置文件和.properties格式的配置文件。

 

server:
  port: 8080
spring:
  dubbo:
    application:
      name: test-yml-provider
    registry:
      address: zookeeper://10.19.50.225
      port: 2181
    protocol:
      name: dubbo
      port: 20890
    scan: com.starry.testymlprovider.service.impl

注意:yml格式的文件对空格要求比较严格,注意缩进空格。

 

server.port=8080
spring.dubbo.application.name= test-yml-provider
spring.dubbo.registry.address= zookeeper://10.19.50.225
spring.dubbo.registry.port= 2181
spring.dubbo.protocol.name= dubbo
spring.dubbo.protocol.port= 20890
spring.dubbo.scan=com.starry.testymlprovider.service.impl

第四步:登录服务器查看服务是否注册成功。

查看服务

 

4.2 服务消费者

第一步:根据1.2小节生成工程“test-yml-consumer”,在pom.xml文件增加dubbo和zkClient的依赖,并添加“test-yml-provider”工程的架包(提前通过maven命令上传至本地仓库)。

 

<dependency>
    <groupId>test-yml</groupId>
    <artifactId>test-yml-provider</artifactId>
    <version>0.0.1</version>
</dependency>

第二步:通过.yml格式的配置文件连接zk。

 

server:
  port: 8081
spring:
  dubbo:
    application:
      name: test-yml-consumer
    registry:
      address: zookeeper://10.19.50.225
      port: 2181
    scan: com.starry.testymlconsumer

scan指向使用服务的package.

第三步:新建Client类,通过web验证调用成功。

 

@RestController
public class Client {

    @Reference(version = "1.0.0", timeout = 3000, retries = 3)
    private TestDubbo testDubbo;

    @RequestMapping("/hello")
    public String doThing(){
        return testDubbo.getStr();
    }
}

@Reference注解是dubbo架包提供访问服务的方式。具体原理后续再详细分析。

5.总结

Dubbo提供三种使用方式,方便我们根据不同场景选择合适的方式。Dubbo使用的关键在于服务如何注册到Zookeeper,以及服务如何调用;三种不同的方式表明Dubbo团队在底层实现了三种逻辑,具体注册原理和调用原理下一篇接着分析。



作者:邵小星要努力
链接:https://www.jianshu.com/p/150c11275a9e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值