Dubbo配置

news/2025/1/14 18:01:36/

dubbo配置官网参考

1.配置原则

在这里插入图片描述

JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。

XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。

Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

2.启动时检查

**Dubbo **缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 **Spring **初始化完成,以便上线时,能及早发现问题,默认 check=“true”

可以通过 **check=“false”**关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

另外,如果你的 **Spring **容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 **null **引用,如果 check=“false”,总是会返回引用,当服务恢复时,能自动连上。

order-service-consumer消费者为例,在consumer.xml中添加配置

<!--配置当前消费者的统一规则,当前所有的服务都不启动时检查-->
<dubbo:consumer check="false"></dubbo:consumer>

添加后,即使服务提供者不启动,启动当前的消费者,也不会出现错误。

3.全局超时配置

服务提供方:

<!-- 全局超时配置-->
<dubbo:provider timeout="5000" /><!-- 指定接口以及特定方法超时配置 -->
<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl"><dubbo:method name="getUserAddressList" timeout="3000"></dubbo:method>
</dubbo:service>

服务消费方:

<!-- 全局超时配置-->
<dubbo:consumer check="false" timeout="5000"/><!-- 指定接口以及特定方法超时配置 -->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" timeout="5000"><dubbo:method name="getUserAddressList" timeout="3000"></dubbo:method>
</dubbo:reference>

配置原则:

dubbo推荐在Provider上尽量多配置Consumer端属性

  1. 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
  2. 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的

配置的覆盖规则:

  1. 方法级配置别优于接口级别
  2. Consumer端配置 优 Provider配置 优于 全局配置
  3. 最后是Dubbo Hard Code的配置值(见配置文档)

在这里插入图片描述

4.重试次数

<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl"><!--retries 重试次数,第一次调用不算,配合超时时间一起使用--><dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
</dubbo:service>

5.多版本

服务提供者中复制多个impl。起不同的名字

在这里插入图片描述

<!-- 4、暴露服务 让别人调用 ref指向服务的真正实现对象 -->
<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl" version="1.0.0"><!-- 指定接口以及特定方法超时配置 --><dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
</dubbo:service>
<!-- 服务的实现 -->
<bean id="userServiceImpl" class="com.tianxia.dubbo.service.impl.UserServiceImpl"/><!-- 4、暴露服务 让别人调用 ref指向服务的真正实现对象 -->
<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl02" version="2.0.0"><!-- 指定接口以及特定方法超时配置 --><dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
</dubbo:service>

配置多个文件的路径及信息。
服务消费者调用时,可自由配置版本

消费者

<!-- 调用远程暴露的服务,生成远程服务代理 指定版本-->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" version="1.0.0"/><!-- 调用远程暴露的服务,生成远程服务代理 随机版本-->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" version="*"/>

6.本地存根

import cn.hutool.core.util.StrUtil;
import com.tianxia.dubbo.api.UserService;
import com.tianxia.dubbo.entity.UserAddress;import java.util.List;/*** 本地存根* @author liqb* @date 2023-05-29 22:09*/
public class UserServiceStub implements UserService {private final UserService userService;/*** 传入的是userService远程的代理对象* @author liqb* @date 2023-05-29 22:11* @param userService*/public UserServiceStub(UserService userService) {this.userService = userService;}@Overridepublic List<UserAddress> getUserAddressList(String userId) {System.out.println("UserServiceStub......");if (StrUtil.isNotBlank(userId)) {return userService.getUserAddressList(userId);}return null;}
}
<!-- 调用远程暴露的服务,生成远程服务代理 -->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" version="1.0.0" stub="com.tianxia.dubbo.service.impl.UserServiceStub"/>

7.dubbo与springboot整合的三种方式

