Dubbo+Zookeeper使用_dubbo zookeeper配置(2),2024年最新2024最新大数据开发开发面试大全

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>${dubbo.version}</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>${curator.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>${curator.version}</version>
    </dependency>
</dependencies>

设置各个服务的配置,两方面,一方面是zookeeper,一方面是dubbo的,如下:


(OrderService)



server:
port: 8081
spring:
application:
name: dubbo-consumer
dubbo:
registry:
address: zookeeper://localhost:2181 # 连接到注册中心
protocol:
name: dubbo # 指定的协议
port: 28081 # 指定的端口
scan:
basePackages: com.hzy.controller # 接口列表和接口中的方法列表


(UserService)



server:
port: 8082
spring:
application:
name: dubbo-provider
dubbo:
registry:
address: zookeeper://localhost:2181 # 连接到注册中心
protocol:
name: dubbo # 指定的协议
port: 28082 # 指定的端口
scan:
basePackages: com.hzy.controller # 接口列表和接口中的方法列表


#### (4)启动


**依次** 启动用户服务、订单服务,没有报错说明项目注册到zookeeper没有问题;


![在这里插入图片描述](https://img-blog.csdnimg.cn/c556502a75f641a9a952961410c63478.png)


打开zookeeper客户端,输入 `ls /`可查看到dubbo项,再输入`ls /dubbo`,可查看到注册的服务;


![在这里插入图片描述](https://img-blog.csdnimg.cn/3bfd5f1f46d54a2489f7ab51a06bac3e.png)


#### (5)使用


使用Dubbo非常简单,只需如下操作:


* 第一步:修改提供者Service注解,改为Dubbo依赖提供的;


![在这里插入图片描述](https://img-blog.csdnimg.cn/79b1322cdb894cd9a4a52771e54a77be.png)


* 第二步:将提供者的UserService接口复制一份到消费者这边来,**注意结构要平行相同**;
* 


![在这里插入图片描述](https://img-blog.csdnimg.cn/785bca5cb1d3409eb714ce104b48e656.png)


* 第三步:在消费者Controller层注入(引用)UserService接口;
* 第四步:直接调用UserService中的接口;


![在这里插入图片描述](https://img-blog.csdnimg.cn/63dedbf4e6774043a2d19a2d8f26e74e.png)


#### (6)测试


重启两个服务(注意先启动提供者),使用fastRequest测试;


(获取用户名)


![在这里插入图片描述](https://img-blog.csdnimg.cn/c82e956a8a56435ebb4d11e8f04cc69e.png)


(获取用户信息)


![在这里插入图片描述](https://img-blog.csdnimg.cn/aaf94e7ca0484cc085fa00a715d7c930.png)


可以看到两个接口都可以正常返回,说明zookeeper+dubbo的结合已完成;


### Dubbo特性


以下介绍Dubbo中的一些特性,更多特性用法可在[官网]( )中查看;


![在这里插入图片描述](https://img-blog.csdnimg.cn/97cefa3f63fc41678615a0035303a2d6.png)


#### (1)启动检查


上面一直提到,需要先启动提供者,再启动消费者,这是因为消费者服务依赖于提供者,在启动时Dubbo会进行检查,发现提供者找不到会报错,程序启动失败。


![在这里插入图片描述](https://img-blog.csdnimg.cn/757eb64569d641a3bdd266a500fa744c.png)


可在消费者这边添加如下配置,取消启动检查



取消消费者检查

dubbo:
consumer:
check: false


再次启动就没有问题了


![在这里插入图片描述](https://img-blog.csdnimg.cn/4f791c743dd3452ba27790074016ccc0.png)


#### (2)地址缓存


地址缓存是指,消费者与提供者联系建立起来了,服务消费者会把提供者的接口地址缓存一份,此时注册中心宕机,该请求仍可以正常访问;


发送请求,没得问题;


![在这里插入图片描述](https://img-blog.csdnimg.cn/9f2d7f1f5cca4bfab774a82d08529574.png)


关闭注册中心zookeeper;


![在这里插入图片描述](https://img-blog.csdnimg.cn/28c2f212377e48c08008b6373f2208af.png)


两个服务一直在打印未知错误;


![在这里插入图片描述](https://img-blog.csdnimg.cn/1276656828ff48bca037a2f3a020f66d.png)


此时,访问刚刚的那个请求,仍然可以成功;


![在这里插入图片描述](https://img-blog.csdnimg.cn/0bd6d27ba0364dec903fdac16c519d8b.png)


换个重启服务后没发过的请求,也可以访问;


![在这里插入图片描述](https://img-blog.csdnimg.cn/b3226a2f936e4b6cbec5132fdb9c36c4.png)


#### (3)对象传输


使用Dubbo可以传输自定义对象,但需要注意对象需要实现序列号接口,不然会报错;


![在这里插入图片描述](https://img-blog.csdnimg.cn/10e9a0bd71c14ef4be6885ce5bdc2ba0.png)


根据经验,凡是涉及到传输对象,都需要实现序列化接口,并且最好添加全参构造、无参构造,因为有些工具,底层可能是通过对象的全参构造来帮助我们实例化对象的。


#### (4)连接超时


Dubbo默认设置的连接超时是1秒,即当消费者发送的请求,1秒未得到返回即为超时,这个超时是可以设置的。


在提供者这边方法内设置2秒睡眠;


![在这里插入图片描述](https://img-blog.csdnimg.cn/8ecd1a3b2fab415e88b17693d5b47d4f.png)


消费者发送请求,返回超时错误;


![在这里插入图片描述](https://img-blog.csdnimg.cn/174a846a26874824a75a3035efc3c805.png)


连接超时可以在消费者、提供者设置,并且可以在接口、方法上设置,**优先级是消费者大于提供者,方法大于接口**,如下我在消费者(@Reference)、提供者(@Service)双方设置超时时长;


(消费者,设置1500ms)


![在这里插入图片描述](https://img-blog.csdnimg.cn/582c376c561b49e191272de5ae0680f0.png)


(提供者,设置3000ms)


![在这里插入图片描述](https://img-blog.csdnimg.cn/0dfebd6812744f0d9b15ff76315b21d1.png)


(重启服务,发送请求,依旧报错,说明提供者设置的超时没有起作用,超时是以消费者的1500ms为准)


![在这里插入图片描述](https://img-blog.csdnimg.cn/f90ca89787fc4a4d864caa06c80dff57.png)


(互调设置,消费者设置3000ms,提供者1500ms,重启服务可以正常访问)


![在这里插入图片描述](https://img-blog.csdnimg.cn/64b93d09d49542198f379ba84403f811.png)


#### (5)重试次数


重试次数,在之前连接超时错误的信息,可以看到一个“Tried 3 times”,表示尝试了3次,默认重试2次;


![在这里插入图片描述](https://img-blog.csdnimg.cn/c32d664f21c64d1d82f70a86ae68ec4b.png)


同样,这个也可以在消费者、提供者双方设置


(提供者)



// 设置重试10次
@Service(timeout = 3000, retries = 10)


(消费者)



// 设置重试5次
@Reference(timeout = 1500, retries = 5)
private UserService userService;


同样,优先级是消费者大于提供者;


![在这里插入图片描述](https://img-blog.csdnimg.cn/627c6bc0806e41beba8c951e4ffeca33.png)


##### 注意


需要注意哦,不是所有操作都可以设置重试次数的,应该需要考虑当前请求所对应的操作是否为幂等性操作,即执行一次或多次结果都相同,不然会造成数据混乱。以数据库的增删改查操作为例:


* 增:每增加一条数据,数据库表都是变化的,所以为非幂等性;
* 删:与增同理,是非幂等性;
* 改:视情况而定,看SQL语句是怎么写的,如果是"number + 1"这样的,是非幂等性;如果是“set name = #{name} where id = #{id}”这样的,就是幂等性的;
* 查:多次查询(没有其他操作参与)数据库表都是一样的,所以是幂等性操作;


#### (6)多版本


多版本是指,如果存在多个提供者、消费者时,可以指定版本信息,让提供者指服务指定的消费者,消费者指消费指定的服务者;


(消费者,不指定版本信息)



@Reference(timeout = 3000, retries = 5)
private UserService userService;


(提供者,指定版本信息“V1.0”)



@Service(timeout = 3000, retries = 10, version = “V1.0”)


请求失败,提示没有可用的提供者;


![在这里插入图片描述](https://img-blog.csdnimg.cn/6c872ed184c64af88d1654d4781c5523.png)


修改消费者版本号为“V1.0”;



@Reference(timeout = 3000, retries = 5,version = “V1.0”)


请求访问成功;


![在这里插入图片描述](https://img-blog.csdnimg.cn/35fd6f83604d47d6903ebbd95dd8c6e7.png)


使用Dubbo的这种特性,可以实现灰度发布,即版本更新不是一下全部更新,而是在系统中设置多个版本,如新版本的接口设置10个,旧版本的接口设置5个,实现“缓更新,慢发布”,减少系统出现异常的风险,比如一些金融、支付类的软件。


#### (7)负载均衡


可使用“loadbalance”属性设置接口的负载均衡策略,支持以下四种策略:


* RandomLoadBalance:加权随机,默认算法,默认权重相同;
* RoundRobinLoadBalance:加权轮询,默认权重相同;
* LeastActiveLoadBalance:最少活跃优先+加权随机,能者多劳;
* ConsistentHashLoadBalance:一致性Hash,确定入参,确定提供者,适用于有状态的请求;


![在这里插入图片描述](https://img-blog.csdnimg.cn/83c7a44326fd4e49a009cd427cf93b58.png)


注意使用并不是直接new它们类,而是进入到它们对应的类里面,查看它们的这行代码中写的名称


![在这里插入图片描述](https://img-blog.csdnimg.cn/a039de0b6bf549a0b8a530e2ee3ba9a9.png)


将该名称作为负载均衡属性的值



@Reference(loadbalance = “random”)
private UserService userService;


在代码中打印一行标识,开启两个服务,发送十几条请求,可以看到两边服务均有访问,数量不等;  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b3835d102bd6470bb3b05b38629f818b.png)


![在这里插入图片描述](https://img-blog.csdnimg.cn/6b3e31bf5d3040c0a395fdc44bce2129.png)


提供者,消费者两边都可以设置,都有效;


#### (8)失败降级


失败降级是指访问失败时,返回一个降级方案,即“打了折扣”的响应结果,使用mock属性设置,如下:



@Reference(mock = “return 请求错误”)
private UserService userService;


另外,还可以有其他几种用法:



调用失败,返回请求错误

mock = “return 请求错误”

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

时,返回一个降级方案,即“打了折扣”的响应结果,使用mock属性设置,如下:

@Reference(mock = "return 请求错误")
private UserService userService;

另外,还可以有其他几种用法:

#  调用失败,返回请求错误
mock = "return 请求错误"



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-li1M8y8N-1713119907657)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值