Code Monkey home page Code Monkey logo

Comments (24)

QilongZhang avatar QilongZhang commented on May 28, 2024 1

@chpengzh 好的,多谢说明。如果这样,注解支持 placeholder 应该就能满足你的需求啦 👍

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

不知道特性需求是不是应该在这里提,如果不对,请关闭这个ticket

from sofa-rpc-boot-projects.

JervyShi avatar JervyShi commented on May 28, 2024

@chpengzh 目前 SOFA RPC 有通过 properties 的方式提供一些全局性配置,具体到接口的指定配置目前还没有做,有兴趣设计一下接口级的配置方案然后 PR 共建下吗?

com.alipay.sofa 开头这个是目前 SOFA 体系内的标准,暂时不会简化掉哈。

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

可以试试

from sofa-rpc-boot-projects.

JervyShi avatar JervyShi commented on May 28, 2024

非常感谢,欢迎随时沟通~

from sofa-rpc-boot-projects.

ScienJus avatar ScienJus commented on May 28, 2024

@chpengzh @JervyShi 也许也可以考虑在注解解析中支持 spring placeholder 解析,就像是:

@SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt", directUrl = "${sofa.sample.url}"))
private SampleService sampleService;

spring cloud feign 是通过这种方式支持的配置文件和注解之间的关联。

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

@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.

chpengzh avatar chpengzh commented on May 28, 2024

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.

chpengzh avatar chpengzh commented on May 28, 2024

顺带一提该方案暂时实现在 sofa-boot, sofa-rpc-boot-projects,需要依次编译这两个项目

目前还没有编写单元测试的思路,可以暂时使用sofa-stack-demo进行简单状态测试。

from sofa-rpc-boot-projects.

JervyShi avatar JervyShi commented on May 28, 2024

@chpengzh SOFA Boot 中适合提供 Environment 的通用 API,不适合直接理解 SOFA RPC 中的具体参数。@QilongZhang SOFA Boot 内看怎样适合透出基于环境变量的配置 SPI?

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

对的,让我苦恼的就是这个。 核心矛盾点在于获取 BindingConverter 类型的时候一定要解析协议内容,就不得不去读取环境变量,不得不破坏现有的逻辑. 请给出修改建议吧

from sofa-rpc-boot-projects.

JervyShi avatar JervyShi commented on May 28, 2024

@chpengzh 接口方案直接在这里讨论 OK 的, @ujjboy @leizhiyuan 也可以一起看下方案哈。

from sofa-rpc-boot-projects.

JervyShi avatar JervyShi commented on May 28, 2024

@chpengzh 我们讨论了一下, @ScienJus 提到的方式支持注解的可配置更 Spring Style,对现有结构入侵也更少,可以考虑下这种实现方式。

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

@JervyShi 如果在这种场景下,如果这个环境变量不存在,应该报错还是其他逻辑

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

还有就是如果采取这种方式,就意味着放弃了修改协议类型的这个特性,还是继续沿用注解中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.

chpengzh avatar chpengzh commented on May 28, 2024

@JervyShi 如果确认这样的话, 我就按照 @ScienJus 的方案进行修改

from sofa-rpc-boot-projects.

JervyShi avatar JervyShi commented on May 28, 2024

@chpengzh 可以保留 Spring 的 PropertySource 的原始占位符替换逻辑,环境变量第一优先级,然后是 properties 文件配置,这些应该有现有的方法可以直接从 Spring 上下文获取。

基于以上修改方式的话,每个注解属性的值应该保留其原意,比如 bindingType 需要修改也可以通过类似的方式使用占位符替换,亦或者其他属性的配置。

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

@JervyShi 了解,晚些空了再出一版

from sofa-rpc-boot-projects.

QilongZhang avatar QilongZhang commented on May 28, 2024

@chpengzh @JervyShi 对于 SofaReferenceBinding 注解的 placeholder 解析,倾向直接放在 SOFABoot 中完成,理论上应该是框架应该负责的,这块 @chpengzh 可以在 SOFABoot PR 优化.

因为不属于框架配置逻辑一部分,接口配置的生效规则可以在 SOFARPC Starter 由每个 converter 负责,

from sofa-rpc-boot-projects.

QilongZhang avatar QilongZhang commented on May 28, 2024

@JervyShi @chpengzh 接口级别的属性配置可否提供一个 Hook API 方式给用户扩展,因为理论上使用替换符已经可以解决问题了,是否可以讨论下有必要在 Converter 加一个变量优先级的判断?

另外这部分的需求背景请 @chpengzh 描述具体些。

from sofa-rpc-boot-projects.

JervyShi avatar JervyShi commented on May 28, 2024

@QilongZhang 优先级不建议使用单独参数控制,Spring 默认的优先级策略最普适,符合用户直觉。本质上这个可以理解为不是为了某一个单一特性提供的,我们 SOFA 体系内的注解在获取配置数据时都可以 resolvePlaceHolder 处理一下,提供类 Spring PropertySource 的支持。

from sofa-rpc-boot-projects.

QilongZhang avatar QilongZhang commented on May 28, 2024

@QilongZhang 优先级不建议使用单独参数控制,Spring 默认的优先级策略最普适,符合用户直觉。本质上这个可以理解为不是为了某一个单一特性提供的,我们 SOFA 体系内的注解在获取配置数据时都可以 resolvePlaceHolder 处理一下,提供类 Spring PropertySource 的支持。

嗯,是的,我也赞同。所以如果真有这种需求,倾向使用 Hook API 的形式给用户扩展,而不是通过比较复杂的配置形式。

from sofa-rpc-boot-projects.

chpengzh avatar chpengzh commented on May 28, 2024

目前遇到的情况是这样的:

生产环境下通常使用服务注册发现,这个现有的功能是没问题的。但是测试环境下,时常会使用到服务直连的功能。

而现有的服务直连是需要修改注解值并重新编译的。具体来讲就是修改@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.

JervyShi avatar JervyShi commented on May 28, 2024

Link to sofastack/sofa-boot#264

from sofa-rpc-boot-projects.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.