真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

KnativeServingSDK開發(fā)的方法是什么

這篇文章主要講解了“Knative Serving SDK開發(fā)的方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Knative Serving SDK開發(fā)的方法是什么”吧!

成都創(chuàng)新互聯(lián)公司是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),小程序制作,10余年建站對戶外休閑椅等多個(gè)領(lǐng)域,擁有豐富的網(wǎng)站制作經(jīng)驗(yàn)。

Golang Context

在正式開始介紹 Knative Serving SDK 之前,我們先簡單介紹一下 Golang Context 的機(jī)理。因?yàn)樵?Knative Serving 中 client、Informer 的初始化和信息傳遞完全是基于 Golang Context 實(shí)現(xiàn)的。

Golang 是從 1.7 版本開始引入的 Context ,Golang 的 Context 可以很好的簡化多個(gè) goroutine 之間以及請求域間的數(shù)據(jù)傳遞、取消信號和截至?xí)r間等相關(guān)操作。Context 主要有兩個(gè)作用:

  1. 傳輸必要的數(shù)據(jù);

  2. 進(jìn)行協(xié)調(diào)控制,比如終止 goroutein、設(shè)置超時(shí)時(shí)間等。

Context 定義

Context 本身是一個(gè)接口。

type Context interface {
	Deadline() (deadline time.Time, ok bool)
	Done() <-chan struct{}
	Err() error
	Value(key interface{}) interface{}
}

這個(gè)接口中定義了四個(gè)方法,下面分別介紹:

  • Deadline 方法是獲取設(shè)置的截止時(shí)間的意思,到了這個(gè)時(shí)間點(diǎn),Context 會(huì)自動(dòng)發(fā)起取消請求;

  • Done 方法返回一個(gè)只讀的 chan,如果該方法返回的 chan 可以讀取,則意味著 parent Context 已經(jīng)發(fā)起了取消請求, 此時(shí)應(yīng)該做清理操作,然后退出 goroutine 并釋放資源;

  • Err 方法返回取消的錯(cuò)誤原因;

  • Value 方法獲取該 Context 上綁定的值,是一個(gè)鍵值對。所以要通過一個(gè) Key 才可以獲取對應(yīng)的值,這個(gè)值是線程安全的。

關(guān)于 Context 主要記住一點(diǎn):可以通過 Value 傳遞數(shù)據(jù),Value 是一個(gè)鍵值對結(jié)構(gòu)。更多詳細(xì)的介紹可以參見下面這些文章:

  • Concurrency Patterns in Go

  • How to correctly use context.Context in Go 1.7

  • Using context cancellation in Go

  • Go Context

Knative Serving client 源碼淺析

在 Context 的這些特性中,Knative Serving 中重度依賴的是 Value 功能。以  Service 的 Informer 初始化為例進(jìn)行說明,這里可以看到源碼。

Informer “構(gòu)造函數(shù)”是在 init 函數(shù)中自動(dòng)注冊到 injection.Default 中的。當(dāng) Informer “構(gòu)造函數(shù)”被調(diào)用之后會(huì)自動(dòng)把生成的 Informer 注入到 Context 中 context.WithValue(ctx, Key{}, inf), inf.Informer()。

Knative Serving SDK開發(fā)的方法是什么

從上圖中可以看到:Informer 初始化的時(shí)候需要調(diào)用 factory,而 factory 本身是從  Context 中獲取的。下面我們再看看 factory 是怎么初始化的。factory 的初始化。 Knative Serving SDK開發(fā)的方法是什么

上圖可以發(fā)現(xiàn),factory 也是把“構(gòu)造函數(shù)”注冊到 injection.Default 中,并會(huì)將生成的 SharedInformerFactory 注入到 Context 中。而且 factory 中使用的 client (鏈接 kube-apiserver 使用的對象)也是從 Context 獲取到的。

可以說 Knative Serving SDK 初始化的過程是面向 Context 編程的。關(guān)鍵對象是自動(dòng)注入到 Context,在使用的時(shí)候從 Context 中取出。

順帶提一點(diǎn),Knative Serving 的日志對象也是在 Context 保存的,當(dāng)需要打印日志的時(shí)候先通過 logger := logging.FromContext(ctx) 從 Context 中拿到 logger,然后就可以使用了。這樣做的好處是可以通過管理 logger 對象,比如做 trace 功能。

如下所示是基于 logger 打印出來的日志,可以看到對于同一個(gè)請求的處理是可以通過 traceID 進(jìn)行追蹤的。下面這段日志都是對 577f8de5-cec9-4c17-84f7-f08d39f40127 這個(gè)  trace 的處理。

