前言:官网文档有一重要章节SPI,建立好好阅读,为本文做铺垫
1.搭建工程,结构如下:

dubbo-learn —> 父pom
dubbo-api —> 服务提供者和消费者共同依赖对接口api
dubbo-provide1,2,3 —> 分别是3个服务提供者
dubbo-consumer —> 服务消费者
1.1) dubbo-learn对应pom
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.1.RELEASE
org.example
dubbo-learn
1.0.0
pom
dubbo-provide1
dubbo-provide2
dubbo-provide3
dubbo-consumer
org.springframework.boot
spring-boot-starter-data-redis
2.3.1.RELEASE
org.apache.dubbo
dubbo-spring-boot-starter
2.7.6
compile
redis.clients
jedis
2.8.1
compile
com.example
dubbo-api
1.0.0
1.2) dubbo-api层pom
4.0.0
com.example
dubbo-api
1.0.0
1.3) dubbo-consumer层pom
4.0.0
org.example
dubbo-learn
1.0.0
dubbo-consumer
dubbo-consumer
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-aop
2.2.6.RELEASE
org.springframework.boot
spring-boot-maven-plugin
1.4) dubbo-privode1,2,3对应pom一样,如下:
4.0.0
org.example
dubbo-learn
1.0.0
com.example
dubbo-provide1
1.0.0
dubbo-provide1
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-maven-plugin
1.5)dubbo-consumer 配置文件application.yml
dubbo:
scan:
base-packages: com.example.dubbo
registry:
protocol: redis
parameters:
# 指定redis数据库,别问我为什么是这个参数,看源码发现的
db.index: 15
# 上面配置了redis故直接取值即可,也可以直接写成 address: root:123456@127.0.0.1:6379
address: root:${spring.redis.password}@${spring.redis.host}:${spring.redis.port}
cluster: failover
protocol:
# 名字任意
id: dubbo-executor
port: 20880
name: cust
application:
# 名字任意
name: consumer
consumer:
# 自定义调用提供者负载均衡模式,再未进行自定义的情况下先注释
# loadbalance: cust
spring:
redis:
host: 127.0.0.1
password: 123456
port: 6379
database: 3
server:
port: 12000
1.6)dubbo-provide1,2,3 对应pom文件,注意修改端口号
dubbo:
scan:
base-packages: com.example.dubbo
registry:
protocol: redis
parameters:
# 指定redis数据库,别问我为什么是这个参数,看源码发现的
db.index: 15
# 上面配置了redis故直接取值即可,也可以直接写成 address: root:123456@127.0.0.1:6379
address: root:${spring.redis.password}@${spring.redis.host}:${spring.redis.port}
cluster: failover
protocol:
# 名字任意
id: dubbo-executor
port: 20881
name: dubbo
application:
# 名字任意
name: provide1
spring:
redis:
host: 127.0.0.1
password: 123456
port: 6379
database: 3
server:
port: 12001
笔者是本地测试,因此需要修改这2处
注意:provide1,2,3配置文件有2处需要修改端口号,1)dubbo.protocol.port: xxx ; 2) server.port: xxx ;
1.7)分别在各个模块入口类在添加注解@EnableDubbo
示例:
2.在dubbo-api层新建接口

3.在dubbo-provide1,2,3模块中分别实现该接口



4.dubbo-consumer写一个消费接口

以上就已经完成了一个消费者对应多个提供者骨架,
编译顺序
1)dubbo-api —> clear install
2)dubbo-learn —> clear install
启动顺序是:
1)启动redis
2)启动dubbo-provide1,2,3
3)启动dubbo-consumer
4)测试
5.自定义负载均衡策略

说明:第4步再建一层dubbo文件夹时,其实也可以建一个名为services文件夹,效果是一样的

在新建的纯文本文件里输入:
cust=com.example.dubbo.balance.CustomLoadBalance
格式:别名=自定义类全类名
6.修改dubbo-consumer配置,

完成,进行测试。
遇到的问题:
1)dubbo版本对应的jedis不应太高,否则会报错找不到redis/clients/util/Pool
解决办法:降低jedis版本到2.8.1(2.8.0也行自行选择,不要高于2.9.0)
2)自定义负载均衡不生效
可能原因:
a)可能是文件层级不对,应该分开建META-INF,在建dubbo文件夹
b)配置错误,在消费端配置调用到提供端负载,应该配置dubbo.consumer.loadbalance,而不是配置dubbo.provider.loadbalance
写的很乱有问题可以留言,看到后会回复
学习源码在gitee上:https://gitee.com/vick-chow/dubbo-learn.git