Dubbo的学习笔记

news2024/11/23 21:34:51

目录

架构

zookeeper的简单介绍

简单案例

Dubbo-admin的简单使用

Dubbo高级特性

序列化

地址缓存

超时与重试

多版本

负载均衡

集群容错

服务降级


Dubbo是阿里巴巴开源的一个高性能、轻量级RPC框架

架构

  • provider:暴露服务的服务提供方
  • container:服务运行容器
  • consumer:调用远程服务的服务消费方
  • registry:服务注册与发现的注册中心
  • monitor:统计服务的调用次数和调用时间的监控中心

zookeeper的简单介绍

Dubbo建议使用Zookeeper作为服务注册中心

Zookeeper安装有两个需要注意的地方,首先是需要修改conf目录下的zoo_sample.cfg文件名,因为Zookeeper的生效配置文件名叫zoo.cfg,其次,需要修改该文件中的数据存放路径,最好和zookeeper安装目录同一路径

zookeeper的启动,去bin目录下执行如下命令

zkServer.sh start

查看zookeeper的状态

./zkServer.sh status

创建一个简单MVC项目后续我们在该项目上添加Dubbo

简单案例

一个Service模块一个Web模块,结构如下

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }
}
@Service
public class UserServiceImpl implements UserService {
    @Override
    public String sayHello() {
        return "hello dubbo";
    }
}

启动服务查看运行情况

接下来我们在此基础上加入Dubbo的使用

修改Service中的Service注解为dubbo中的注解,原先的Service注解是将UserService注册到Spring中的IOC容器当中,现在我们不需要由Spring管理,而是通过dubbo来远程调用,因此修改此处的Serivce注解

修改application.xml配置文件,添加dubbo的配置

<!--dubbo的项目名称,需要唯一-->
<dubbo:application name="dubbo-service"/>
<!--配置注册中心-->
<dubbo:registry address="zookeeper://192.168.116.128:2181"/>
<!--配置需要扫描@Service注解的包路径-->
<dubbo:annotation package="com.zmt"/>

补全Service的目录结构就可以启动dubbo-service模块了

此时修改dubbo-web模块,首先去掉pom文件中的dubbo-service模块的引用,这时Controller中就会报错,为了避免报错,我们需要在本地创建一个对应的UserSerivce接口来进行注入,但由于不是Spring注入了,我们还需要修改注入注解为Dubbo的远程注入注解

@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * 1.从注册中心获取userService的访问url
     * 2.进行远程调用RPC
     * 3.将结果封装为一个代理对象,给变量赋值
     * */
    @Reference
    private UserService userService;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }
}

这是我们需要在web模块同样添加一份dubbo的配置信息

<!--dubbo的项目名称,需要唯一-->
<dubbo:application name="dubbo-web"/>
<!--配置注册中心-->
<dubbo:registry address="zookeeper://192.168.116.128:2181"/>
<!--配置需要扫描@Service注解的包路径-->
<dubbo:annotation package="com.zmt"/>

修改完毕后,就可以启动web模块了。在启动过程中会报一个错误

这个错误指的是端口占用,这是因为我们是一台机器运行了两个dubbo服务,在生产环境中不会出现这个错误,但是这个错误不会影响程序运行。如果不希望出现该错误信息,我们可以修改dubbo的配置文件,添加一个修改端口的参数即可

    <!--dubbo的项目名称,需要唯一-->
    <dubbo:application name="dubbo-web">
        <dubbo:parameter key="qos.port" value="33333"/>
    </dubbo:application>
    <!--配置注册中心-->
    <dubbo:registry address="zookeeper://192.168.116.128:2181"/>
    <!--配置需要扫描@Service注解的包路径-->
    <dubbo:annotation package="com.zmt"/>

此时我们的项目结构大致如下

我们实现两个模块调用时,在web层创建了service层的接口,但是在开发时接口可能存在很多,方法也有很多,我们不一定保证在开发时保证不出错,因此,我们存在一个更好的解决方案,那就是再创建一个公共模块,web与service共同依赖该模块,那么结构就变成下面这张图了

新创建一个接口模块

我们将service与web模块中的接口删除,然后在pom文件中引入接口模块,导入接口模块中的接口即可。

Dubbo-admin的简单使用

dubbo-admin管理平台,是图形化的服务管理页面

从注册中心中获取到所有的提供者/消费者进行配置管理

路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能

下载完并解压后根据下面步骤进行即可

1、在dubbo-admin-server里面中找到application.properties修改zookeeper的地址

如果修改了需要在dubbo-admin-server目录执行mvn clean install -Dmaven.test.skip=true

2、在dubbo-admin-distribution中找到tager目录下的jar包运行完成后

3、在dubbo-admin-ui中执行npm run dev

