本文通過(guò)簡(jiǎn)單的示例代碼和說(shuō)明,讓讀者能夠了解Mybatis-Plus+Nacos+Dubbo進(jìn)行遠(yuǎn)程RPC調(diào)用的簡(jiǎn)單使用?
默認(rèn)你已經(jīng)看過(guò)我之前的教程了,并且擁有上個(gè)教程完成的項(xiàng)目,
之前的教程?https://www.cnblogs.com/leafstar/p/17638782.html
項(xiàng)目鏈接在最后
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-654835.html
1.在bank1的pom文件中引入以下依賴(lài)
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency>
?
2.使用dubboService一般是需要在Service層上進(jìn)行,現(xiàn)在我們假設(shè)bank2的Bank2Service(還沒(méi)有新建)提供dubboService
新建Bank2Service如下
?代碼如下
@Autowired
private User2Mapper user2Mapper; @Override public String addAmount(String name,int amount){ User user=null; user = user2Mapper.selectOne(new LambdaQueryWrapper<User>().eq(StringUtils.isEmpty(name), User::getName, name)); if (user==null){ throw new RuntimeException("name為空或用戶(hù)不存在"); } user.setAmount(user.getAmount()+amount); int i = user2Mapper.update(user, new LambdaQueryWrapper<User>().eq(User::getName, name)); return i>0?"成功":"失敗"; }
這樣我們的Bank2Service就同時(shí)提供RPC服務(wù)和本地服務(wù)了
?
3.接下來(lái)我們來(lái)模擬跨行轉(zhuǎn)賬
bank1的用戶(hù)小明有1000元,向bank2的用戶(hù)小紅,原來(lái)有800元,轉(zhuǎn)帳100元
我們現(xiàn)在已經(jīng)寫(xiě)好了bank2的賬戶(hù)增加金額服務(wù)
接下來(lái)實(shí)現(xiàn)bank1的相關(guān)操作
bank1引入以下依賴(lài)
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>bank2</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency>
然后在bank1的controller里面添加bank2的遠(yuǎn)程服務(wù)
@DubboReference
private Bank2Service bank2Service;
在其controller里面添加以下接口
@GetMapping("/transfer") public String transfer(String from,int amount,String to){ //默認(rèn)參數(shù)不為空,不在校驗(yàn) //from賬戶(hù)減少金額 User user = user1Mapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getName, from)); user.setAmount(user.getAmount()-amount); user1Mapper.update(user,new LambdaQueryWrapper<User>().eq(User::getName, from)); //to賬戶(hù)添加金額 bank2Service.addAmount(to,amount); return "轉(zhuǎn)賬成功"; }
?
4.將兩個(gè)項(xiàng)目重新運(yùn)行
此時(shí)會(huì)報(bào)這個(gè)錯(cuò)誤
@Service interfaceClass() or interfaceName() or interface class must be present!
我們需要把bank2的Service實(shí)現(xiàn)一個(gè)接口,利用這個(gè)接口進(jìn)行RPC調(diào)用
bank2中添加以下接口
對(duì)服務(wù)進(jìn)行稍微修改如下
?接下來(lái)將bank1下controller原來(lái)寫(xiě)的
@DubboReference
private Bank2Service bank2Service;
改成
@DubboReference
private Bank2Interface bank2Service;
5.重啟項(xiàng)目,報(bào)錯(cuò)如下
No registry config found or it's not a valid config! The registry config is: <dubbo:registry />
因?yàn)槲覀儧](méi)有dubbo配置,接下來(lái)進(jìn)行配置,在兩個(gè)項(xiàng)目的配置文件中直接添加下列內(nèi)容
dubbo: #指定當(dāng)前服務(wù) # application: # name: bank1 # qos-enable: false #注冊(cè)中心 registry: protocol: nacos address: 127.0.0.1:8848 #配置consumer啟動(dòng)時(shí)檢查,check為false時(shí),啟動(dòng)不檢查,超時(shí)配置 #consumer中配置的是全局配置 # 冪等【操作多少次結(jié)果都是一樣的,如:查詢(xún)、刪除、修改】,在設(shè)計(jì)系統(tǒng)是應(yīng)該設(shè)置成冪等的 # 非冪等操作【和冪等對(duì)立,每次操作的結(jié)果不一樣,如:新增,修改】,不能設(shè)置成重試 consumer: check: false #重試次數(shù),不算第一次 retries: 3 timeout: 6000 # filter: logDubboConsumerFilter #指定通信規(guī)則 protocol: name: dubbo port: 8806 #暴露服務(wù)端口(默認(rèn)20880,不同的服務(wù)消費(fèi)者端口不能重復(fù)) threadpool: cached #暴露服務(wù) provider: filter: -exception loadbalance: leastactive timeout: 6000 #監(jiān)控中心 # monitor: # protocol: registry
在bank2的啟動(dòng)類(lèi)上加上@EnableDubbo注解
至此,項(xiàng)目基本搭建完成,重啟項(xiàng)目,如果遇到端口錯(cuò)誤,請(qǐng)往下看
nacos中出現(xiàn)下圖代表服務(wù)注冊(cè)成功
?
6.可能遇到一個(gè)非常奇怪的問(wèn)題,bank1的nacos配置和bootstrap.yml配置的端口皆是8080,但是bank1就是不使用8080端口而是使用bank2的配置端口
可能是bootstrap文件會(huì)先于application文件加載。bank1的bootstrap.yml被bank2的application.yml覆蓋。
解決辦法,在bank1的bootstrap.yml同級(jí)目錄下新建application.yml,在里面指定端口號(hào)即可。
在此也感謝某位不愿透露姓名的熱心大哥的幫助。最后如下圖
?
?7.ok,重啟項(xiàng)目,一切就緒。開(kāi)始測(cè)試,調(diào)用下面get接口,也可以直接把網(wǎng)址放到瀏覽器中調(diào)用
?
觀察數(shù)據(jù)庫(kù),確實(shí)小明成功減少100,小紅增加了100,
?
8.至此,我們成功模擬了兩個(gè)不同數(shù)據(jù)庫(kù)下的微服務(wù),不同網(wǎng)絡(luò)下的微服務(wù),通過(guò)dubbo進(jìn)行RPC遠(yuǎn)程調(diào)用。
?
9.驗(yàn)證,在兩個(gè)bank項(xiàng)目的配置文件中添加以下配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
重新調(diào)用接口,可以看出兩個(gè)項(xiàng)目都有輸出,說(shuō)明確實(shí)是bank1引用了bank2的服務(wù),而不是在bank1內(nèi)部調(diào)用的bank2
?
?
10.如果你想到這樣可能會(huì)導(dǎo)致數(shù)據(jù)不一致等問(wèn)題,請(qǐng)看后續(xù)文章~~
?
11.截止目前項(xiàng)目 https://wwta.lanzoub.com/id4BU15p6usb,后續(xù)會(huì)上傳git
?
12.后續(xù)教程:https://www.cnblogs.com/leafstar/p/17641358.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-654835.html
到了這里,關(guān)于Mybatis-Plus+Nacos+Dubbo進(jìn)行遠(yuǎn)程RPC調(diào)用保姆級(jí)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!