使用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包。
io.dubbo.springboot
spring-boot-starter-dubbo
1.0.0
com.101tec
zkclient
0.7
org.springframework.boot
spring-boot-maven-plugin
true
注意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文件;并增加如下内容:
该配置文件的目的就是暴露服务并注册服务到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文件新增依赖包。
io.dubbo.springboot
spring-boot-starter-dubbo
1.0.0
com.101tec
zkclient
0.7
test-xml
test-xml-provider
0.0.1
相比服务提供者,除了dubbo和zkClient包外,还需要依赖provider的jar包。(jar包须手动上传至本地仓库)
第二步:新增consumer.xml配置文件。
用于连接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 serviceConfig() {
ServiceConfig 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 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 referenceConfig() {
ReferenceConfig 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命令上传至本地仓库)。
test-yml
test-yml-provider
0.0.1
第二步:通过.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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。