Dubbo高级特性

序列化

在开发时,pojo模块里面的实体类都要实现Serializable接口,目的是序列化,传输数据

地址缓存

注册中心挂了的话,服务还是可以进行正常访问的。

原因:dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后再调用则不会访问注册中心。当服务提供地址发生改变时,注册中心会通知服务消费者。

超时与重试

服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。在某个峰值时刻,大量请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩,Dubbo利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问则自动断开连接。

设置连接超时timeout(默认为1000ms)可以在服务生产方与服务消费方两个地方设置,两个地方都设置timeout的话,服务消费者处的设置优先生效(但不推荐),一般只在服务生产者者里设置超时时间,因为只有服务生产者处知道自己的服务压力是否过大。

连接超时的话,会进行重试操作retries,默认是重试两次,一共发起三次请求

多版本

当我们需要让服务消费者从版本2处获取服务时,dubbo会让一部分用户先使用新功能,用户反馈没问题之后再将所有的用户迁移到新的服务提供方,这称之为灰度发布。dubbo中使用version属性来设置和调用同一个接口的不同版本。

@Service(version = "1.0") //将这个类提供的方法对外发布,将访问的地址ip,端口,路径注册到注册中心
public class UserServiceImpl implements UserService {
    @Override
    public String sayHello() {
        return "hello dubbo";
    }

    @Override
    public User findUserById(int id) {
        User user = new User(1, "zhangsan");
        return user;
    }
}
@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * 1.从注册中心获取userService的访问url
     * 2.进行远程调用RPC
     * 3.将结果封装为一个代理对象,给变量赋值
     * */
    @Reference(version = "1.0")
    private UserService userService;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }

    @RequestMapping("/findById")
    public User findByUser(int id){
        return userService.findUserById(id);
    }
}

负载均衡

负载均衡的四种策略:

  • Random:根据权重比例随机分配(这个是默认)
  • RoundRobin:按权重轮询(1、2、3按着顺序来)
  • LeastActive:最少活跃调用数,相同时随机
  • ConsistentHash:一致性Hash,相同参数的请求总是发到统一提供者。

集群容错

集群容错模式:

  • Failover Cluster:即上面的超时重试。失败重试一般用于读操作,写操作可能会出现多次写入重复
  • Failfast Cluster:快速失败,只发起一次调用,通常用于写的操作
  • Failsafe Cluster:失败安全,出现异常时,直接忽略,返回一个空结果
  • Failback Cluster:失败自动恢复,后台记录失败请求,定时重发
  • Forking Cluster:并行调用多个服务器,只要一个成功即返回。
  • Broadcast Cluster:广播调用所有的提供者,逐个调用,任意一台报错则报错

服务降级

服务降级:(服务器在挂掉的边缘时,释放一些不重要的服务来维持核心服务的使用)

  • mock=force:return null :表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响
  • mock=fail:return null :表示消费方对服务的方法调用在失败后,在返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React学习计划-React16--React基础(三)收集表单数据、高阶函数柯里化、类的复习

1. 收集表单数据 包含表单的组件分类 受控组件——页面中所有输入类的DOM,随着输入&#xff0c;把值存维护在状态里&#xff0c;需要用的时候去状态里取值&#xff08;推荐&#xff0c;避免了过渡使用ref&#xff09;非受控组件——页面中所有输入类的DOM&#xff0c;现用现取…

【Vulnhub 靶场】【ContainMe: 1】【简单-中等】【20210729】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/containme-1,729/ 靶场下载&#xff1a;https://download.vulnhub.com/containme/THM-ContainMe-v4.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年07月29日 文件大小&#xff1a;2.2 GB 靶…

文件的查看与管理

目录 一、命令之-----cat &#xff08;一&#xff09;查看文本文件内容 &#xff08;二&#xff09;合并文件内容 &#xff08;三&#xff09;创建文件 &#xff08;四&#xff09;追加内容到文件 二、管道符的作用 三、分页显示 &#xff08;一&#xff09;命令之…

Postgresql源码(118)elog/ereport报错跳转功能分析

1 日志接口 elog.c完成PG中日志的生产、记录工作&#xff0c;对外常用接口如下&#xff1a; 1.1 最常用的ereport和elog ereport(ERROR,(errcode(ERRCODE_UNDEFINED_TABLE),errmsg("relation \"%s\" does not exist",relation->relname)));elog(ERRO…

重塑数字生产力体系,生成式AI将开启云计算未来新十年?

科技云报道原创。 今天我们正身处一个历史的洪流&#xff0c;一个巨变的十字路口。生成式AI让人工智能技术完全破圈&#xff0c;带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命&#xff0c;远超出我们今天的想象&#xff0c;这意味着一个巨大的历史机遇正…

Hbase的安装配置

