目录
(1).关于saf
(2).前置准备
(3).saf支持dubbo-methodconfig与apollo结合使用
1.apollo配置规范
2.saf实现
(3).saf不支持dubbo的MethodConfig热更新
(4).相关文章
架构实战交流钉钉群号:23394754
目前寻找合适职位:百人规模创业公司的基础架构负责人,总架,CTO。
(1).关于saf
项目地址:
https://github.com/saf-group
1.一个微服务框架,完全基于注解的方式开发。
2.适用于云原生(K8S)下的微服务体系搭建,为技术中台提供底层支撑。
3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。
(2).前置准备
需要一个实际的体验例子:
微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署
(3).saf支持dubbo-methodconfig与apollo结合使用
1.apollo配置规范
saf规定saf的所有methodConfig的配置必须放到命名空间saf.dubbo.method-config中,因为methodconfig的配置必须遵循一定规则,放入独立空间方便管理。
注意saf.dubbo.method-config是private,每个dubbo-service都可能有,定义为public冲突了。
dubbo.rpc.instances = shoprpc
定义当前服务的rpc的实例都有哪些,用逗号分割,内容一定要和注解@EnableSafDubbo中的instance一致(惯例重于配置)。
dubbo.shoprpc.method-config.method-names = get-shop,test-same-method-name
定义每个具体的instance中要配置的方法(methodConfig),用逗号分割,注意方法不能是驼峰,必须是上述格式,因为springboot的key格式不支持。
注意,dubbo和method-config.method-names是固定字符串,不可以改,只有shoprpc可以改。
dubbo.shoprpc.method-config.get-shop.name = getShop
dubbo.shoprpc.method-config.get-shop.timeout = 1000
定义具体instance的每个方法的methodConfig属性值。
注意,dubbo和method-config是固定字符串,不可以改,shoprpc是实际要配置的rpc,get-shop是方法名,name和timeout是methodConfig属性名。
2.saf实现
主要代码位于模块saf-rpc-dubbo的SafDubboBeanValueBindingPostProcessor中:
代码语言:javascript复制} else if (bean instanceof SafDubboRPCInstanceNamesConfig) {
log.info("begin to bind config to SafDubboRPCInstanceNamesConfig:" beanName);
// 获得配置的所有rpc实例的instance,要和注解EnableSafDubbo中的instance名称一致
SafDubboRPCInstanceNamesConfig safDubboRPCConfigBean = (SafDubboRPCInstanceNamesConfig) bean;
String nsPrefix = SafDubboConstant.PREFIX_DUBBO ".rpc";
Bindable<?> target = Bindable.of(SafDubboRPCInstanceNamesConfig.class)
.withExistingValue(safDubboRPCConfigBean);
binder.bind(nsPrefix, target);
// 根据apollo配置实例化所有MethodConfig,配置方式举例如下:
/**
* dubbo.rpc-instances = shoprpc
*
* dubbo.shoprpc.method-config.method-names =
* get-shop,test-same-method-name,test-timeout-auto-refresh
*
* dubbo.shoprpc.method-config.get-shop.name = getShop
* dubbo.shoprpc.method-config.get-shop.timeout = 1000
*
* dubbo.shoprpc.method-config.test-same-method-name.name =
* testSameMethodName
* dubbo.shoprpc.method-config.test-same-method-name.timeout = 1000
*
* dubbo.shoprpc.method-config.test-timeout-auto-refresh.name =
* testTimeoutAutoRefresh
* dubbo.shoprpc.method-config.test-timeout-auto-refresh.timeout =
* 1000
**/
if (safDubboRPCConfigBean != null && safDubboRPCConfigBean.getInstances() != null) {
String[] rpcInstanceArray = safDubboRPCConfigBean.getInstances().split(",");
for (String rpcInstance : rpcInstanceArray) {
// dubbo.shoprpc.method-config
SafDubboRPCInstanceMethodNamesConfig methodNamesConfig = new SafDubboRPCInstanceMethodNamesConfig();
String methodNamesNSPrefix = SafDubboConstant.PREFIX_DUBBO "." rpcInstance ".method-config";
Bindable<?> methodNamesTarget = Bindable.of(SafDubboRPCInstanceMethodNamesConfig.class)
.withExistingValue(methodNamesConfig);
binder.bind(methodNamesNSPrefix, methodNamesTarget);
if (methodNamesConfig != null && methodNamesConfig.getMethodNames() != null) {
String[] methodNameArray = methodNamesConfig.getMethodNames().split(",");
for (String methodName : methodNameArray) {
// dubbo.shoprpc.method-config.names
MethodConfig mc = new MethodConfig();
String mcNSPrefix = SafDubboConstant.PREFIX_DUBBO "." rpcInstance ".method-config."
methodName;
Bindable<?> mcTarget = Bindable.of(MethodConfig.class).withExistingValue(mc);
binder.bind(mcNSPrefix, mcTarget);
if (mc.getName() != null) {
putMethodConfig(rpcInstance, methodName, mc);
}
}
}
}
}
}
然后在ServiceBean中设置methodconfigList:
代码语言:javascript复制// 注入Service apollo配置
else if (bean instanceof ServiceBean) {
......
// bind methodconfig
SafDubboRPCInstanceNamesConfig safDubboRPCInstanceNamesConfig = beanFactory.getBean(
SafDubboRPCInstanceNamesConfig.class.getSimpleName(), SafDubboRPCInstanceNamesConfig.class);
if (safDubboRPCInstanceNamesConfig != null) {
List<MethodConfig> methodConfigList = instanceToMethodConfigMap.get(instance);
serviceBean.setMethods(methodConfigList);
}
}
(3).saf不支持dubbo的MethodConfig热更新
有一定意义和需求,比如最重要的timeout。
原因是dubbo没有提供优雅的口子,除非使用反射等侵入性实现,但是这样做一是代码复杂,最重要的是侵入性太强,非常不愿意这样(雷太深)。
dubbo的MethodConfig生效流程:
主要是在dubbo的ServiceConfig中,在ServiceBean完成propertiesValues注入后,会进行初始化,全部在私有方法和属性中进行,没有留外接口子。
这里就不贴代码了。
关于apollo配置修改后如何自动更新methodConfig配置,代码位于模块saf-dubbo-rpc的SafDubboConfigRefreshAutoConfiguration
类,已经是@Deprecated,并不会生效,因为spring.factories中并没有配置这个类。