
今天跟大家分享基于Springboot+Dubbo+Nacos 注解方式實作微服務調用 的 知識。
1 項目結構
|-- spring-boot-dubbo-demo (父級工程) |-- spring-boot-dubbo-base (基礎工程) |-- spring-boot-dubbo-consumer (消費者) |-- spring-boot-dubbo-provider (生産者)
SpringBoot版本:2.2.0
Dubbo版本:2.7.0
Nacos版本:1.1.4
2 啟動Nacos注冊中心
Nacos官方文檔:
https://nacos.io/zh-cn/docs/quick-start.html
預設賬号密碼是nacos
3 搭建項目
Consumer和Provider的Maven依賴如下:
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>com.sansgroupId> <artifactId>spring-boot-dubbo-baseartifactId> <version>0.0.1-SNAPSHOTversion> dependency> <dependency> <groupId>org.apache.dubbogroupId> <artifactId>dubbo-spring-boot-starterartifactId> <version>2.7.0version> dependency> <dependency> <groupId>org.apache.dubbogroupId> <artifactId>dubboartifactId> <version>2.7.0version> dependency> <dependency> <groupId>org.apache.dubbogroupId> <artifactId>dubbo-registry-nacosartifactId> <version>2.7.1version> dependency> <dependency> <groupId>com.alibaba.nacosgroupId> <artifactId>nacos-clientartifactId> <version>1.0.0version> dependency>dependencies>
Consumer配置如下:
# 配置端口server: port: 8862dubbo: # 配置服務資訊 application: name: dubbo-consumer # 禁用QOS同一台機器可能會有端口沖突現象 qos-enable: false qos-accept-foreign-ip: false # 配置注冊中心 registry: address: nacos://127.0.0.1:8848 # 設定逾時時間 consumer: timeout: 4000spring: main: # 解決Bean重複定義問題 allow-bean-definition-overriding: true
Provider配置如下:
# 配置端口server: port: 8861dubbo: # 配置服務資訊 application: name: dubbo-provider # 禁用QOS同一台機器可能會有端口沖突現象 qos-enable: false qos-accept-foreign-ip: false # 配置注冊中心 registry: address: nacos://127.0.0.1:8848 # 設定協定-協定由提供方指定消費方被動接受 protocol: name: dubbo port: 20880spring: main: # 解決Bean重複定義問題 allow-bean-definition-overriding: true
4 Base工程編寫
編寫DTO
/** * RPC接口DTO * 注意這裡要實作序列化接口 * @Author Sans * @CreateTime 2019/11/6 23:04 */@Datapublic class ProviderTestDTO implements Serializable { // ID private int id; // 名字 private String name; // 序号 private Integer number;}
編寫Serivce
/** * RPC接口 * @Author Sans * @CreateTime 2019/11/6 23:03 */public interface IProviderService { List queryList();}
編寫傳回結果類
/** * 傳回結果類 * 這裡采用建構者模式建構 * 優點:1.私有化構造器通路範圍小 2.參數可靈活設定便于管理 * @Author Sans * @CreateTime 2019/11/7 18:59 */@Getterpublic class ResultVO<T> implements Serializable { /** * 傳回碼 */ private int code; /** * 傳回資訊 */ private String message; /** * 傳回資料 */ private T data; /** 私有化構造器 **/ private ResultVO() {} private ResultVO(ResultVO resultVO) { this.code = resultVO.code; this.message = resultVO.message; this.data = resultVO.data; } /** * Build */ public static class Builder<T>{ private ResultVO resultVO; public Builder() { resultVO = new ResultVO<>(); } public Builder code(int code){ resultVO.code = code; return this; } public Builder message(String message){ resultVO.message = message; return this; } public Builder data(T data){ resultVO.data = data; return this; } public ResultVO build(){ return new ResultVO<>(resultVO); } }}
5 Provider工程編寫
在啟動類上面不要忘記加上@EnableDubbo注解
@EnableDubbo //開啟Dubbo的注解支援@SpringBootApplicationpublic class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); }}
實作IProviderService接口,注意這裡的Serivce引用的是dubbo的包
/** * 生産者Dubbo接口實作 * @Author Sans * @CreateTime 2019/11/6 23:01 */@Servicepublic class ProviderServiceImpl implements IProviderService { @Override public List queryList() { // 初始化資料 ProviderTestDTO testDTO1 = new ProviderTestDTO(); testDTO1.setId(1); testDTO1.setName("學生"); testDTO1.setNumber(100); ProviderTestDTO testDTO2 = new ProviderTestDTO(); testDTO2.setId(2); testDTO2.setName("教師"); testDTO2.setNumber(101); // 組裝資料 Listlist = new ArrayList<>(); list.add(testDTO1); list.add(testDTO2); return list; }}
6 Consumer工程編寫
和Provider工程的啟動類一樣,加上@EnableDubbo注解
@EnableDubbo //開啟dubbo的注解支援@SpringBootApplicationpublic class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); }}
編寫測試接口
/** * 消費測試接口 * @Author Sans * @CreateTime 2019/11/6 23:09 */@[email protected]("/consumer")public class ConsumerController { // Dubbo遠端調用注解 @Reference private IProviderService providerService; @RequestMapping(value = "/list",method = RequestMethod.GET) public ResultVO getList(){ // 遠端調用 List providerTestDTOList = providerService.queryList(); return new ResultVO.Builder<>().code(200).message("success").data(providerTestDTOList).build(); }}
7 測試
啟動Provider工程和Consumer工程,這個時候Nacos會有對應的服務
使用Postman通路Consumer測試接口
8 項目源碼
碼雲:https://gitee.com/liselotte/spring-boot-dubbo-demoGitHub:https://github.com/xuyulong2017/my-java-demo
如有收獲請劃至底部
點選“在看”支援,謝謝!
關注馬士兵
每天分享技術幹貨
點贊是最大的支援