Comments (24)
@chpengzh 好的,多谢说明。如果这样,注解支持 placeholder 应该就能满足你的需求啦 👍
from sofa-rpc-boot-projects.
不知道特性需求是不是应该在这里提,如果不对,请关闭这个ticket
from sofa-rpc-boot-projects.
@chpengzh 目前 SOFA RPC 有通过 properties 的方式提供一些全局性配置,具体到接口的指定配置目前还没有做,有兴趣设计一下接口级的配置方案然后 PR 共建下吗?
com.alipay.sofa
开头这个是目前 SOFA 体系内的标准,暂时不会简化掉哈。
from sofa-rpc-boot-projects.
可以试试
from sofa-rpc-boot-projects.
非常感谢,欢迎随时沟通~
from sofa-rpc-boot-projects.
@chpengzh @JervyShi 也许也可以考虑在注解解析中支持 spring placeholder 解析,就像是:
@SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt", directUrl = "${sofa.sample.url}"))
private SampleService sampleService;
spring cloud feign 是通过这种方式支持的配置文件和注解之间的关联。
from sofa-rpc-boot-projects.
@JervyShi 接口配置方案应该在哪里说明?在这个issue下面写可以么
还有一个问题,读取property属性的逻辑放在 sofa-rpc-boot-projects 这个项目里面, 而根据协议类型获取 BindingConverter
的函数又在 ServiceAnnotationBeanPostProcessor
也就是sofa-boot
项目里面,很难做到不破坏现有封装的情况下完整完成这个需求, 因此提前声明可能会修改两个项目。
届时需要先编译生效sofa-boot/runtime-sofa-boot-starter
再编译 sofa-rpc-boot-projects
。
from sofa-rpc-boot-projects.
RPC引用生成方案:
优先使用 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
# Class a.b.C match bolt://127.0.0.1:9999
# Class a.b.C.D match bolt://127.0.0.1:9999
# Class a.b.D match rest://127.0.0.1:10000
# Class a.c.D match null
当 Environment
中不存在引用定义时,选择注解定义
(规则略, 同前)
from sofa-rpc-boot-projects.
顺带一提该方案暂时实现在 sofa-boot, sofa-rpc-boot-projects,需要依次编译这两个项目
目前还没有编写单元测试的思路,可以暂时使用sofa-stack-demo进行简单状态测试。
from sofa-rpc-boot-projects.
@chpengzh SOFA Boot 中适合提供 Environment 的通用 API,不适合直接理解 SOFA RPC 中的具体参数。@QilongZhang SOFA Boot 内看怎样适合透出基于环境变量的配置 SPI?
from sofa-rpc-boot-projects.
对的,让我苦恼的就是这个。 核心矛盾点在于获取 BindingConverter 类型的时候一定要解析协议内容,就不得不去读取环境变量,不得不破坏现有的逻辑. 请给出修改建议吧
from sofa-rpc-boot-projects.
@chpengzh 接口方案直接在这里讨论 OK 的, @ujjboy @leizhiyuan 也可以一起看下方案哈。
from sofa-rpc-boot-projects.
@chpengzh 我们讨论了一下, @ScienJus 提到的方式支持注解的可配置更 Spring Style,对现有结构入侵也更少,可以考虑下这种实现方式。
from sofa-rpc-boot-projects.
@JervyShi 如果在这种场景下,如果这个环境变量不存在,应该报错还是其他逻辑
from sofa-rpc-boot-projects.
还有就是如果采取这种方式,就意味着放弃了修改协议类型的这个特性,还是继续沿用注解中bindingType
的协议类型. 原本 bolt://127.0.0.1:9999?xx=xx
配置,就变成了 127.0.0.1:9999?xx=xx
(或者只保留地址端口127.0.0.1:9999
)
from sofa-rpc-boot-projects.
@JervyShi 如果确认这样的话, 我就按照 @ScienJus 的方案进行修改
from sofa-rpc-boot-projects.
@chpengzh 可以保留 Spring 的 PropertySource 的原始占位符替换逻辑,环境变量第一优先级,然后是 properties 文件配置,这些应该有现有的方法可以直接从 Spring 上下文获取。
基于以上修改方式的话,每个注解属性的值应该保留其原意,比如 bindingType 需要修改也可以通过类似的方式使用占位符替换,亦或者其他属性的配置。
from sofa-rpc-boot-projects.
@JervyShi 了解,晚些空了再出一版
from sofa-rpc-boot-projects.
@chpengzh @JervyShi 对于 SofaReferenceBinding 注解的 placeholder 解析,倾向直接放在 SOFABoot 中完成,理论上应该是框架应该负责的,这块 @chpengzh 可以在 SOFABoot PR 优化.
因为不属于框架配置逻辑一部分,接口配置的生效规则可以在 SOFARPC Starter 由每个 converter 负责,
from sofa-rpc-boot-projects.
@JervyShi @chpengzh 接口级别的属性配置可否提供一个 Hook API 方式给用户扩展,因为理论上使用替换符已经可以解决问题了,是否可以讨论下有必要在 Converter 加一个变量优先级的判断?
另外这部分的需求背景请 @chpengzh 描述具体些。
from sofa-rpc-boot-projects.
@QilongZhang 优先级不建议使用单独参数控制,Spring 默认的优先级策略最普适,符合用户直觉。本质上这个可以理解为不是为了某一个单一特性提供的,我们 SOFA 体系内的注解在获取配置数据时都可以 resolvePlaceHolder
处理一下,提供类 Spring PropertySource 的支持。
from sofa-rpc-boot-projects.
@QilongZhang 优先级不建议使用单独参数控制,Spring 默认的优先级策略最普适,符合用户直觉。本质上这个可以理解为不是为了某一个单一特性提供的,我们 SOFA 体系内的注解在获取配置数据时都可以
resolvePlaceHolder
处理一下,提供类 Spring PropertySource 的支持。
嗯,是的,我也赞同。所以如果真有这种需求,倾向使用 Hook API 的形式给用户扩展,而不是通过比较复杂的配置形式。
from sofa-rpc-boot-projects.
目前遇到的情况是这样的:
生产环境下通常使用服务注册发现,这个现有的功能是没问题的。但是测试环境下,时常会使用到服务直连的功能。
而现有的服务直连是需要修改注解值并重新编译的。具体来讲就是修改@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
from sofa-rpc-boot-projects.
Link to sofastack/sofa-boot#264
from sofa-rpc-boot-projects.
Related Issues (20)
- Add sort pom maven plugin for master.
- Add nacos client support in pom
- Add disable tracing configuration via Spring Boot's application.properties
- 使用consul作为注册中心,但是服务能发布,消费者却订阅失败,提示如下 HOT 1
- Curator 版本和 sofa-rpc 的 Curator 版本不一致导致依赖冲突 HOT 2
- cherry pick from 5.x
- 如何添加全局的ProviderConfig.Parameters HOT 3
- sofa-rpc是否有计划升级nacos版本? HOT 3
- SofaBootRpcAutoConfiguration中的configureProcessorMap处理不支持自定义registry HOT 6
- SofaBootRpcAutoConfiguration中的所有@bean没有@Conditional
- sofareigstry按文档版本 无法注册
- rpc扩展注册中心Bug
- update sofaboot 3.1.4
- 全局 timeout 设置
- 发布dubbo协议实现dubbo过滤器不生效 HOT 2
- jax.rs 包原生的@Provider无效,自定义rest api annotation不生效 HOT 5
- AbstractInterfaceConfig抽象类中存在validation(jsr303验证)如何设置为true HOT 2
- sofaboot发布dubbo协议端口占用启动不报错 HOT 2
- update rpc 554 HOT 1
- Some ideas about using RPC with SOFABoot HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sofa-rpc-boot-projects.