使用Springboot+Zookeeper演示Dubbo的三種使用方式锭汛,官網(wǎng)有簡單的介紹和示例做裙,這里實戰(zhàn)一番加深理解。
1.準(zhǔn)備工作
1.1安裝Zookeeper
Zookeeper(3.5.6版本)以單機形式在linux上安裝聋迎,并通過命令開啟服務(wù)嫌褪。
開啟zk服務(wù):zkServer.sh start
查看zk服務(wù):zkServer.sh status
備注:Zookeeper在Linux上的安裝可自行百度,這里不做過多介紹祈搜。
不過注意较店,若啟動過程發(fā)生“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】
此時會自動生成一個Springboot項目醋虏。找到項目自動生成的類xxxxApplication和Main方法寻咒,能啟動則表明基礎(chǔ)Springboot項目構(gòu)建完成。
下面基于該項目分別展示Dubbo的三種用法颈嚼。
2 基于XML使用Dubbo
2.1服務(wù)提供者
第一步:在工程“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文件阻课。
第二步:服務(wù)提供者需要提供服務(wù)接口和實現(xiàn)熔脂。
服務(wù)接口:
package com.starry.testxmlprovider.service;
public interface TestDubbo {
String getStr();
}
服務(wù)接口實現(xiàn):
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文件暴露并注冊服務(wù)。
新建provider.xml文件柑肴;并增加如下內(nèi)容:
<?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">
<!--定義了提供方應(yīng)用信息,用于計算依賴關(guān)系旬薯;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字晰骑,方便辨識-->
<dubbo:application name="test-xml-provider" owner="programmer" organization="dubbox"/>
<!--使用 zookeeper 注冊中心暴露服務(wù),注意要先開啟 zookeeper-->
<dubbo:registry address="zookeeper://10.19.50.225:2181"/>
<!-- 用dubbo協(xié)議在20890端口暴露服務(wù) -->
<dubbo:protocol name="dubbo" port="20890" />
<!--使用 dubbo 協(xié)議實現(xiàn)定義好的 api.TestDubbo 接口-->
<dubbo:service interface="com.starry.testxmlprovider.service.TestDubbo" ref="dubboService" protocol="dubbo" />
<!--具體實現(xiàn)該接口的 bean-->
<bean id="dubboService" class="com.starry.testxmlprovider.service.impl.TestDubboImpl"/>
</beans>
該配置文件的目的就是暴露服務(wù)并注冊服務(wù)到zk上绊序。此處簡單演示使用硕舆,至于原理后續(xù)再詳細(xì)解說。
注意:配置文件的頭部http://code.alibabatech.com/schema/dubbo地址已經(jīng)不可用骤公,需要手動維護抚官。先下載dubbo.xsd,然后通過下圖指定映射關(guān)系阶捆。
此時項目的整體目錄結(jié)構(gòu)為:
在啟動類TestXmlProviderApplication中初始化provider.xml配置文件:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
第四步:查看服務(wù)是否注冊成功凌节。
登錄服務(wù)器進(jìn)入zk钦听,通過命令查看zookeeper上是否注冊服務(wù)。
命令直接到zk的bin目錄倍奢,利用命令./zkCli.sh –server ip:port連接客戶端朴上,然后通過命令ls /dubbo查看zk上注冊的服務(wù):
圖上表明服務(wù)已經(jīng)注冊到zk上。
2.2服務(wù)調(diào)用者
第一步:根據(jù)1.2節(jié)生成工程“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>
相比服務(wù)提供者,除了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 協(xié)議調(diào)用定義好的 api.PermissionService 接口-->
<dubbo:reference id="dubboService" interface="com.starry.testxmlprovider.service.TestDubbo"/>
</beans>
用于連接zk具练,并且生成服務(wù)對象。
第三步:啟動類TestXmlConsumerApplication內(nèi)加載consumer.xml文件贴届,獲取服務(wù)對象并調(diào)用其方法靠粪。
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
TestDubbo test = context.getBean(TestDubbo.class);
System.out.println(test.getStr());
啟動springboot項目,可以看到打印出方法返回的內(nèi)容毫蚓。(注意占键,在啟動過程中很可能會報8080端口被占用;這是因為服務(wù)提供者和服務(wù)消費者在一臺機器上啟動元潘,所需只需要在application.properties文件中配置端口為其他即可)
3基于API使用Dubbo
3.1 服務(wù)提供者
第一步:利用1.2節(jié)生成工程“test-api-provider”畔乙,在pom.xml文件內(nèi)增加dubbo和zkClient的依賴,并且新建服務(wù)接口和服務(wù)實現(xiàn)翩概。(同上)
第二步:通過API的方式暴露并注冊服務(wù)牲距,因此通過編碼的方式代替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(); // 服務(wù)暴露
return serviceConfig;
}
}
注意在MyConifg類上添加注解@Configuration钥庇,把類當(dāng)做一個容器牍鞠;@Bean修飾的方法返回的對象注入容器。
第三步:登錄服務(wù)器评姨,查看服務(wù)是否注冊成功难述。
3.2 服務(wù)消費者
第一步:根據(jù)1.2節(jié)生成工程“test-api-consumer”,在pom.xml文件增加dubbo和zkClient的依賴吐句,同時添加“test-api-provider”架包的依賴胁后。(架包提前通過maven命令上傳至本地倉庫)。
第二步:通過api的方式代替xml文件的形式調(diào)用服務(wù)嗦枢。
增加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(); // 調(diào)用服務(wù)
System.out.println(testDubbo.getStr());
return referenceConfig;
}
}
控制臺打印方法返回的內(nèi)容即表明遠(yuǎn)程調(diào)用成功攀芯。
API方式實現(xiàn)Dubbo的使用比較易懂,直接以對象的形式注冊服務(wù)和調(diào)用服務(wù)文虏,也是XML和注解的底層實現(xiàn)形式侣诺。
4基于注解和YML使用Dubbo
4.1 服務(wù)生產(chǎn)者
第一步:根據(jù)1.2小節(jié)生成工程“test-yml-provider”殖演,在pom.xml文件內(nèi)增加dubbo和zkClient架包的依賴。
第二步:在服務(wù)提供端新增服務(wù)接口和服務(wù)實現(xiàn)類紧武,接口同上剃氧,注意下面的服務(wù)實現(xiàn)類:
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";
}
}
服務(wù)實現(xiàn)類增加注解@Service以及注解相關(guān)元素,該注解為dubbo包中提供的注解阻星,與Spring框架的@Service有很大區(qū)別朋鞍。它的主要作用是作為一個服務(wù)注冊到zk上,具體注冊過程后續(xù)分析妥箕。
第三步:通過.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格式的文件對空格要求比較嚴(yán)格畦幢,注意縮進(jìn)空格坎吻。
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
第四步:登錄服務(wù)器查看服務(wù)是否注冊成功。
4.2 服務(wù)消費者
第一步:根據(jù)1.2小節(jié)生成工程“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指向使用服務(wù)的package.
第三步:新建Client類诸尽,通過web驗證調(diào)用成功。
@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架包提供訪問服務(wù)的方式印颤。具體原理后續(xù)再詳細(xì)分析您机。
5.總結(jié)
Dubbo提供三種使用方式,方便我們根據(jù)不同場景選擇合適的方式年局。Dubbo使用的關(guān)鍵在于服務(wù)如何注冊到Zookeeper际看,以及服務(wù)如何調(diào)用;三種不同的方式表明Dubbo團隊在底層實現(xiàn)了三種邏輯矢否,具體注冊原理和調(diào)用原理下一篇接著分析仲闽。