{"level":"info","ts":"2019-08-28T20:24:39.871+0800","caller":"controller/service.go:67","msg":"Reconcile: default/helloworld-go","knative.dev/traceid":"be5ec711-6ca3-493c-80ed-dddfa21fd576","knative.dev/key":"default/helloworld-go"}
{"level":"info","ts":"2019-08-28T20:24:39.871+0800","caller":"controller/controller.go:339","msg":"Reconcile succeeded. Time taken: 487.347μs.","knative.dev/traceid":"90653eda-644b-4b1e-8bdb-4a1a7a7ff0d8","knative.dev/key":"eci-test/helloworld-go"}
{"level":"info","ts":"2019-08-28T20:24:39.871+0800","caller":"controller/service.go:106","msg":"service: default/helloworld-go route: default/helloworld-go ","knative.dev/traceid":"be5ec711-6ca3-493c-80ed-dddfa21fd576","knative.dev/key":"default/helloworld-go"}
{"level":"info","ts":"2019-08-28T20:24:39.872+0800","caller":"controller/service.go:67","msg":"Reconcile: eci-test/helloworld-go","knative.dev/traceid":"22f6c77d-8365-4773-bd78-e011ccb2fa3d","knative.dev/key":"eci-test/helloworld-go"}
{"level":"info","ts":"2019-08-28T20:24:39.872+0800","caller":"controller/service.go:116","msg":"service: default/helloworld-go revisions: 1 ","knative.dev/traceid":"be5ec711-6ca3-493c-80ed-dddfa21fd576","knative.dev/key":"default/helloworld-go"}
{"level":"info","ts":"2019-08-28T20:24:39.872+0800","caller":"controller/service.go:118","msg":"service: default/helloworld-go revision: default/helloworld-go-cgt65 ","knative.dev/traceid":"be5ec711-6ca3-493c-80ed-dddfa21fd576","knative.dev/key":"default/helloworld-go"}
{"level":"info","ts":"2019-08-28T20:24:39.872+0800","caller":"controller/controller.go:339","msg":"Reconcile succeeded. Time taken: 416.527μs.","knative.dev/traceid":"be5ec711-6ca3-493c-80ed-dddfa21fd576","knative.dev/key":"default/helloworld-go"}
{"level":"info","ts":"2019-08-28T20:24:39.872+0800","caller":"controller/service.go:106","msg

使用 Knative Serving SDK

介紹完 Knative Serving client 的初始化過程,下面我們看一下應(yīng)該如何在代碼中用 Knative Serving SDK 進(jìn)行編碼。 示例參見:https://github.com/knative-sample/serving-controller/blob/v0.1/cmd/app/app.go

這個(gè)示例中首先使用配置初始化 *zap.SugaredLogger 對象,然后基于 ctx := signals.NewContext() 生成一個(gè) Context。signals.NewContext() 作用是監(jiān)聽 SIGINT 信號,也就是處理 CTRL+c 指令。這里用到了 Context 接口的 Done 函數(shù)機(jī)制。

構(gòu)造 Informer

接著使用 ctx, informers := injection.Default.SetupInformers(ctx, cfg) 構(gòu)造出所有的 informer,然后調(diào)用下面這段代碼執(zhí)行注入,把 informer 注入到 Context 中。

// Start all of the informers and wait for them to sync.
	logger.Info("Starting informers.")
	if err := controller.StartInformers(ctx.Done(), informers...); err != nil {
		logger.Fatalw("Failed to start informers", err)
	}

Knative Serving SDK開發(fā)的方法是什么

從 Context 中獲取 Informer

實(shí)例代碼: https://github.com/knative-sample/serving-controller/blob/v0.1/pkg/controller/controller.go

Knative Serving SDK開發(fā)的方法是什么

如上所示,所有的 informer 都是從 Context 中獲取的。

最后 Controller 初始化一個(gè) Reconciler 接口,接口的定義如下, 里面只有一個(gè) Reconcile 函數(shù)。這個(gè)使用方式和 sigs.k8s.io/controller-runtime 使用的邏輯是一樣的。如果你之前寫過 Operator 之類的功能,對這個(gè)操作應(yīng)該不會(huì)陌生。

// Reconciler is the interface that controller implementations are expected
// to implement, so that the shared controller.Impl can drive work through it.
type Reconciler interface {
	Reconcile(ctx context.Context, key string) error
}

在 Reconcile 中調(diào)用 Knative API

代碼示例: https://github.com/knative-sample/serving-controller/blob/v0.1/pkg/controller/service.go

Knative Serving SDK開發(fā)的方法是什么

現(xiàn)在就可以在 Reconcile 中通過 c.serviceLister.Services(namespace).Get(name) 這種方式直接操作 Seving 資源了。

感謝各位的閱讀,以上就是“Knative Serving SDK開發(fā)的方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Knative Serving SDK開發(fā)的方法是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!


標(biāo)題名稱:KnativeServingSDK開發(fā)的方法是什么
文章網(wǎng)址:http://weahome.cn/article/jpgpce.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部