本文通過簡單的示例代碼和說明,讓讀者能夠瞭解Mybatis-Plus+Nacos+Dubbo進行遠程RPC調用的簡單使用 預設你已經看過我之前的教程了,並且擁有上個教程完成的項目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638782.html 項目鏈接 ...
本文通過簡單的示例代碼和說明,讓讀者能夠瞭解Mybatis-Plus+Nacos+Dubbo進行遠程RPC調用的簡單使用
預設你已經看過我之前的教程了,並且擁有上個教程完成的項目,
之前的教程 https://www.cnblogs.com/leafstar/p/17638782.html
項目鏈接在最後
1.在bank1的pom文件中引入以下依賴
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency>
2.使用dubboService一般是需要在Service層上進行,現在我們假設bank2的Bank2Service(還沒有新建)提供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為空或用戶不存在"); } user.setAmount(user.getAmount()+amount); int i = user2Mapper.update(user, new LambdaQueryWrapper<User>().eq(User::getName, name)); return i>0?"成功":"失敗"; }
這樣我們的Bank2Service就同時提供RPC服務和本地服務了
3.接下來我們來模擬跨行轉賬
bank1的用戶小明有1000元,向bank2的用戶小紅,原來有800元,轉帳100元
我們現在已經寫好了bank2的賬戶增加金額服務
接下來實現bank1的相關操作
bank1引入以下依賴
<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的遠程服務
@DubboReference
private Bank2Service bank2Service;
在其controller裡面添加以下介面
@GetMapping("/transfer") public String transfer(String from,int amount,String to){ //預設參數不為空,不在校驗 //from賬戶減少金額 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賬戶添加金額 bank2Service.addAmount(to,amount); return "轉賬成功"; }
4.將兩個項目重新運行
此時會報這個錯誤
@Service interfaceClass() or interfaceName() or interface class must be present!
我們需要把bank2的Service實現一個介面,利用這個介面進行RPC調用
bank2中添加以下介面
對服務進行稍微修改如下
接下來將bank1下controller原來寫的
@DubboReference
private Bank2Service bank2Service;
改成
@DubboReference
private Bank2Interface bank2Service;
5.重啟項目,報錯如下
No registry config found or it's not a valid config! The registry config is: <dubbo:registry />
因為我們沒有dubbo配置,接下來進行配置,在兩個項目的配置文件中直接添加下列內容
dubbo: #指定當前服務 # application: # name: bank1 # qos-enable: false #註冊中心 registry: protocol: nacos address: 127.0.0.1:8848 #配置consumer啟動時檢查,check為false時,啟動不檢查,超時配置 #consumer中配置的是全局配置 # 冪等【操作多少次結果都是一樣的,如:查詢、刪除、修改】,在設計系統是應該設置成冪等的 # 非冪等操作【和冪等對立,每次操作的結果不一樣,如:新增,修改】,不能設置成重試 consumer: check: false #重試次數,不算第一次 retries: 3 timeout: 6000 # filter: logDubboConsumerFilter #指定通信規則 protocol: name: dubbo port: 8806 #暴露服務埠(預設20880,不同的服務消費者埠不能重覆) threadpool: cached #暴露服務 provider: filter: -exception loadbalance: leastactive timeout: 6000 #監控中心 # monitor: # protocol: registry
在bank2的啟動類上加上@EnableDubbo註解
至此,項目基本搭建完成,重啟項目,如果遇到埠錯誤,請往下看
nacos中出現下圖代表服務註冊成功
6.可能遇到一個非常奇怪的問題,bank1的nacos配置和bootstrap.yml配置的埠皆是8080,但是bank1就是不使用8080埠而是使用bank2的配置埠
可能是bootstrap文件會先於application文件載入。bank1的bootstrap.yml被bank2的application.yml覆蓋。
解決辦法,在bank1的bootstrap.yml同級目錄下新建application.yml,在裡面指定埠號即可。
在此也感謝某位不願透露姓名的熱心大哥的幫助。最後如下圖
7.ok,重啟項目,一切就緒。開始測試,調用下麵get介面,也可以直接把網址放到瀏覽器中調用
觀察資料庫,確實小明成功減少100,小紅增加了100,
8.至此,我們成功模擬了兩個不同資料庫下的微服務,不同網路下的微服務,通過dubbo進行RPC遠程調用。
9.驗證,在兩個bank項目的配置文件中添加以下配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
重新調用介面,可以看出兩個項目都有輸出,說明確實是bank1引用了bank2的服務,而不是在bank1內部調用的bank2
10.如果你想到這樣可能會導致數據不一致等問題,請看後續文章~~
11.截止目前項目 https://wwta.lanzoub.com/id4BU15p6usb,後續會上傳git
12.後續教程:https://www.cnblogs.com/leafstar/p/17641358.html