【博学谷学习记录】超强总结,用心分享 。Dubbo相关知识。
一.Dubbo的介绍
<!--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-registry-nacos</artifactId> <version>2.7.8</version> </dependency>
2.实现类中添加注解
@DubboService public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; //根据id查询用户名称 public String queryUsername(Long id) { return userMapper.findById(id).getUsername(); } }
3.yml配置文件
dubbo: protocol: name: dubbo port: 20881 registry: address: nacos://127.0.0.1:8848 scan: base-packages: cn.itcast.user.service
4.引导类
@MapperScan("cn.itcast.user.mapper") @SpringBootApplication public class UserProviderApplication { public static void main(String[] args) { SpringApplication.run(UserProviderApplication.class, args); } }
5.序列化
两个机器传输数据,如何传输java对象?
在RPC通信时,往往采用二进制数据格式,故需要对对象进行序列化处理
6.总结
在服务实现类上通过@DUbboService暴露服务
在消费者端通过@DubboReference引用服务
2).Dubbo中传输对象
在RPC框架中,往往通过TCP协议进行数据传输,因此对象需要进行序列化Serializable
3).在实际开发中往往将接口和实体类抽取到公共模块user-api,然后在各自的模块中引入功能模块
四、高级特性
1.启动检查
为了保障服务的正常可用,Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时抛出异常。
在正常开发中,会启动,但是我们在日常的测试中会将其关闭,在配置文件中将其关闭即可
dubbo: consumer: check: false
2.多版本
Dubbo提供了提供者多版本的支持,平滑处理项目功能升级部署
使用灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
(1)user-provider定义新的服务实现类UserServiceImpl2,指定版本
@DubboService(version = “2.0.0”) public class UserServiceImpl2 implements UserService { ………… }
(2)user-consumer消费者调用时,指定版本调用
@RestController @RequestMapping("/user") public class UserController { //引用远程服务 @DubboReference(version = "2.0.0") private UserService userService; ……… }
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩
dubbo利用超时机制来解决这个问题
若超时时间较短,当网络波动时请求就会失败,Dubbo通过重试机制避免此类问题的发生
如果只是查询的话,可以使用,但是保存操作不建议使用,因为保存操作一次,会发送三个请求。
在消费yml文件中设置,就相当于全局
1 2 3 4 5 6 | dubbo: registry: address: nacos: //127.0.0.1:8848 consumer: check: false retries: 0 |
在controller中设置,相当于局部
@DubboReference(version = "2.0.0", retries = 0) private UserService userService;
4.负载均衡
在集群部署时,Dubbo提供了4中负载均衡策略,帮助消费者找到最有提供者并调用
Random:按权重随机,默认值。按权重设置随机概率
RoundRobin:按权重轮询
LeastActive:最少活跃调用数,相同活跃数随机
@DubboReference(version = "2.0.0", retries = 0,loadbalance = "Random") private UserService userService;
五、
为什么需要Dubbo
Feign基于Http协议(应用层),http协议就是对tcp协议的封装,由于做了深层次的封装,所以效率低,在高并发场景下性能不够理想,容易成为性能瓶颈
Dubbo框架的通信协议采用TCP协议(数据传输层)
Dubbo框架的通信协议采用RPC协议,属于传输层协议
Dubbo默认通过Netty构造TCP长链接的方式进行通信,性能较高
使用SpringCloud整合Dubbo,强强联合
1.入门案例
抽取接口
package cn.itcast.dubbo.api; import cn.itcast.dubbo.domain.User; public interface UserService { User queryById(Long id); }
项目依赖
父工程加入SpringCloud Alibaba依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
消费者和提供者引入nacos注册中心和Dubbo依赖
<!--nacos注册中心的依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--springcloud alibaba dubbo依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <dependency> <groupId>cn.itcast</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
服务提供者
修改UserService实现UserApi接口。并使用@DubboService注解替换@Service对外暴露dubbo服务
package cn.itcast.user.service; import cn.itcast.dubbo.api.UserService; import cn.itcast.dubbo.domain.User; import cn.itcast.user.mapper.UserMapper; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.beans.factory.annotation.Autowired; @DubboService public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; public User queryById(Long id) { return userMapper.findById(id); } }
在application.yml中添加配置
spring: datasource: url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver application: name: user-service cloud: nacos: discovery: server-addr: localhost:8848 #配置dubbo,注册中心,暴露的端口和协议,dubbo注解的包扫描 dubbo: protocol: name: dubbo port: 20881 registry: address: spring-cloud://localhost #使用SpringCloud中的注册中心 scan: base-packages: cn.itcast.user.service #dubbo中包扫描
服务消费者
在OrderController中引入dubbo服务。调用UserService查询用户
import cn.itcast.dubbo.api.UserService; import cn.itcast.dubbo.domain.Order; import cn.itcast.dubbo.domain.User; import cn.itcast.order.service.OrderService; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("order") public class OrderController { @Autowired private OrderService orderService; @DubboReference private UserService userService; @GetMapping("{orderId}") public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) { //根据id查询订单 Order order = orderService.queryOrderById(orderId); //获取用户id Long userId = order.getUserId(); //查询用户 User user = userService.queryById(userId); //设置用户对象 order.setUser(user); // 根据id查询订单并返回 return order; } }
在Order-service的模块中添加dubbo配置
spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 #dubbo配置 dubbo: registry: address: spring-cloud://localhost #使用cloud的注册中心 consumer: check: false #dubbo默认有启动检查 retries: 0 #dubbo内置的重试机制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本