- 第三步:在消费者Controller层注入(引用)UserService接口;
- 第四步:直接调用UserService中的接口;
(6)测试
重启两个服务(注意先启动提供者),使用fastRequest测试;
(获取用户名)
(获取用户信息)
可以看到两个接口都可以正常返回,说明zookeeper+dubbo的结合已完成;
Dubbo特性
以下介绍Dubbo中的一些特性,更多特性用法可在官网中查看;
(1)启动检查
上面一直提到,需要先启动提供者,再启动消费者,这是因为消费者服务依赖于提供者,在启动时Dubbo会进行检查,发现提供者找不到会报错,程序启动失败。
可在消费者这边添加如下配置,取消启动检查
# 取消消费者检查
dubbo:
consumer:
check: false
再次启动就没有问题了
(2)地址缓存
地址缓存是指,消费者与提供者联系建立起来了,服务消费者会把提供者的接口地址缓存一份,此时注册中心宕机,该请求仍可以正常访问;
发送请求,没得问题;
关闭注册中心zookeeper;
两个服务一直在打印未知错误;
此时,访问刚刚的那个请求,仍然可以成功;
换个重启服务后没发过的请求,也可以访问;
(3)对象传输
使用Dubbo可以传输自定义对象,但需要注意对象需要实现序列号接口,不然会报错;
根据经验,凡是涉及到传输对象,都需要实现序列化接口,并且最好添加全参构造、无参构造,因为有些工具,底层可能是通过对象的全参构造来帮助我们实例化对象的。
(4)连接超时
Dubbo默认设置的连接超时是1秒,即当消费者发送的请求,1秒未得到返回即为超时,这个超时是可以设置的。
在提供者这边方法内设置2秒睡眠;
消费者发送请求,返回超时错误;
连接超时可以在消费者、提供者设置,并且可以在接口、方法上设置,优先级是消费者大于提供者,方法大于接口,如下我在消费者(@Reference)、提供者(@Service)双方设置超时时长;
(消费者,设置1500ms)
(提供者,设置3000ms)
(重启服务,发送请求,依旧报错,说明提供者设置的超时没有起作用,超时是以消费者的1500ms为准)
(互调设置,消费者设置3000ms,提供者1500ms,重启服务可以正常访问)
(5)重试次数
重试次数,在之前连接超时错误的信息,可以看到一个“Tried 3 times”,表示尝试了3次,默认重试2次;
同样,这个也可以在消费者、提供者双方设置
(提供者)
// 设置重试10次
@Service(timeout = 3000, retries = 10)
(消费者)
// 设置重试5次
@Reference(timeout = 1500, retries = 5)
private UserService userService;
同样,优先级是消费者大于提供者;
注意
需要注意哦,不是所有操作都可以设置重试次数的,应该需要考虑当前请求所对应的操作是否为幂等性操作,即执行一次或多次结果都相同,不然会造成数据混乱。以数据库的增删改查操作为例:
- 增:每增加一条数据,数据库表都是变化的,所以为非幂等性;
- 删:与增同理,是非幂等性;
- 改:视情况而定,看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")
请求失败,提示没有可用的提供者;
修改消费者版本号为“V1.0”;
@Reference(timeout = 3000, retries = 5,version = "V1.0")
请求访问成功;
使用Dubbo的这种特性,可以实现灰度发布,即版本更新不是一下全部更新,而是在系统中设置多个版本,如新版本的接口设置10个,旧版本的接口设置5个,实现“缓更新,慢发布”,减少系统出现异常的风险,比如一些金融、支付类的软件。
(7)负载均衡
可使用“loadbalance”属性设置接口的负载均衡策略,支持以下四种策略:
- RandomLoadBalance:加权随机,默认算法,默认权重相同;
- RoundRobinLoadBalance:加权轮询,默认权重相同;
- LeastActiveLoadBalance:最少活跃优先+加权随机,能者多劳;
- ConsistentHashLoadBalance:一致性Hash,确定入参,确定提供者,适用于有状态的请求;
注意使用并不是直接new它们类,而是进入到它们对应的类里面,查看它们的这行代码中写的名称
将该名称作为负载均衡属性的值
@Reference(loadbalance = "random")
private UserService userService;
在代码中打印一行标识,开启两个服务,发送十几条请求,可以看到两边服务均有访问,数量不等;
提供者,消费者两边都可以设置,都有效;
(8)失败降级
失败降级是指访问失败时,返回一个降级方案,即“打了折扣”的响应结果,使用mock属性设置,如下:
@Reference(mock = "return 请求错误")
private UserService userService;
另外,还可以有其他几种用法:
# 调用失败,返回请求错误
mock = "return 请求错误"
# 不发起远程调用,直接返回null,不管请求成功与否,都返回null
mock = "force:return null"
# 发起远程调用,失败后返回null
mock = "fail:return null"
# 发起远程调用,失败后抛异常
mock = "throw"
# 调用失败后使用自己实现的降级方案
mock = "自定义类的全限定类名"
其中,最后一种方法最好用,搞一下
降级降级方案,实现接口就可以
public class UserServiceMock implements UserService {
@Override
public String getUserName(Integer id) {
return "降级方案";
}
@Override
public User getUser(Integer id) {
return new User(-1,"降级对象","降级密码");
}
}
mock设置为降级方案的全限定类名
@Reference(mock = "com.hzy.mock.UserServiceMock")
private UserService userService;
测试,连接超时,走了降级
(9)集群容错
使用场景(官方);多个服务器部署同一集群中,运行同一应用程序,如果一台服务器出现故障,其他服务器将接管负载,确保应用程序对用户仍然可用。
Failover Cluster(默认设置):失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)。
其他配置如下:
使用如下:
@Reference(cluster = "failover")
private UserService userService;
同样,也是使用对应的策略,就进入到对应的类中,使用对应的名称作为属性值;
Nacos+Dubbo
Nacos作为注册中心Dubbo使用与ZooKeeper基本相同,在使用上,不同的地方只有以下两点:
- 导入的依赖,配置不同;
- 注解不同,ZooKeeper使用@Service、@Reference注解;Nacos使用@DubboService、@DubboReference注解;
总结
总结成一句话,Dubbo是替代Feign的;
另外提一句,Dubbo是使用自定义的协议,所以如果需要考虑提高Dubbo效率,可以从传输协议、对象序列化方式这些方面入手;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
1712957267441)]
[外链图片转存中…(img-XdkN7zHS-1712957267441)]
[外链图片转存中…(img-cBcXp6Eb-1712957267441)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-5vCidRVk-1712957267441)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!