dubbo配置详解

本文详细解析了Dubbo配置的优先级,包括JVM参数、XML配置和Properties配置。还介绍了配置属性,如服务提供者和消费者的常见属性。进一步探讨了配置覆盖策略,以timeout为例说明了在不同层级的配置覆盖规则。最后,讨论了Dubbo服务治理的重要性及其基本概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dubbo配置优先级

dubbo的配置可以配置在不同位置上,但是同时只能生效一个。

主要三个位置的配置:JVM配置->配置文件->外部配置

而之前所说的注解形式和xml配置形式和API配置都是属于配置文件配置。优先级的图示如下:

重写与优先级

dubbo-properties-override

优先级从高到低:

  • JVM -D 参数:当你部署或者启动应用时,它可以轻易地重写配置,比如,改变 dubbo 协议端口;
  • XML:XML 中的当前配置会重写 dubbo.properties 中的;
  • Properties:默认配置,仅仅作用于以上两者没有配置时。
  1. 如果在 classpath 下有超过一个 dubbo.properties 文件,比如,两个 jar 包都各自包含了 dubbo.properties,dubbo 将随机选择一个加载,并且打印错误日志。
  2. 如果 id 没有在 protocol 中配置,将使用 name 作为默认属性。

dubbo配置属性说明

dubbo可供配置的属性有11个,其中较为常用的有

标签用途解释备注
<dubbo:service/>服务配置用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心暴露服务接口。
<dubbo:method/>方法配置用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息,可选暴露服务接口的指定方法
<dubbo:reference/>引用配置用于创建一个远程服务代理,一个引用可以指向多个注册中心接收暴露的接口。
<dubbo:protocol/>协议配置用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受RPC协议的相关设置,只需要在服务提供端设置,用于暴露接口。
<dubbo:application/>应用配置用于配置当前应用信息,不管该应用是提供者还是消费者项目应用的个性化信息
<dubbo:registry/>注册中心配置用于配置连接注册中心相关信息注册中心的相关配置
<dubbo:monitor/>监控中心配置用于配置连接监控中心相关信息,可选监控中心的相关配置
<dubbo:provider/>提供方配置当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选服务提供端的一些统一配置
<dubbo:consumer/>消费方配置当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选服务消费端的一些统一配置
<dubbo:module/>模块配置用于配置当前模块信息,可选
<dubbo:argument/>参数配置用于指定方法参数配置,可选

示例:对这些属性简单的配置

服务提供者

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="spring-provider"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 监控中心设置 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.lyj.service.ProviderService" ref="providerService">
        <dubbo:method name="hello"></dubbo:method>
    </dubbo:service>

    <!-- 统一配置,对所有暴露的接口有效 -->
    <dubbo:provider timeout="1000"/>
    
</beans>

服务消费者

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,可自定义 -->
    <dubbo:application name="spring-consumer"  />

    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 监控中心监控设置,直连监控中心服务器地址或者从注册中心发现 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
    <!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> -->

    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="providerService" interface="com.lyj.service.ProviderService">
        <dubbo:method name="hello"/>
    </dubbo:reference>

    <!-- 服务消费者的统一配置 -->
    <dubbo:consumer check="false"/>

</beans>

dubbo配置覆盖策略

当我们为暴露的接口做服务治理的配置时,有些配置参数可以在多个地方设置,比如配置服务响应超时属性,配置这个属性我们甚至可以在六个地方进行配置。这六个地方也是对服务接口的暴露和调用进行配置的常用地方。分别是

  • 服务提供端全局设置dubbo.provider
  • 服务消费端全局设置dubbo.consumer
  • 服务提供段接口设置dubbo.service
  • 服务消费端接口设置dubbo.reference
  • 服务提供端方法设置dubbo.method
  • 服务消费端方法设置dubbo.method

那么如果我们真的在六个地方都配置了的话,它的覆盖策略是什么?

以timeout属性为例,覆盖策略应该是粒度越小,越不被覆盖,同等粒度,消费端优先

而官方的解释是这样的:

  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。

dubbo-config-override

dubbo配置服务治理

服务治理是dubbo的核心,如果缺少服务治理,那么分布式的意义将十不存一,这里将对dubbo的服务治理进行个人理解的一些记录说明。

