Closed chpengzh closed 5 years ago
不知道特性需求是不是应该在这里提,如果不对,请关闭这个ticket
@chpengzh 目前 SOFA RPC 有通过 properties 的方式提供一些全局性配置,具体到接口的指定配置目前还没有做,有兴趣设计一下接口级的配置方案然后 PR 共建下吗?
com.alipay.sofa
开头这个是目前 SOFA 体系内的标准,暂时不会简化掉哈。
可以试试
非常感谢,欢迎随时沟通~
@chpengzh @JervyShi 也许也可以考虑在注解解析中支持 spring placeholder 解析,就像是:
@SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt", directUrl = "${sofa.sample.url}"))
private SampleService sampleService;
spring cloud feign 是通过这种方式支持的配置文件和注解之间的关联。
@JervyShi 接口配置方案应该在哪里说明?在这个issue下面写可以么
还有一个问题,读取property属性的逻辑放在 sofa-rpc-boot-projects 这个项目里面, 而根据协议类型获取 BindingConverter
的函数又在 ServiceAnnotationBeanPostProcessor
也就是sofa-boot
项目里面,很难做到不破坏现有封装的情况下完整完成这个需求, 因此提前声明可能会修改两个项目。
届时需要先编译生效sofa-boot/runtime-sofa-boot-starter
再编译 sofa-rpc-boot-projects
。
Environment
中的变量进行引用配置重载顺序参考SpringBoot文档, 在该方案下:
ref
键定义支持包名或类名, 值定义为标准URI格式
com.alipay.sofa.rpc:
ref:
com.some.clazz.DemoService: bolt://127.0.0.1:9999?retry=1&timeout=1000
com.some.pkg: bolt://127.0.0.1:10000
# Scheme support: bolt:// rest:// dubbo:// h2c://
# Param support: weight, timeout, address_wait_time, conn_timeout, retry, type
匹配策略满足包名+类名的最长匹配
com.alipay.sofa.rpc: ref: a.b.C: bolt://127.0.0.1:9999 a.b: rest://127.0.0.1:10000
### 当 `Environment`中不存在引用定义时,选择注解定义
(规则略, 同前)
顺带一提该方案暂时实现在 sofa-boot, sofa-rpc-boot-projects,需要依次编译这两个项目
目前还没有编写单元测试的思路,可以暂时使用sofa-stack-demo进行简单状态测试。
@chpengzh SOFA Boot 中适合提供 Environment 的通用 API,不适合直接理解 SOFA RPC 中的具体参数。@QilongZhang SOFA Boot 内看怎样适合透出基于环境变量的配置 SPI?
对的,让我苦恼的就是这个。 核心矛盾点在于获取 BindingConverter 类型的时候一定要解析协议内容,就不得不去读取环境变量,不得不破坏现有的逻辑. 请给出修改建议吧
@chpengzh 接口方案直接在这里讨论 OK 的, @ujjboy @leizhiyuan 也可以一起看下方案哈。
@chpengzh 我们讨论了一下, @ScienJus 提到的方式支持注解的可配置更 Spring Style,对现有结构入侵也更少,可以考虑下这种实现方式。
@JervyShi 如果在这种场景下,如果这个环境变量不存在,应该报错还是其他逻辑
还有就是如果采取这种方式,就意味着放弃了修改协议类型的这个特性,还是继续沿用注解中bindingType
的协议类型. 原本bolt://127.0.0.1:9999?xx=xx
配置,就变成了 127.0.0.1:9999?xx=xx
(或者只保留地址端口127.0.0.1:9999
)
@JervyShi 如果确认这样的话, 我就按照 @ScienJus 的方案进行修改
@chpengzh 可以保留 Spring 的 PropertySource 的原始占位符替换逻辑,环境变量第一优先级,然后是 properties 文件配置,这些应该有现有的方法可以直接从 Spring 上下文获取。
基于以上修改方式的话,每个注解属性的值应该保留其原意,比如 bindingType 需要修改也可以通过类似的方式使用占位符替换,亦或者其他属性的配置。
@JervyShi 了解,晚些空了再出一版
@chpengzh @JervyShi 对于 SofaReferenceBinding 注解的 placeholder 解析,倾向直接放在 SOFABoot 中完成,理论上应该是框架应该负责的,这块 @chpengzh 可以在 SOFABoot PR 优化.
因为不属于框架配置逻辑一部分,接口配置的生效规则可以在 SOFARPC Starter 由每个 converter 负责,
@JervyShi @chpengzh 接口级别的属性配置可否提供一个 Hook API 方式给用户扩展,因为理论上使用替换符已经可以解决问题了,是否可以讨论下有必要在 Converter 加一个变量优先级的判断?
另外这部分的需求背景请 @chpengzh 描述具体些。
@QilongZhang 优先级不建议使用单独参数控制,Spring 默认的优先级策略最普适,符合用户直觉。本质上这个可以理解为不是为了某一个单一特性提供的,我们 SOFA 体系内的注解在获取配置数据时都可以 resolvePlaceHolder
处理一下,提供类 Spring PropertySource 的支持。
@QilongZhang 优先级不建议使用单独参数控制,Spring 默认的优先级策略最普适,符合用户直觉。本质上这个可以理解为不是为了某一个单一特性提供的,我们 SOFA 体系内的注解在获取配置数据时都可以
resolvePlaceHolder
处理一下,提供类 Spring PropertySource 的支持。
嗯,是的,我也赞同。所以如果真有这种需求,倾向使用 Hook API 的形式给用户扩展,而不是通过比较复杂的配置形式。
目前遇到的情况是这样的:
生产环境下通常使用服务注册发现,这个现有的功能是没问题的。但是测试环境下,时常会使用到服务直连的功能。
而现有的服务直连是需要修改注解值并重新编译的。具体来讲就是修改@SofaReferencBinding注解中的参数(通常会用一个常量引用), 但是一旦测试环境修改host或者port,都需要修改常量并重新编译。这会非常不方便
String DEBUG_HOST="127.0.0.1:12200";
@SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt", directUrl = "DEBUG_HOST"))
private SampleService sampleService;
因此希望能够在 @SofaReferenceBinding 中支持环境配置来进行测试直连地址的
启动时,通过SpringBoot
默认的动态参数规则,就能简单的对直连引用进行配置
这个配置过程希望能像这样一样简单:
java -jar my-app.jar \
--com.alipay.sofa.rpc.ref.alice=bolt;//127.0.0.1:9999 \
--com.alipay.sofa.rpc.ref.bob=bolt://127.0.0.1:10000 \
--com.alipay.sofa.rpc.ref.carol=bolt://127.0.0.1:10001
目前的方案是支持 placeholder 的配置方法,使用placeholder支持引用注入:
@SofaReference(binding = @SofaReferenceBinding(
bindingType = "${sofa.sample.alice.type}",
directUrl="${sofa.sample.alice.url}"
))
private SampleService sampleService;
然后到时候启动需要进行这样的配置
java -jar my-app.jar \
--sofa.sample.alice.type=bolt \
--sofa.sample.alice.url=127.0.0.1:10001\
--sofa.sample.bob.type=bolt \
...
现在讨论的上下文大概是这样@QilongZhang
@chpengzh 好的,多谢说明。如果这样,注解支持 placeholder 应该就能满足你的需求啦 👍
Your question
目前 SOFA-RPC 提供了基于注解的直连参数配置方式 ,但是这种方式对于 artifact jar 来说不太友好,需要重新构建才能测试。 我认为 spring boot 的环境变量策略就是一个比较好的方法。
由于SOFA的服务是以接口类为单位的,希望能有类似于
logging.level
一样的配置方法,以application.yaml
为例:这样针对不同的包服务或者特定的类服务,就能简单的指定直连测试的地址。
对已经生成的 artifact jar 而言,也可以简单的通过修改启动参数的方式进行直连测试
还有
com.alipay.sofa
感觉有点长,yaml里面用着怪怪的,改短点有商量么?Environment
java -version
): 1.8+uname -a
): any