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;
}
@Override
public 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 */ @Override public 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.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://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 */ @Override public 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 */ @Bean public 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 */ @Bean public 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 */ @Bean public 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 */ @Bean public 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 */ @Bean public 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 */ @Override public 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); } }
- 配置类