dubbo配置官网参考:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html
1、配置原则
将XML配置的标签名,加属性名,用点分割,多个属性拆成多行。
比如:dubbo.application.name=foo等价于<dubbo:application name=“foo”/>
JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。同时,application.proprties的优先级高于dubbo.properties
2.启动时检查
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check=“true”。
可以通过 check=“false” 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check=“false”,总是会返回引用,当服务恢复时,能自动连上。
以order-service-consumer消费者为例,在consumer.xml中添加配置
<!--关闭某个服务的启动时检查(没有提供者时报错)-->
<dubbo:reference interface="com.yujie.UserService" check="false"></dubbo:consumer>
<!--配置当前消费者的统一规则,当前所有的服务都不启动时检查-->
<dubbo:consumer check="false"></dubbo:consumer>
添加后,即使服务提供者不启动,启动当前的消费者,也不会出现错误。
3、全局超时配置
服务消费方在引用服务提供方的时候,可能由于网络原因,服务提供方需要执行一个方法,可能会有很长时间,如果很长时间没有返回,导致大量线程都在阻塞,引起性能下降。
超时设置是指如果在指定时间内没有返回,就立即终止,不让大量线程阻塞。
默认超时时间是1000ms.
设置调用某个服务的超时设置
<dubbo:reference interface="com.yujie.service.UserService" id="userService" timeout="3000”></dubbo:reference>
设置调用某个服务的超时设置
<dubbo:reference interface="com.yujie.service.UserService" id="userService" timeout="3000”>
<dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> //此生效
</dubbo:reference>
精确优先规则
全局超时配置
<dubbo:provider timeout="5000" />
指定接口以及特定方法超时配置
<dubbo:provider interface="com.foo.BarService" timeout="2000">
<dubbo:method name="sayHello" timeout="3000" />
</dubbo:provider>
以timeout为例,显示了配置的查找顺序,其它retires,loadbalance,actives等类似
方法级优先,接口级次之,全局配置再次之
如果级别一样,则消费方优先,提供方次之。
其中,服务提供方配置,经过URL经由注册方传递给消费方
retries:重试次数。
当超时之后,远程服务调用失败,我们可以通过调整重试次数,让其多试上几次,重试次数不包含第一次调用。0代表不重试
<dubbo:reference interface="com.yujie.service.UserService" id="userService" timeout=“5000” retries="3">
重试并非在一台服务器上尝试。
我们将方法分为幂等和非幂等,幂等方法上可以设置重试次数来提升方法的性能,非幂等方法上不能设置重试次数。
幂等方法指的是方法不管运行多少次,结果都是一个效果,如查询、删除、修改
方法每一次运行都会产生一个效果。如新增。
配置原则
dubbo推荐在Provider上尽量多配置Consumer端属性
1、作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
2、在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的
配置的覆盖规则:
方法级配置别优于接口级别,即小Scope优先
Consumer端配置 优于 Provider配置 优于 全局配置,
最后是Dubbo Hard Code的配置值(见配置文档)
多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
0.在低压力时间段,先升级一半提供者为新版本
1.再将所有消费者升级为新版本
2然后将剩下的一半提供者升级为新版本
老版本服务提供者配置:
http://dubbo.apache.org/zh-cn/docs/user/demos/multi-versions.html
在服务提供者中复制多个impl。起不同的名字
配置多个文件的路径及信息。
服务消费者调用时,可自由配置版本
添加后,即使服务提供者不启动,启动当前的消费者,也不会出现错误。
dubbo与springboot整合的三种方式
1、将服务提供者注册到注册中心(如何暴露服务)
1.1导入Dubbo的依赖 和 zookeeper 客户端
2、让服务消费者去注册中心订阅服务提供者的服务地址
Springboot与Dubbo整合的三种方式
2.1导入dubbo-starter。在application.properties配置属性,使用@Service【暴露服务】,使用@Reference【引用服务】
2.2保留Dubbo 相关的xml配置文件
导入dubbo-starter,使用@ImportResource导入Dubbo的xml配置文件
3、使用 注解API的方式
将每一个组件手动配置到容器中,让dubbo来扫描其他的组件
即
- Springboot与dubbo整合的三种方式
- 1.导入dubbo-starter,在application.properties配置属性,使用@Service暴露服务,使用@Reference远程调用
- 服务,同时要开启包扫描功能,可以在配置文件中声明,也可以在启动类中开启@EnableDubbo注解
- 2.保留dubbo xml配置文件的方式,provider.xml的方式。在启动类中写@ImportResource(locations = “classpath:provider.xml”)
- 3.使用注解API的方式,写配置类。DubboConfig。将每一个组件手动创建到容器中。
/*配置dubbo规则*/
//什么标签,就有什么样的config
public class MyDubboConfig {
// <dubbo:application name="user-service-provider"></dubbo:application>
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("boot-user-service-provider");
return applicationConfig;
}
// <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
@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="20880"></dubbo:protocol>
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
// <dubbo:service interface="com.yujie.service.UserService" ref="userServiceImpl"></dubbo:service>
@Bean
public ServiceConfig<UserService> userServiceServiceConfig(UserService userService){
ServiceConfig<UserService> serviceConfig=new ServiceConfig<>();
serviceConfig.setInterface(UserService.class);
serviceConfig.setRef(userService);
serviceConfig.setVersion("1.0.0");
//配置每一个method的信息
MethodConfig methodConfig=new MethodConfig();
methodConfig.setName("getUserAddressList");
methodConfig.setTimeout(1000);
//将method的设置关联到service配置中
List<MethodConfig> methods=new ArrayList<>();
methods.add(methodConfig);
serviceConfig.setMethods(methods);
return serviceConfig;
}
}
@EnableDubbo //开启基于注解的dubbo功能
//@ImportResource(locations = "classpath:provider.xml")
@DubboComponentScan("com.yujie") //指定配置包扫描路径
@SpringBootApplication
public class BootUserServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootUserServiceProviderApplication.class, args);
}
}