最近聽(tīng)聞公司的項(xiàng)目打算進(jìn)行重構(gòu),大佬們商量準(zhǔn)備使用近年大火的SpringCloud,所以在開(kāi)始學(xué)習(xí)Springcloud前急鳄,先來(lái)復(fù)習(xí)下之前項(xiàng)目中使用到的Dubbo+Zookeeper。之前的項(xiàng)目很老使用的Spring+Struct2搭建的堰酿,使用Dubbo2.5.3都是基于xml配置的疾宏,就想嘗試最新的springboot+dubbo+yml配置來(lái)搭建,并想看下老版本提供服務(wù)触创,在新的消費(fèi)者是否能獲取成功消費(fèi)坎藐。
Dubbo官方也在3年之后的17年連發(fā)了5個(gè)版本,在dubbo2.5.7之前也早已支持通過(guò)注解@Server暴露服務(wù)和@Reference消費(fèi)服務(wù)(但是我們老項(xiàng)目并沒(méi)有使用 = =)哼绑,在2.5.7中Dubbo團(tuán)隊(duì)通過(guò)增加了一個(gè)@DubboComponentScan修復(fù)了一些通過(guò)注解暴露消費(fèi)服務(wù)產(chǎn)生的Issues,具體產(chǎn)考:Dubbo 注解驅(qū)動(dòng)(Annotation-Driven) 顺饮,有興趣的同學(xué)可以看下,這篇文章主要是使用Dubbo2.5.8中提供的spring-boot-starter-dubbo來(lái)搭建Dubbo凌那。這里服務(wù)注冊(cè)中心使用Zookeeper,Zookeeper的相關(guān)問(wèn)題不清楚的同學(xué)可以自行百度吟逝,有很多資料帽蝶。
需要新建兩個(gè)maven的SpringBoot項(xiàng)目,通過(guò)SpringBoot官方提供的快速搭建項(xiàng)目的網(wǎng)站:SPRING INITIALIZR ,很容易的搭建出一個(gè)基本的SpringBoot項(xiàng)目,為了方便我們后面通過(guò)頁(yè)面測(cè)試励稳,項(xiàng)目中添加上web依賴(lài),如下圖:
- 項(xiàng)目依賴(lài)(除了基本的SpringBoot依賴(lài)佃乘,服務(wù)提供者和消費(fèi)者的依賴(lài)都是一樣)
<!--dubbo-springBoot依賴(lài)-->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<!--zookeeper依賴(lài)-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<!--服務(wù)接口Jar-->
<dependency>
<groupId>com.aspire.aplus</groupId>
<artifactId>sim</artifactId>
<version>1.3.3</version>
</dependency>
這里說(shuō)明下,最后一個(gè)依賴(lài)服務(wù)接口jar是服務(wù)接口暴露的驹尼,是自己搭建的一個(gè)項(xiàng)目打成jar放到自己鏡像庫(kù)趣避,里面主要是一些服務(wù)的interface接口。沒(méi)有自己Maven鏡像庫(kù)的同學(xué)新翎,可以把這個(gè)項(xiàng)目打成jar手動(dòng)導(dǎo)入到項(xiàng)目依賴(lài)中程帕。(所以不止倆個(gè)項(xiàng)目,還需要一個(gè)服務(wù)接口項(xiàng)目地啰。)
-
服務(wù)接口項(xiàng)目及DemoService接口code
1.服務(wù)提供者dubboProvide:
- 服務(wù)提供者yml配置文件
server:
port: 8086
spring:
dubbo:
application: #應(yīng)用配置愁拭,用于配置當(dāng)前應(yīng)用信息,不管該應(yīng)用是提供者還是消費(fèi)者亏吝。
name: Provide
registry: #注冊(cè)中心配置岭埠,用于配置連接注冊(cè)中心相關(guān)信息。
address: zookeeper://127.0.0.1:2181
protocol: #協(xié)議配置蔚鸥,用于配置提供服務(wù)的協(xié)議信息惜论,協(xié)議由提供方指定,消費(fèi)方被動(dòng)接受止喷。
name: dubbo
port: 20880
scan: com.dubboProvide.dubboProvide.service #服務(wù)暴露與發(fā)現(xiàn)消費(fèi)所在的package
-
服務(wù)提供者項(xiàng)目結(jié)構(gòu)
- 服務(wù)接口實(shí)現(xiàn)
編寫(xiě)Dubbo服務(wù)馆类,只需要添加要發(fā)布的服務(wù)實(shí)現(xiàn)上添加@Service,如下:
package com.dubboProvide.dubboProvide.service.imp;
import com.alibaba.dubbo.config.annotation.Service;
import com.aspire.aplus.service.DemoService;
@Service(version = "1.0.0")
public class DemoServerImp implements DemoService {
@Override
public String sayHello(String s) {
return "你好启盛,"+s+"!";
}
}
2 服務(wù)消費(fèi)者dubboConsumer:
- 服務(wù)提供者yml配置文件
server:
port: 8085
spring:
dubbo:
application: #應(yīng)用配置蹦掐,用于配置當(dāng)前應(yīng)用信息,不管該應(yīng)用是提供者還是消費(fèi)者僵闯。
name: Consumer
registry: #注冊(cè)中心配置卧抗,用于配置連接注冊(cè)中心相關(guān)信息。
address: zookeeper://127.0.0.1:2181
protocol: #協(xié)議配置鳖粟,用于配置提供服務(wù)的協(xié)議信息社裆,協(xié)議由提供方指定,消費(fèi)方被動(dòng)接受向图。
name: dubbo
port: 20880
scan: com.dubboconsumer.dubboConsumer.service #服務(wù)暴露與發(fā)現(xiàn)消費(fèi)所在的package
-
服務(wù)消費(fèi)者項(xiàng)目結(jié)構(gòu)
- 服務(wù)消費(fèi)者
引用Dubbo服務(wù)泳秀,只需要添加要發(fā)布的服務(wù)實(shí)現(xiàn)上添加@Reference,如下:
package com.dubboconsumer.dubboConsumer.service.imp;
import com.alibaba.dubbo.config.annotation.Reference;
import com.aspire.aplus.service.DemoService;
import org.springframework.stereotype.Component;
@Component
public class DubboTestService {
@Reference(version = "1.0.0")
public DemoService demoService;
public String Echo(String s){
String ret_msg;
try {
ret_msg = demoService.sayHello(s);
}catch (Exception e){
e.printStackTrace();
ret_msg = "出錯(cuò)啦榄攀!";
}
return ret_msg;
}
}
- 頁(yè)面接口
接口去調(diào)用獲取了dubbo服務(wù)的DubboTestService嗜傅,在DubboTestService 再調(diào)用遠(yuǎn)程dubbo服務(wù)demoService的sayHello()方法
package com.dubboconsumer.dubboConsumer.controller;
import com.dubboconsumer.dubboConsumer.service.imp.DubboTestService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class DubboTestController {
@Resource
private DubboTestService dubboTestService;
@RequestMapping(value = "hello/{name}",method = RequestMethod.GET)
public String Hello(@PathVariable String name){
return dubboTestService.Echo(name);
}
}
3 驗(yàn)證
將兩個(gè)項(xiàng)目逐一啟動(dòng)(先啟動(dòng)服務(wù)提供者dubboProvide后啟動(dòng)服務(wù)消費(fèi)者dubboConsumer),打開(kāi)瀏覽器檩赢,輸入消費(fèi)者提供的接口:localhost:8085/hello/小咩,結(jié)果如下:
emmm...到這里說(shuō)明最基本的dubbo項(xiàng)目搭建成功啦吕嘀。成功的在dubboConsumer項(xiàng)目中調(diào)用了在dubboProvide提供的業(yè)務(wù)代碼。
上面說(shuō)的老版本dubbo提供的服務(wù)是否能在新版本中使用,經(jīng)過(guò)嘗試偶房,答案是肯定趁曼,過(guò)程踩了個(gè)坑,其中最主要的還是配置文件問(wèn)題棕洋,yml文件寫(xiě)的不符合規(guī)范導(dǎo)致挡闰,可以看下我另一篇文章寫(xiě)到的:yml配置文件讀取出錯(cuò) Exception in thread "main" while scanning for the next token found character '\t(TAB)' 。
文章到此就結(jié)束了掰盘,寫(xiě)下這篇文章主要是當(dāng)做一個(gè)筆記摄悯,同時(shí)也希望能幫助到一些剛接觸dubbo的同學(xué)。有什么錯(cuò)誤還希望各位能夠幫我指出庆杜,大家共同進(jìn)步射众。^ ^