功能作用
启动时检查在启动时检查依赖的服务是否可用
重试次数配置配置dubbo服务重试次数
集群容错集群调用失败时,Dubbo 提供的容错方案
负载均衡Dubbo 提供的集群负载均衡策略
线程模型配置 Dubbo 中的线程模型
直连提供者Dubbo 中点对点的直连方式
只订阅只订阅不注册
多协议在 Dubbo 中配置多协议
多注册中心在 Dubbo 中把同一个服务注册到多个注册中心上
服务分组使用服务分组区分服务接口的不同实现
静态服务将 Dubbo 服务标识为非动态管理模式
多版本在 Dubbo 中为同一个服务配置多个版本
分组聚合通过分组对结果进行聚合并返回聚合后的结果
参数验证在 Dubbo 中进行参数验证
json泛化调用支持Json字符串参数的泛化调用
msgpack序列化在Dubbo中使用msgpack序列化
provider超时打断Dubbo provider执行超时释放执行线程
指定Ip Port调用Provider对于Provider集群中注册的多个实例,指定Ip:Port进行调用
收集Dubbo广播响应Dubbo broadcast2 广播模式收集所有服务提供者的接口响应
结果缓存通过缓存结果加速访问速度
使用泛化调用实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现
Protobuf使用 IDL 定义服务
GoogleProtobuf 对象泛化调用对 Google Protobuf 对象进行泛化调用
实现泛化调用实现一个通用的远程服务 Mock 框架,可通过实现 GenericService 接口处理所有服务请求
回声测试通过回声测试检测 Dubbo 服务是否可用
上下文信息通过上下文存放当前调用过程中所需的环境信息
隐式参数通过 Dubbo 中的 Attachment 在服务消费方和提供方之间隐式传递参数
异步执行Dubbo 服务提供方的异步执行
异步调用在 Dubbo 中发起异步调用
本地调用在 Dubbo 中进行本地调用
参数回调通过参数回调从服务器端调用客户端逻辑
事件通知在调用之前、调用之后、出现异常时的事件通知
本地存根在 Dubbo 中利用本地存根在客户端执行部分逻辑
本地伪装如何在 Dubbo 中利用本地伪装实现服务降级
延迟暴露延迟暴露 Dubbo 服务
并发控制Dubbo 中的并发控制
连接控制Dubbo 中服务端和客户端的连接控制
延迟连接在 Dubbo 中配置延迟连接
粘滞连接为有状态服务配置粘滞连接
TLS通过 TLS 保证传输安全
令牌验证通过令牌验证在注册中心控制权限
路由规则通过 Dubbo 中的路由规则做服务治理
旧路由规则在 Dubbo 2.6.x 版本以及更早的版本中配置路由规则
配置规则在 Dubbo 中配置应用级治理规则和服务级治理规则
旧配置规则Dubbo 中旧版本的规则配置方式
服务降级降级 Dubbo 服务
消费端线程池模型Dubbo 消费端线程池模型用法
优雅停机让 Dubbo 服务完成优雅停机
主机绑定在 Dubbo 中绑定主机名
主机配置自定义 Dubbo 服务对外暴露的主机地址
注册信息简化减少注册中心上服务的注册数据
日志适配在 Dubbo 中适配日志框架
访问日志配置 Dubbo 的访问日志
服务容器使用 Dubbo 中的服务容器
ReferenceConfig 缓存在 Dubbo 中缓存 ReferenceConfig
只注册只注册不订阅
分布式事务Dubbo 中分布式事务的支持
导出线程堆栈在 Dubbo 自动导出线程堆栈来保留现场
Kryo 和 FST 序列化在 Dubbo 中使用高效的 Java 序列化(Kryo 和 FST)
Netty4 支持在 Dubbo 中配置 Netty4

dubbo服务治理是核心内容

在C语言中,手动编写复制文件(`cp`)和移动文件(`mv`)的简单版本通常涉及到文件操作和I/O处理。下面是一个非常基础的示例,展示了如何实现文件的复制: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE 1024 void copy_file(const char* src, const char* dst) { FILE* src_file = fopen(src, "r"); if (src_file == NULL) { perror("Error opening source file."); return; } FILE* dst_file = fopen(dst, "w"); if (dst_file == NULL) { perror("Error opening destination file."); fclose(src_file); return; } char buffer[MAX_LINE]; while (fgets(buffer, MAX_LINE, src_file)) { fputs(buffer, dst_file); } fclose(src_file); fclose(dst_file); } int main() { copy_file("source.txt", "destination.txt"); printf("File copied successfully.\n"); return 0; } ``` 对于移动文件(`mv`),因为文件一旦移动就不可更改位置,所以这里可以先删除目标文件然后再进行复制: ```c #include <stdbool.h> bool remove_file(const char* filename) { FILE* file = fopen(filename, "w"); fclose(file); // This will fail if the file exists, but we can use this for deletion check. return remove(filename) == 0; // Use remove function to delete the file } void mv_file(const char* old_path, const char* new_path) { if (!remove_file(new_path)) { fprintf(stderr, "Error: File '%s' already exists.\n", new_path); return; } copy_file(old_path, new_path); printf("File moved successfully.\n"); } int main() { mv_file("old.txt", "new.txt"); return 0; } ``` 请注意,这仅是个简化的例子,在实际生产环境中,还需要考虑更多的错误处理和边界情况。此外,这个代码不会处理大文件,因为它一次性读取整个文件到内存中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值