导入Dubbo的依赖 和 zookeeper 客户端

  1. 导入dubbo-starter。在application.properties配置属性,使用@Service【暴露服务】,使用@Reference【引用服务】
    1. 配置类 application.properties
      ## 指定当前服务
      dubbo.application.name=boot-user-service-provider
      ## 指定注册中心的位置
      dubbo.registry.address=127.0.0.1:2181
      dubbo.registry.protocol=zookeeper
      ## 指定通信规则
      dubbo.protocol.name=dubbo
      dubbo.protocol.port=20880## 连接监控中心
      dubbo.monitor.protocol=registry
      
    2. 启动类
      import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;/*** 启动类* @author liqb* @date 2023-05-28 21:36*/
      @EnableDubbo // 开启基于注解的dubbo功能
      @SpringBootApplication
      public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
      }
      
    3. UserServiceImpl
      import com.tianxia.dubbo.api.UserService;
      import com.tianxia.dubbo.entity.UserAddress;
      import org.springframework.stereotype.Service;import java.util.Arrays;
      import java.util.List;/*** 用户服务实现类* @author liqb* @date 2023-05-28 16:48*/
      @Service
      @com.alibaba.dubbo.config.annotation.Service
      public class UserServiceImpl implements UserService {/*** 按照用户id返回所有的收货地址* @author liqb* @date 2023-05-28 16:48* @param userId 用户id* @return*/@Overridepublic List<UserAddress> getUserAddressList(String userId) {UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");return Arrays.asList(address1,address2);}
      }
      
  2. 保留Dubbo 相关的xml配置文件,使用@ImportResource导入Dubbo的xml配置文件
    1. 配置类 provider.xml
      <?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://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) --><dubbo:application name="user-service-provider"/><!-- 2、指定注册中心的位置 --><!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"/> --><dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/><!--3、指定通信规则(通信协议? 服务端口)--><dubbo:protocol name="dubbo" port="20881"/><!-- 4、暴露服务 让别人调用 ref指向服务的真正实现对象 --><dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl" version="1.0.0"><!-- 指定接口以及特定方法超时配置 --><dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method></dubbo:service><!--dubbo-monitor-simple监控中心发现的配置--><dubbo:monitor protocol="registry"/><!--<dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>--><!-- 全局超时配置--><dubbo:provider timeout="5000"/>
      </beans>
      
    2. 启动类
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.annotation.ImportResource;/*** 启动类* @author liqb* @date 2023-05-28 21:36*/
      // @EnableDubbo // 开启基于注解的dubbo功能
      // @EnableDubbo(scanBasePackages = "com.tianxia.dubbo")
      @ImportResource(locations = "classpath:provider.xml")
      @SpringBootApplication
      public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
      }
      
    3. UserServiceImpl
      import com.tianxia.dubbo.api.UserService;
      import com.tianxia.dubbo.entity.UserAddress;
      import org.springframework.stereotype.Service;import java.util.Arrays;
      import java.util.List;/*** 用户服务实现类* @author liqb* @date 2023-05-28 16:48*/
      @Service
      @com.alibaba.dubbo.config.annotation.Service
      public class UserServiceImpl implements UserService {/*** 按照用户id返回所有的收货地址* @author liqb* @date 2023-05-28 16:48* @param userId 用户id* @return*/@Overridepublic List<UserAddress> getUserAddressList(String userId) {UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");return Arrays.asList(address1,address2);}
      }
  3. 使用 注解API的方式(将每一个组件手动配置到容器中,让dubbo来扫描其他的组件)
    1. 配置类
      import com.alibaba.dubbo.config.ApplicationConfig;
      import com.alibaba.dubbo.config.MethodConfig;
      import com.alibaba.dubbo.config.MonitorConfig;
      import com.alibaba.dubbo.config.ProtocolConfig;
      import com.alibaba.dubbo.config.RegistryConfig;
      import com.alibaba.dubbo.config.ServiceConfig;
      import com.tianxia.dubbo.api.UserService;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;import java.util.Collections;/*** Dubbo配置类* @author liqb* @date 2023-05-29 22:28*/
      @Configuration
      public class MyDubboConfig {/*** <dubbo:application name="user-service-provider"/>* @author liqb* @date 2023-05-29 22:41* @return*/@Beanpublic ApplicationConfig applicationConfig() {ApplicationConfig applicationConfig = new ApplicationConfig();applicationConfig.setName("user-service-provider");return applicationConfig;}/*** <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>* @author liqb* @date 2023-05-29 22:37* @return*/@Beanpublic RegistryConfig registryConfig() {RegistryConfig registryConfig = new RegistryConfig();registryConfig.setProtocol("zookeeper");registryConfig.setAddress("127.0.0.1:2181");return registryConfig;}/*** <dubbo:protocol name="dubbo" port="20881"/>* @author liqb* @date 2023-05-29 22:41* @return*/@Beanpublic ProtocolConfig protocolConfig() {ProtocolConfig protocolConfig = new ProtocolConfig();protocolConfig.setName("dubbo");protocolConfig.setPort(20881);return protocolConfig;}/*** <dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl02" version="2.0.0">*  <dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>* </dubbo:service>* @author liqb* @date 2023-05-29 22:40* @return*/@Beanpublic ServiceConfig<UserService> userServiceServiceConfig(UserService userService) {ServiceConfig<UserService> serviceServiceConfig = new ServiceConfig<>();serviceServiceConfig.setInterface(UserService.class);serviceServiceConfig.setRef(userService);serviceServiceConfig.setVersion("1.0.0");// 配置每一个method信息MethodConfig methodConfig = new MethodConfig();methodConfig.setName("getUserAddressList");methodConfig.setTimeout(3000);methodConfig.setRetries(3);// 将method的设置关联到service中serviceServiceConfig.setMethods(Collections.singletonList(methodConfig));return serviceServiceConfig;}/*** <dubbo:monitor protocol="registry"/>* @author liqb* @date 2023-05-29 22:42* @return*/@Beanpublic MonitorConfig monitorConfig() {MonitorConfig monitorConfig = new MonitorConfig();monitorConfig.setProtocol("registry");return monitorConfig;}
      }
    2. 启动类
      import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;/*** 启动类* @author liqb* @date 2023-05-28 21:36*/
      @EnableDubbo(scanBasePackages = "com.tianxia.dubbo")
      @SpringBootApplication
      public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
      }
      
    3. UserServiceImpl
      import com.tianxia.dubbo.api.UserService;
      import com.tianxia.dubbo.entity.UserAddress;
      import org.springframework.stereotype.Service;import java.util.Arrays;
      import java.util.List;/*** 用户服务实现类* @author liqb* @date 2023-05-28 16:48*/
      @Service
      @com.alibaba.dubbo.config.annotation.Service
      public class UserServiceImpl implements UserService {/*** 按照用户id返回所有的收货地址* @author liqb* @date 2023-05-28 16:48* @param userId 用户id* @return*/@Overridepublic List<UserAddress> getUserAddressList(String userId) {UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");return Arrays.asList(address1,address2);}
      }
      

http://www.ppmy.cn/news/104280.html

相关文章

python-sqlite3使用指南

python下sqlite3使用指南 文章目录 python下sqlite3使用指南开发环境sqlite3常用APICRUD实例参考 开发环境 vscode ​ 开发语言&#xff1a; python vscode SQLite插件使用方法&#xff1a; 之后在这里就可以发现可视化数据&#xff1a; sqlite3常用API Python 2.5.x 以上…

GoogleTest之gMock: Macros

目录 EXPECT_CALL EXPECT_CALL EXPECT_CALL(mock_object,method_name(matchers...)) 创建一个mock对象mock_object&#xff0c;这个对象有一个名为method_name的方法&#xff0c;方法的参数为matchers…。 EXPECT_CALL必须在任何mock对象之前使用。 以下方法的调用&#xff0c…

日撸 Java 三百行day56-57

文章目录 day56-57 kMeans 聚类1.kMeans聚类理解2.代码理解2.1代码中变量的理解2.2代码理解 day56-57 kMeans 聚类 1.kMeans聚类理解 无监督的机器学习算法&#xff0c;其中k是划分为几个簇&#xff0c;并且选择k个数据作为不同簇的聚类中心&#xff0c;计算每个数据样本和聚…

redux与react-redux状态集中管理

一、redux:可用于react、Vue等中 redux应用&#xff1a;状态的管理&#xff0c;共享状态&#xff0c;Redux用一个单独的常量状态树&#xff08;state对象&#xff09;保存这一整个应用&#xff08;如tab选项卡的状态、城市等需要应用在整个页面的信息&#xff09;的状态。其本…

Windows下利用Anaconda创建多个CUDA环境

参考 https://blog.csdn.net/qq_42395917/article/details/126237388 https://blog.csdn.net/qq_42406643/article/details/109545766 (待学习补充) https://blog.csdn.net/qq_43919533/article/details/125694437 (待学习补充) 安装cudatoolkit和cudnn # 前提是我已经安装了…

JAVA基础 - 如何使用split方法?

写在前面 在工作中一直使用split进行字串的分隔&#xff0c;但是始终没有认真研究过该方法&#xff0c;今天在使用该方法时遇到了一些问题&#xff0c;特进行学习记录。 遇到的问题 在使用“|”作为字串的分隔符的时候&#xff0c;分隔结果和预期不一样。 方法定义 // 从方…

Android使用多模块+MVI+Koin+Flow构建项目框架

Android使用多模块MVIKoinFlow构建项目框架 前言模块路由核心接口&#xff0c;用于在模块中绑定路由对应关系使用建造者模式定义传递的参数创建路由加载核心类, 本质上包含了一个全局路由表跳转类使用 MVI封装介绍&#xff0c;本质上使用flow作为核心定义数据类型&#xff0c;该…

I2C通信协议MPU6050

目录 I2C通信协议 硬件 软件 I2C时序 MPU6050 I2C通信协议 硬件 为了避免总线没协调好导致电源短路&#xff0c;配置为开漏输出&#xff0c;所有设备输出低电平不输出高电平&#xff0c;即右图。又为了避免高电平造成的引浮空&#xff0c;&#xff08;第三点&#xff09;总…