微服务框架saf-8:saf-dubbo之method-config的apollo支持

2020-03-04 14:02:44 浏览数 (1)

目录

(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中并没有配置这个类。

0 人点赞