【Dubbo】高级特效以及SpringCloud整合Dubbo

简介: 【Dubbo】高级特效以及SpringCloud整合Dubbo

3、Dubbo高级特性


3.2、超时与重试


服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。

在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。

  • dubbo 利用超时机制来解决这个问题(使用timeout属性配置超时时间,默认值1000,单位毫秒)
  • 若超时时间较短,当网络波动时请求就会失败,Dubbo通过重试机制避免此类问题的发生

user-consumer模块中添加配置信息

dubbo:
registry:
address: nacos://127.0.0.1:8848consumer:
timeout: 3000retries: 0

3.3、启动检查


为了保障服务的正常可用,Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常

image.png

在正式环境这是很有必要的一项配置,可以保证整个调用链路的平稳运行

在开发时,往往会存在没有提供者的情况。由于启动检查的原因,可能导致开发测试出现问题

可以通过check=false关闭

user-consumer模块中添加配置信息

dubbo:
registry:
address: nacos://127.0.0.1:8848consumer:
check: false

3.4、多版本


灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。

Dubbo提供了提供者多版本的支持,平滑处理项目功能升级部署

(1)user-provider定义新的服务实现类UserServiceImpl2,指定版本@DubboService(version=“2.0.0)
publicclassUserServiceImpl2implementsUserService {
…………}
(2)user-consumer消费者调用时,指定版本调用@RestController@RequestMapping("/user")
publicclassUserController {
//引用远程服务@DubboReference(version="2.0.0")
privateUserServiceuserService;    
………}

3.5、负载均衡


在集群部署时,Dubbo提供了4种负载均衡策略,帮助消费者找到最优提供者并调用

  • Random :按权重随机,默认值。按权重设置随机概率。
  • RoundRobin :按权重轮询
  • LeastActive:最少活跃调用数,相同活跃数的随机。
  • ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。
@RestController@RequestMapping("/user")
publicclassUserController {
//引用远程服务@DubboReference(loadbalance="roundrobin")
privateUserServiceuserService;
}

4、SpringCloud整合Dubbo


通常来说,RPC协议比REST具有更好的性能。很多开发人员希望享受Spring Cloud的生态,同时有兼顾PRC的效率的效率。SpringCloud Alibaba很好的解决了这个问题。

4.1、功能概述


将Dubbo集成至SpringCloud主要是替换Ribbo或者Feign实现远程调用。加入Dubbo后,整体的架构如下:

image.png

4.2、入门案例


4.2.1、抽取接口


定义接口模块dubbo-api,并将UserService接口抽取到此模块下

packagecn.itcast.dubbo.api;
importcn.itcast.dubbo.domain.User;
publicinterfaceUserService {
UserqueryById(Longid);
}

4.2.2、项目依赖


父工程加入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><!--springcloudalibabadubbo依赖--><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>

4.2.3、服务提供者


修改UserService实现UserApi接口。并使用@DubboService注解替换@Service对外暴露dubbo服务

packagecn.itcast.user.service;
importcn.itcast.dubbo.api.UserService;
importcn.itcast.dubbo.domain.User;
importcn.itcast.user.mapper.UserMapper;
importorg.apache.dubbo.config.annotation.DubboService;
importorg.springframework.beans.factory.annotation.Autowired;
@DubboServicepublicclassUserServiceImplimplementsUserService {
@AutowiredprivateUserMapperuserMapper;
publicUserqueryById(Longid) {
returnuserMapper.findById(id);
    }
}
在application.yml中添加配置spring:
datasource:
url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driverapplication:
name: user-servicecloud:
nacos:
discovery:
server-addr: localhost:8848#配置dubbo,注册中心,暴露的端口和协议,dubbo注解的包扫描dubbo:
protocol:
name: dubboport: 20881registry:
address: spring-cloud://localhost   #使用SpringCloud中的注册中心scan:
base-packages: cn.itcast.user.service#dubbo中包扫描

