Spring Boot整合Dubbo
1.环境依赖
Dubbo是一种嵌入式的去中心化的架构,其引入的依赖:
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.8</version>
</dependency>
maven依赖图
- dubbo: dubbo 功能集合
- netty:网络传输
- javassist:通过修改字节码,实现动态SPI机制
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。
- spring-context:与spring 集成
- snakeyaml:解析yml配置文件
- zookeeper:连接zookeeper注册中心
2.基本开发架构
一个dubbo应用中至少包含3个节点:
订阅
远程调用
注册
dubbo-client
zookeeper
dubbo-server
- zookeeper注册中心
- dubbo-server:提供服务,并用dubbo暴漏服务到注册中心
- dubbo-client:通过dubbo引用远程服务,起到服务调用
1)zookeeper注册中心
这里作者使用了docker在安装完毕;
2)server暴露服务
- 在SpringBoot工程中添加依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!--如果注册中心用的zookeeper需要添加-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.8</version>
</dependency>
- 在启动类上添加注解
@EnableDubbo
- 在配置文件添加配置
dubbo.application.name=boot-server
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1 #由dubbo安排端口
- 在服务实现类上添加注解
DubboService
3)client引用服务
1.在SpringBoot工程中添加依赖
2.在启动类上添加注解@EnableDubbo
3.在配置文件添加配置
dubbo.application.name=boot-client
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo #可不填
dubbo.protocol.port=-1 #由dubbo安排端口 #可不填
4.在需要引用服务的地方使用DubboReference
引用远程服务(好像@AutoWire
)
@DubboReference
UserService userService
4)服务化最佳实践
分包:
建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
如果需要,也可以考虑在 API 包中放置一份 Spring 的引用配置,这样使用方只需在 Spring 加载过程中引用此配置即可。配置建议放在模块的包目录下,以免冲突,
为了代码结构能优雅一点,我们可以把需要暴露的服务和需要引用的服务做成一个依赖,供server和client引用。这样需要更改服务接口和实体类的时候,能减少一定的工作量。
我们常用的就是把Service层和Model进行封装成一个依赖。
server实现这个Service,并暴露到注册中心
client远程引用这个Service
3.Dubbo的配置项
https://dubbo.apache.org/zh/docs/v2.7/user/configuration/xml/
所有的配置项说明:
标签 | 用途 | 解释 |
| 服务配置(server) | 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 |
| 引用配置(client) | 用于创建一个远程服务代理,一个引用可以指向多个注册中心 |
| 协议配置(server) | 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 |
| 应用配置 (共有) | 用于配置当前应用信息,不管该应用是提供者还是消费者 |
| 模块配置 | 用于配置当前模块信息,可选 |
| 注册中心配置(共有) | 用于配置连接注册中心相关信息 |
| 监控中心配置(共有) | 用于配置连接监控中心相关信息,可选 |
| 提供方配置(server) | 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选 |
| 消费方配置(client) | 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选 |
| 方法配置(共有) | 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息 |
| 参数配置(共有) | 用于指定方法参数配置 |
1)配置分类
所有配置项分为三⼤类。
- 服务发现:表示该配置项⽤于服务的注册与发现,⽬的是让消费⽅找到提供⽅。
- 服务治理:表示该配置项⽤于治理服务间的关系,或为开发测试提供便利条件。
- 性能调优:表示该配置项⽤于调优性能,不同的选项对性能会产⽣影响。
2)配置的优先级
以 timeout 为例,下图显示了配置的查找顺序,其它配置 retries, loadbalance, actives 等类似:
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。