- 配置文件
优先级关系:
1.JVM -D参数,当你部署或者启动应用时,它可以轻易地重写配置,比如,改变dubbo协议端口;
2.外部化配置,指将配置集中起来放在注册中心服务器上或其它。
3. ServiceConfig、ReferenceConfig等编程接口采集的配置
4.XML, XML中的当前配置会重写dubbo.properties中的;
5..Properties,默认配置,仅仅作用于以上两者没有配置时(application.properties优先级比dubbo.properties更高)。
dubbo:consumer和dubbo;provider配置内容优先级低于其它标签配置内容
如果springbootresources目录下同时又xml和properties文件,项目引用xml文件,里面如果内容不同会保错。
常用属性(可以在service或者reference里配置):
超时属性:timeout
重试次数:retries 不包含第一次调用
幂等方法:可以重试,比如数据库的查询,删除,修改,多次操作不影响结果。
非幂等方法:不可以重试,比如数据库插入等。
版本号version:可以利用版本号来实现灰度发布,提供方可以用版本号来发布同一个接口的不同实现,消费方配置可以用版本号来选择要调用的服务,或者随机选择。
其它功能:
本地存根:指消费端有一个本地实现,要求必须有一个构造器参数是服务接口。可以进行一些本地参数校验或者缓存发现决定是否真正调用。(<dubbo:service stub = “全类名”>)
与springboot整合的3种方式:
1使用application.propertise文件配置基本信息,可以在@Service和@Reference注解上配置属性,使用@EnableDubbo开启注解功能(其实就是自动进行扫描)
2使用@ImportResource(locations=“xml配置文件路径”),相对比其它配置来说可以具体到方法级别
3使用纯注解的方式。
- 高可用
高可用:通过设计,减少系统不能提供服务的时间。
1、zookeeper服务器宕机:消费者可用通过本地缓存继续提供服务
2、dubbo直连:在没有注册中心的情况下,我们可以配置消费端url直接连接服务端
3集群模式下负载均衡:基于权重的随机负责均衡机制、基于权重的轮询负载机制,最小活跃数负载均衡机制、一致性hash负载均衡机制
4服务降级:当服务器压力剧增,根据实际业务情况和流量,对一些服务和页面有策略的不处理或者换一种简单的方式进行处理,从而释放服务器资源达到保证核心服务和业务的正常运作或高效运作。
Mock=force:return+null:不调用远程服务,直接返回null
Mock=fail:return+null:调用远程服务失败后,返回null
5集群容错:
Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
重试次数配置如下:
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。
集群模式配置
按照以下示例在服务提供方和消费方配置集群模式
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />
- dubbo原理
- 标签解析
DubboBeanDefinitionParse类负责解析,在构造解析器之前,会给每一种dubbo标签类型注册对应的解析器,解析器负责将标签的属性解析到对应的xxxConfig对象里(service标签对应ServiceBean,Reference标签对应ReferenceBean) - 服务暴露
ServiceBean实现了两个接口InitializingBean(当属性创建完后回调afterpropertiesSet方法)和ApplicationListener(应用监听器,监听当IOC容器创建完成后回调onApplicationEvent方法)
afterpropertiesSet:只是将各种配置保存起来
onApplicationEvent->调用export方法暴露服务->调用ServiceConfig类的doExport方法->调用doExportUrls方法,加载注册中心地址,遍历协议配置,暴露在多个端口->doExportUrlFor1Protocol方法里将服务实现和url包装成invoker。之后通过SPI机制得到对应的protocol对象,这里用先用RegistryProtocol在本地暴露后再在提供者消费者注册表中添加。
本地暴露的时候会调用DubboProtocol的export方法,其中调用了openServer方法,创建ExchangeServer并绑定url和请求处理器,之后就是调用底层netty框架绑定(启动netty服务器在20880端口进行监听)。
在注册表中注册提供者服务:使用CurrentHashMap将url和执行器关联起来,请求到来的时候就直接在map里面找到并执行。
最后会将url注册到相应得到注册中心。 - 服务引用
ReferenceBean实现了FactorBean接口,当获取Reference标签里的组件想完成自动注入时会调用getObject方法->调用init方法进行初始化->调用creatProxy创建代理对象->调用refer方法从注册中心获取远程接口->在RegistryProtocol里调用refer方法来订阅注册中心的服务->实际上调用了DubboProtocol里的refer方法->核心是得到getClient方法得到客户端->之后就是利用netty框架建立客户端->订阅好服务封装成invoker添加到消费者注册表里,最后返回创建好的代理对象。 - 服务调用
实际上通过代理对象调用,代理对象进行了层层封装。
先通过代理对象来执行一些自定义的filter比如本地存根、本地伪装、结果缓存等等。然后通过MockClusterInvoker调用invoke方法,再调用集群容错类的invoke方法,在注册中心找到有几个可以执行的invoker,再通过负载均衡策略选出一个执行,在执行之前执行一些系统的filter,比如监控中心的统计。最后在Dubboinvoker里得到执行的客户端对象,通过客户端对象发起请求,发送后返回,超时报错或重试,然后再进行一系列解码操作,最后返回结果。