dubbo官网dubbo官网
1.dubbo进行对象传递时,类需要可序列化
dubbo在传输对象时,类时需要可序列化的也就是类必须实现serializable。否则会抛出异常。事实上java网络通信传输数据时以流的形式来传输的,可序列化使得对象可以转换为流的形式
2.地址缓存
在springcloud中我们的注册中心如eureka,nacos,zookeeper等挂掉之后,微服务是不能够访问到注册中心的,于是也就不能远程调用其他服务。
但是dubbo就不同了,dubbo服务消费者在第一次访问注册中心调用其他服务后就会本地缓存服务提供方地址,以后需要再访问时就不会再取访问注册中心了。当然,如果服务提供方的地址发生变化时,注册中心是会及时提醒服务消费方的,这也是bubbo的一个优势
测试:
启动dubbo服务提供方和消费方
能够正常访问
现在关闭zookeeper,看看dubbo是否还能调用成功
可以看到服务提供方已经感知到了zookeeper发生异常了
在消费方切换访问地址,发现依旧能够访问成功
3.超时机制
在服务运行过程中,如果服务提供方运行方法所需时间长或发生阻塞,等待等情形。这个时候如果消费者一直等待下去,那么当大量请求消费者时就会造成线程拥堵,使程序崩溃。为了解决这种问题,dubbo提供了超时机制,超过规定时间还没有返回就断开连接,销毁线程
1.可以在服务提供方的@service设置超时时间
2.可以在服务消费方@Reference设置超时时间
且此处的优先级是高于服务提供方的@service超时设置
在实际开发中是建议在服务提供方设置超时时间的,因为根据具体的业务处理才能准确设置超时时间
4.重试机制
服务调用超时,有可能是服务执行时间过长,通过超时设置可以解决,但是在此基础上,如果还发生了超时就有可能不是服务的问题,有可能是网络波动,为了解决这种问题,dubbo提供了重试机制retries。
dubbo默认的重试次数为2,可以在service中设置重试次数
5.多版本
比如同一个service,有新旧功能,为了区分开就可以在@service上使用version属性来区分不同的版本,然后在@Reference指定引用的版本
例子:
1.在服务提供端有两个实现同一个接口但是是新旧功能的服务
在两个服务上指定版本
然后在服务消费者的调用出指定要调用的服务版本
最终访问,执行结果如下
6.负载均衡
当同一种服务有多个,并构成集群了。消费者访问他们时就需要负载均衡策略了。dubbo提供了四种负载均衡策略。
只需要在服务提供者的@service上使用weight属性设置权重,然后在服务消费方使用loadbalance属性设置负载均衡策略(默认是随机random)即可。
创建三个相同功能的服务,然后指定他们各自的权重
服务1权重100,服务2权重200,服务3权重100
然后在服务消费者处指定负载均衡策略
负载均衡策略有四种,他们的名称都可以找到
需要注意的是使用idea同时运行三个同注册名称的服务需要设置他们的注册端口和qos端口不同
启动服务最后不断地执行服务消费者,可以看到
结合上面服务2的权重是最高的,于是在随机情况下服务执行了两次,但是服务1和服务3都是一样的权重为什么服务1还执行了两次?
这是因为在随机情况下,权重越高的执行频率越高,相同权重的服务随机执行
7.集群容错机制
在调用服务时,某个或某些服务并不能正常执行导致超时,这个时候就需要容错机制来处理,到底是直接报错,重试还是直接返回空等等,都需要dubbo通过的集群容错机制
测试:
对三个服务提供者设置超时设置和方法睡眠以模拟服务不正常执行,其中服务1和服务2的超时设置为3s而方法睡眠5s于是必定会报异常。而服务3是正常执行的以此来模拟
服务1:
服务2:
服务3:
服务消费者设置负载均衡机制
执行,可以成功获取结果,并且从数据来看是服务3的
服务消费者也报异常,但是并不影响获取结果
观察服务1和服务2,虽然访问了但是都抛出超时异常,并没有正常执行
服务3是正常执行的
由此可见容错机制运行正常
8.服务降级
当服务器部署了多个服务时,有的服务重要性高,有的服务重要性低。假如服务器性能不足,为了满足主要服务的注册运行,是会关闭一些次要服务的,但是访问这些服务时又不能报错,于是dubbo提供了服务降级策略
force:就是不发起访问,直接返回null
fail:就是访问失败了,不报错,返回null
测试:
开启一个不正常运行的服务来模拟服务降级,在服务消费方的@Reference指定服务降级策略
1.先指定force:return null
执行访问后发现只有null
并且server也没有报访问
服务消费方打印了服务降级日志
2.指定服务降级策略为fail:return null
执行访问发现返回为空
服务消费方报异常,但是界面并没有返回500异常
服务提供方也提示超时异常