注&#xff1a;本文默认已经完成hadoop的下载以及环境配置 1.上传zookeeper和hbase压缩包到指令路径并且解压 (理论上讲&#xff0c;hbase其实内置了zookeeper&#xff0c;我们也可以不另外下载&#xff0c;另外下载的目的在于减少组件间依赖性) cd /home mkir hbase cd /hom…

IDEA 黑色主题很难看到鼠标

“控制面板”—搜索“鼠标”关键字—选择“更改鼠标设置” 参考&#xff1a; IDEA 黑色主题很难看到鼠标

ansible的脚本-----playbook剧本

ansible的脚本-----playbook剧本 playbook组成部分&#xff1a; 1、tasks任务&#xff1a;包含要在目标主机上执行的操作&#xff0c;使用模块定义这些操作。每个任务都是一个模块的调用 2、variables变量&#xff1a;存储和传递数据&#xff0c;变量可以自定义&#xff0c;…

WeakMap 和 WeakSet:解决内存泄漏避免循环引用(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

React组件状态管理

React组件的状态管理是一个很重要的内容。从字面来理解&#xff0c;按钮是否可单击、图片是否显示等&#xff0c;这些都是状态。广义来讲&#xff0c;React组件的状态还1包括传入React的数据&#xff0c;例如某个组件要展示列表&#xff0c;列表的数据也是该组件的状态。总之&a…

Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection(CVPR2023待补)

文章目录 BeginningAbstract挑战方法成果 Introduction引出问题早期的work及存在的问题近期的work及存在的问题our workContribution Related Work&#xff08;paper for me&#xff09;Oriented Object DetectionPrior for Oriented ObjectsLabel Assignment Tiny Object Dete…

【算法】算法题-20231221

这里写目录标题 一、830. 较大分组的位置二、657. 机器人能否返回原点三、771. 宝石与石头 一、830. 较大分组的位置 在一个由小写字母构成的字符串 s 中&#xff0c;包含由一些连续的相同字符所构成的分组。 例如&#xff0c;在字符串 s "abbxxxxzyy"中&#xff0…

【XML】TinyXML 详解

1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&#xff0c;因此可以在开源或商业代码中…

【SQL题目】连续日期的判断

【1.查询至少连续3天下单的用户】 思路1&#xff08;使用lead&#xff09;&#xff1a; distinct user_id,create_date去重&#xff0c;确保每个用户每天只有一条访问记录lead(create_date,2,‘9999-12-31’) over(partition by user_id order by create_date)根据用户分区&am…

模型实战(18)之C++ - tensorRT部署GAN模型实现人脸超分辨重建

模型实战(18)之C++ - tensorRT部署GAN模型实现人脸超分辨重建 一个实现人脸超分辨率重建的demo支持StyleGAN: GPEN or GFPGAN通过C++ - tensorrt 快速部署,推理速度每帧 在RTX3090上5.5ms+,RTX3050上10ms+下边是实现效果(图片来源于网络search,如若侵权,联系删除) 下边…

AI Native工程化:百度App AI互动技术实践

作者 | GodStart 导读 随着AI浪潮的兴起&#xff0c;越来越多的应用都在利用大模型重构业务形态&#xff0c;在设计和优化Prompt的过程中&#xff0c;我们发现整个Prompt测评和优化周期非常长&#xff0c;因此&#xff0c;我们提出了一种Prompt生成、评估与迭代的一体化解决方案…

YashanDB个人版体验总结

前言 YashanDB数据库具有多项功能特性。首先&#xff0c;它是一个分布式数据库&#xff0c;支持水平扩展&#xff0c;能够将数据分散到多个节点上&#xff0c;从而提高系统的可靠性和性能。其次&#xff0c;YashanDB数据库具备高可用性&#xff0c;支持主从复制和自动故障转移…

竞赛保研 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于Django与深度学习的股票预测系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff…

VS ASP.Net Core项目还原Packages包到本地(解决服务器没有网无法重新生成的问题)

问题背景 ASP.Net Core MVC项目&#xff0c;无法重新生成。 现场服务器没有网,放上去的代码无法通过nuget还原包到服务器&#xff0c;导致无法编译无法运行。 解决办法 将Packages还原到本机&#xff08;有网&#xff09;&#xff0c;然后再将代码放到服务器运行。 在有网的…

KoPA: Making Large Language Models Perform Better in Knowledge Graph Completion

本来这个论文用来组会讲的&#xff0c;但是冲突了&#xff0c;没怎么讲&#xff0c;记录一下供以后学习。 创新点 按照我的理解简单概述一下这篇论文的创新点 提出使用大模型补全知识图谱&#xff0c;并且融合知识图谱的结构信息提出一个新的模型KoPA模型&#xff0c;采用少…