前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Dubbo】高级特效以及SpringCloud整合Dubbo

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

作者头像
陶然同学
发布2023-02-26 19:59:05
4790
发布2023-02-26 19:59:05
举报
文章被收录于专栏:陶然同学博客陶然同学博客

文章目录

3、Dubbo高级特性

3.2、超时与重试

3.3、启动检查

3.4、多版本

3.5、负载均衡

4、SpringCloud整合Dubbo

4.1、功能概述

4.2、入门案例

3、Dubbo高级特性

3.2、超时与重试

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

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

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

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

代码语言:javascript
复制
dubbo:
  registry:
    address: nacos://127.0.0.1:8848
  consumer:
    timeout: 3000
    retries: 0

3.3、启动检查

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

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

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

可以通过check=false关闭

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

代码语言:javascript
复制
dubbo:
  registry:
    address: nacos://127.0.0.1:8848
  consumer:
    check: false

3.4、多版本

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

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

(1)user-provider定义新的服务实现类UserServiceImpl2,指定版本

代码语言:javascript
复制
@DubboService(version = “2.0.0”)
public class UserServiceImpl2 implements UserService {
    …………
}
​

(2)user-consumer消费者调用时,指定版本调用

代码语言:javascript
复制
@RestController
@RequestMapping("/user")
public class UserController {
    //引用远程服务
    @DubboReference(version = "2.0.0")
    private UserService userService;    
    ………
}
​

3.5、负载均衡

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

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

4、SpringCloud整合Dubbo

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

4.1、功能概述

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

4.2、入门案例

4.2.1、抽取接口

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

代码语言:javascript
复制
package cn.itcast.dubbo.api;
​
​
import cn.itcast.dubbo.domain.User;
​
public interface UserService {
​
    User queryById(Long id);
}
​

4.2.2、项目依赖

父工程加入SpringCloud Alibaba依赖

代码语言:javascript
复制
<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依赖

代码语言:javascript
复制
<!--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>
​

4.2.3、服务提供者

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

代码语言:javascript
复制
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中添加配置

代码语言:javascript
复制
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中包扫描

4.2.4、服务消费者

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

代码语言:javascript
复制
package cn.itcast.order.controller;
​
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配置

代码语言:javascript
复制
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内置的重试机制
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
    • 3、Dubbo高级特性
      • 3.2、超时与重试
      • 3.3、启动检查
      • 3.4、多版本
      • 3.5、负载均衡
    • 4、SpringCloud整合Dubbo
      • 4.1、功能概述
      • 4.2、入门案例
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档