前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务框架saf-8:saf-dubbo之method-config的apollo支持

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

作者头像
千里行走
发布2020-03-04 14:02:44
4830
发布2020-03-04 14:02:44
举报
文章被收录于专栏:千里行走千里行走

目录

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千里行走 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档