業務需要整合dubbo,考慮成本,使用現有的redis作爲註冊中心,項目使用的Spring-boot-starter版本2.7.6
步驟:
參考官方中文文檔 http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
1.在項目中導入依賴:(1.服務提供者provider、服務消費者consumer都需要導入以下jar)
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.創建一個module用戶存在dubbo接口,即provider、consumer都需要依賴的,個人建議:不要做任何依賴,越乾淨越好
3.毫無疑問provider、consumer都需要依賴該module
4.分別對provider、consumer進行配置
provider、consumer配置基本一樣,唯一不一樣的地方是dubbo.application.name=xxxx
dubbo:
scan:
base-packages: com.xxxx.ccp.service
registry:
protocol: redis
parameters:
# 指定redis數據庫,別問我爲什麼是這個參數,看源碼發現的
db.index: 1
# 上面配置了redis故直接取值即可,也可以直接寫成 address: root:[email protected]:6379
address: root:${spring.redis.password}@${spring.redis.host}:${spring.redis.port}
cluster: failover
protocol:
# 名字任意
id: xxx-protocol
port: 20880
name: dubbo
application:
# 名字任意
name: xxxx-application
5.剩下就是provider實現上面module中的接口,記得在類上加上@service註解,注意:不是Spring的service註解,是org.apache.dubbo.config.annotation.Service註解
6.服務consumer消費處,直接@Reference注入即可 @註解路徑是org.apache.dubbo.config.annotation.Reference,示例
@Reference
private DubboProviderService dubboProviderService;
啓動順序:
redis服務-> provider -> consumer
遇到的坑
1)
Invalid name="com.alibaba.dubbo.config.ProtocolConfig#0"
原因是
dubbo採用Spring 工具類BeanDefinitionReaderUtils.generateBeanName(builder.getRawBeanDefinition(),register)得到的bean帶有#,而dubbo進行驗證pattern("[\-._0-9a-zA-Z]+"不包含#故報錯
解決辦法:
設置dubbo.protocol.id=xxx # 名稱任意唯一即可
2)開始配置爲
考慮到redis不需要用戶名這樣配置
dubbo:
registry:
protocol: redis
parameters:
db.index: 1
address: 127.0.0.1:6379
password: 123456
啓動報錯提示連接沒有授權,即使配置了password也不行,修改爲如下(加上username隨便寫一值反正沒用)
dubbo:
registry:
protocol: redis
parameters:
db.index: 1
address: 127.0.0.1:6379
username: root
password: 123456
啓動仍然報錯
修改爲如下完美解決:
dubbo:
registry:
protocol: redis
parameters:
db.index: 1
address: root:[email protected]:6379
cluster: failover
爲解決問題,順便看了url解析邏輯,先根據“?”split,然後在判斷有沒有"://",再判斷有沒有"@",每次分隔進行參數封裝