专栏首页千里行走微服务框架saf-8:saf-dubbo之method-config的apollo支持

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

目录

(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中:

} 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:

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

本文分享自微信公众号 - 千里行走(a_thousands_of_miles),作者:千里行走

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务框架saf-6:saf-http之度量

    3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。

    千里行走
  • rocketmq-3:rocketmq流控/重试机制与应对

    本文基于rocketmq-4.3.2版本,不同版本是存在机制差异的,请阅读rocketmq源码。

    千里行走
  • 容器化生产环境集成apollo配置中心与skywalking全链路追踪

    3.制作apollo-skywalking-docker-image镜像注意sk-plugin选择

    千里行走
  • 灵活的设计组合

    组合比继承更灵活,因为它可以建模松散耦合的关系。对组件类的更改对复合类影响很小或没有影响。基于组成的设计更适合更改

    公众号---志学Python
  • wxPython_04_实现Frame之间的跳转/更新的一种方法

    wxPython是Python中重要的GUI框架,下面通过自己的方法实现模拟类似PC版微信登录,并跳转到主界面(朋友圈)的流程。

    用户2292951
  • CCLabelAtlas的宽度为奇数时的显示bug

    遇到一个很郁闷的bug,CCLabelAtlas设置文字内容在ipad上和android上正常,就只有iphone怎么显示都不正常。后来把它宽度 + 1,然后就...

    meteoric
  • Ryu:如何在LLDP中添加自定义LLDPDU

    在许多实验场景中,都需要使用链路发现协议(LLDP)来发现链路,从而构建网络拓扑。然而LLDP协议不仅仅可以用来发现拓扑,也可以用于时延检测等业务。LLDP通过...

    SDNLAB
  • ckeditor4与vue集成

    <!DOCTYPE html> <html>   <head>     <meta charset="utf-8">     <meta name="rende...

    ianzhi
  • Python Every Class Needs a __repr__

    当我们在Python中定义一个类的时候,如果我们通过print打印这个类的实例化对象,或者我们直接输入这个类实例化对象会返回怎么样的结果,如下代码:

    coders
  • 【DUBBO】 扩展机制ServiceLoaderExtensionLoader

    可扩展机制也就是SPI(Service Provider Interface)了,SPI是一种服务提供发现机制。一个服务通常指的是已知的接口,服务提供方就是这个...

    spilledyear

扫码关注云+社区

领取腾讯云代金券