4.2.4、服务消费者


在OrderController中引入dubbo服务。调用UserService查询用户

packagecn.itcast.order.controller;
importcn.itcast.dubbo.api.UserService;
importcn.itcast.dubbo.domain.Order;
importcn.itcast.dubbo.domain.User;
importcn.itcast.order.service.OrderService;
importorg.apache.dubbo.config.annotation.DubboReference;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
@RestController@RequestMapping("order")
publicclassOrderController {
@AutowiredprivateOrderServiceorderService;
@DubboReferenceprivateUserServiceuserService;
@GetMapping("{orderId}")
publicOrderqueryOrderByUserId(@PathVariable("orderId") LongorderId) {
//根据id查询订单Orderorder=orderService.queryOrderById(orderId);
//获取用户idLonguserId=order.getUserId();
//查询用户Useruser=userService.queryById(userId);
//设置用户对象order.setUser(user);
// 根据id查询订单并返回returnorder;
    }
}

在Order-service的模块中添加dubbo配置

spring:
application:
name: order-servicecloud:
nacos:
discovery:
server-addr: localhost:8848#dubbo配置dubbo:
registry:
address: spring-cloud://localhost  #使用cloud的注册中心consumer:
check: false#dubbo默认有启动检查retries: 0#dubbo内置的重试机制
相关文章
|
1月前
|
SpringCloudAlibaba Dubbo Java
【五】SpringCloud Alibaba之整合Dubbo(实现远程调用)
【五】SpringCloud Alibaba之整合Dubbo(实现远程调用)
87 0
|
1月前
|
SpringCloudAlibaba Dubbo Java
SpringCloud Alibaba集成Dubbo实现远程服务间调用
SpringCloud Alibaba集成Dubbo实现远程服务间调用
|
7月前
|
Dubbo Java 应用服务中间件
微服务技术系列教程(30) - Dubbo-SpringCloud与Dubbo区别
微服务技术系列教程(30) - Dubbo-SpringCloud与Dubbo区别
54 0
|
8月前
|
监控 Java 应用服务中间件
SpringCloud高级篇 - 微服务保护-1
SpringCloud高级篇 - 微服务保护-1
57 0
|
9月前
|
Dubbo Java 应用服务中间件
深入了解Spring Cloud Alibaba Dubbo
在现代分布式系统开发中,构建高性能、可伸缩性和弹性的微服务架构变得越来越重要。Spring Cloud Alibaba Dubbo(简称Dubbo)是一个开源的分布式服务框架,可以帮助开发者构建强大的微服务架构,具备负载均衡、服务治理、远程调用等强大功能。本文将深入介绍Spring Cloud Alibaba Dubbo,帮助你理解它的核心概念、工作原理以及如何在你的项目中使用它。
|
1月前
|
缓存 负载均衡 Dubbo
Dubbo 第二节_ Dubbo的基本应用与高级应用
官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略,以消费端为准。 这其中⽐较难理解的就是最少活跃调⽤数是如何进⾏统计的? 讲道理,最少活跃数应该是在服务提供者端进⾏统计的,服务提供者统计有多少个请求正在执⾏中。 但在Dubbo中,就是不讲道理,它是在消费端进⾏统计的,为什么能在消费端进⾏统计? 逻辑是这样的:官⽹地址:http://dubbo.apache.org/zh/docs
|
1月前
|
Dubbo Java 应用服务中间件
阿里巴巴资深架构师深度解析微服务架构设计之SpringCloud+Dubbo
软件架构是一个包含各种组织的系统组织,这些组件包括Web服务器,应用服务器,数据库,存储,通讯层),它们彼此或和环境存在关系。系统架构的目标是解决利益相关者的关注点。
|
1月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
40 2
|
1月前
|
负载均衡 Dubbo Java
SpringCloud和Dubbo有哪些区别
SpringCloud和Dubbo有哪些区别
|
1月前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
254 0