Giter Site home page Giter Site logo

Comments (6)

shima-park avatar shima-park commented on May 26, 2024 1

我刚刚又想了下。

如果在DefaultNamespace定义过的Namespace就会去加载配置。
导致需要加载的Namespace变成(DefaultNamespace + PreloadNamespaces)的并集.
这两个可选参数之间的部分功能是重合的。

Apollo的默认Namespace是application。默认情况下sdk也是将DefaultNamespace设置为application,如果不设置,导致DefaultNamespace变成一个必填参数, 否则在Get时无默认Namespace可用

而设置了默认Namespace而不去加载,又会导致行为不一致。

在实际使用过程中,application并不是总是存在。会有使用者不使用,不发布。导致一些意外的问题。issue

还是让配置项的功能,职责单纯比较好,哪怕可能会有少许啰嗦

from agollo.

shima-park avatar shima-park commented on May 26, 2024

1.你可以把sdk看作是一个map,在没有PreloadNamespaces或者AutoFetchOnCacheMiss选项去初始化时。
就是一个空的map,get任何值都会是空。

// 假如Apollo中有namespace: application  内容: timeout:100

// agollo.Init 前
cache := map[string]map[string]interface{}{}

// agollo.Init,添加PreloadNamespaces("application") 进行初始化
agollo.Init(
...,
agollo.PreloadNamespaces("application"),
)

// agollo.Init 后
cache := map[string]map[string]interface{}{
    "application": map[string]interface{}{
        "timeout": 100,
    },
}

fmt.Println(agollo.Get("timeout") // print 100
  1. 这个map是有两层的,map[namespace]map[key]value。DefaultNamespace是设置Get时,如果没有传agollo.WithNamespace,设置默认使用什么namespace读取配置的配置选项。默认情况下使用application作为默认的namespace
// 假如Apollo中
// 有namespace: application  内容: timeout:100
// 有namespace: config2        内容: timeout:222

// 没使用DefaultNamespace
agollo.Init(
...,
agollo.PreloadNamespaces("application", "config2"),
)

// agollo.Get("timeout") == cache["application"]["timeout"]
fmt.Println(agollo.Get("timeout")) // print 100

// agollo.Get("timeout"), agollot.WithNamespace("config2") == cache["config2"]["timeout"]
fmt.Println(agollo.Get("timeout"), agollot.WithNamespace("config2")) // print 222



// 如果使用DefaultNamespace后
agollo.Init(
...,
agollo.DefaultNamespace("config2")
agollo.PreloadNamespaces("application", "config2"),
)

// agollo.Get("timeout") == cache["config2"]["timeout"]
fmt.Println(agollo.Get("timeout") ) // print 222

from agollo.

KScaesar avatar KScaesar commented on May 26, 2024

謝謝您的解說
已給 star
跟 viper 的結合很棒

只是預想 default 值
應該是 init 就會採用
結果居然得到 是一个空的map
感覺不太符合一般人思路?

還要另外設定 PreloadNamespaces 的數值, 且這個值 跟 default 一樣
才可正常連線到 apollo

謝謝你提供這個 lib
或許說明文件可以提一下
我自己嘗試, 依照你的文件
單獨設置 AutoFetchOnCacheMiss 雖然可以讀取
但沒有明顯的 namespace , 會怕連錯
所以 try 很久

from agollo.

shima-park avatar shima-park commented on May 26, 2024

感谢你的反馈和star。

确实有你说的一个问题,我在Default的时候设置了,且在Preload列表中不存在时,却没有去加载,Default设置的这个namespace应该是确切存在,使用者才会传入。

在增加DefaultNamespace这个option的时候,我只考虑到改变Get的行为,
它只是为了简化使用单一Namespace时,且默认使用的namespace不是application时,可以通过这个选项,重置Get默认读取的Namepsace行为。
不然默认读取的namespace不是application时,每次Get都需要传递agollo.WithNamespace("xxx")

PreloadNamespaces跟DefaultNamespace还是不同的,就像你最后说的,指明所需要用的namespace进行初始化

from agollo.

KScaesar avatar KScaesar commented on May 26, 2024

我想了一下, 初始值跟預設值, 或許應該分開來看
default 是沒給數值時, 才採用的
你現在的作法
似乎是 把 DefaultNamespace 初始值 定為 application?

換成這個作法, 您覺得如何呢?

將預設值的初始值 定為空字串
等到實際進行 GET 動作, 發現 DefaultNamespace 為空字串
這時候設置才為設置為 application

可能你之前就這樣做了
只是我太偷懶 沒認真看懂你回覆的東西

from agollo.

shima-park avatar shima-park commented on May 26, 2024

我觉得一定程度是,我取的这个Option的名字(DefaultNamespace)不太清晰,还有本身逻辑有一定交织
Apollo本身的DefaultNamespace 和 调用Get方法时的DefaultNamespace

可能设置为SetGetDefaultNamespace之类的,会更清晰。

所以在设置DefaultNamespace后还要再PreloadNamespaces中重复定义一次,感觉确实有点别扭

按照你说的逻辑优化了一下,DefaultNamespace初始值为空,實際進行 GET 動作时,DefaultNamespace为空再设置application
commit
release

from agollo.

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.