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端属性
- 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
- 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的
配置的覆盖规则:
- 方法级配置别优于接口级别
- Consumer端配置 优 Provider配置 优于 全局配置
- 最后是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 客户端
- 导入dubbo-starter。在application.properties配置属性,使用@Service【暴露服务】,使用@Reference【引用服务】
- 配置类 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
- 启动类
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);} }
- 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);} }
- 配置类 application.properties
- 保留Dubbo 相关的xml配置文件,使用@ImportResource导入Dubbo的xml配置文件
- 配置类 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>
- 启动类
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);} }
- 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);} }
- 配置类 provider.xml
- 使用 注解API的方式(将每一个组件手动配置到容器中,让dubbo来扫描其他的组件)
- 配置类
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;} }
- 启动类
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);} }
- 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);} }
- 配置类