配置環(huán)境
堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都衛(wèi)生間隔斷小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站建設(shè)營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
在OSX系統(tǒng)上很容易安裝GO的可執(zhí)行文件:
brew?install?go
雖然Java或Ruby?(或者任何我知道的語言)?可以在本地文件系統(tǒng)的任何地方使用命令,,但是Go項目必須使用單一專用的地址,,并且在$GOPATH環(huán)境變量下可用。
第?1?段(可獲?1.54?積分)
R?e;?7個月前?
創(chuàng)建項目對于Logstash插件,Beats項目可以從模板創(chuàng)建。官方文檔的說明十分簡單。鑒于Go對文件系統(tǒng)上的位置的嚴(yán)格要求,只需按照以下說明生成一個新的即可使用的Go項目。默認(rèn)模板代碼將在控制臺中重復(fù)發(fā)送帶增量計數(shù)器的事件:./redditbeat?-e?-d?"*"
2016/12/13?22:55:56.013362?beat.go:267:?INFO
Home?path:?[/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat]
Config?path:?[/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat]
Data?path:?[/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/data]
Logs?path:?[/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/logs]
2016/12/13?22:55:56.013390?beat.go:177:?INFO?Setup?Beat:?redditbeat;?Version:?6.0.0-alpha1
2016/12/13?22:55:56.013402?processor.go:43:?DBG??Processors:?
2016/12/13?22:55:56.013413?beat.go:183:?DBG??Initializing?output?plugins
2016/12/13?22:55:56.013417?logp.go:219:?INFO?Metrics?logging?every?30s
2016/12/13?22:55:56.013518?output.go:167:?INFO?Loading?template?enabled.?Reading?template?file:
/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/redditbeat.template.json
2016/12/13?22:55:56.013888?output.go:178:?INFO?Loading?template?enabled?for?Elasticsearch?2.x.?Reading?template?file:
/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/redditbeat.template-es2x.json
2016/12/13?22:55:56.014229?client.go:120:?INFO?Elasticsearch?url:?
2016/12/13?22:55:56.014272?outputs.go:106:?INFO?Activated?elasticsearch?as?output?plugin.
2016/12/13?22:55:56.014279?publish.go:234:?DBG??Create?output?worker
2016/12/13?22:55:56.014312?publish.go:276:?DBG??No?output?is?defined?to?store?the?topology.
The?server?fields?might?not?be?filled.
2016/12/13?22:55:56.014326?publish.go:291:?INFO?Publisher?name:?LSNM33795267A
2016/12/13?22:55:56.014386?async.go:63:?INFO?Flush?Interval?set?to:?1s
2016/12/13?22:55:56.014391?async.go:64:?INFO?Max?Bulk?Size?set?to:?50
2016/12/13?22:55:56.014395?async.go:72:?DBG??create?bulk?processing?worker?(interval=1s,?bulk?size=50)
2016/12/13?22:55:56.014449?beat.go:207:?INFO?redditbeat?start?running.
2016/12/13?22:55:56.014459?redditbeat.go:38:?INFO?redditbeat?is?running!?Hit?CTRL-C?to?stop?it.
2016/12/13?22:55:57.370781?client.go:184:?DBG??Publish:?{
"@timestamp":?"2016-12-13T22:54:47.252Z",
"beat":?{
"hostname":?"LSNM33795267A",
"name":?"LSNM33795267A",
"version":?"6.0.0-alpha1"
},
"counter":?1,
"type":?"redditbeat"
}
第?2?段(可獲?0.73?積分)
R?e;?7個月前?
關(guān)于命令行參數(shù):-e記錄到標(biāo)準(zhǔn)err,而-d“*”啟用所有調(diào)試選擇器。有關(guān)參數(shù)的完整列表,請鍵入./redditbeat?--help。編碼Go代碼位于.go文件中(令人驚訝...)在$?GOPATH?/?src文件夾的項目子文件夾中。配置類型第一個有趣的文件是config?/?config.go,它定義了一個結(jié)構(gòu)來聲明Beat的可能參數(shù)。至于前面的Logstash插件,讓我們添加一個subreddit參數(shù),并設(shè)置它的默認(rèn)值:type?Config?struct?{
Period?time.Duration?`config:"period"`
Subreddit?string?`config:"subreddit"`
}
var?DefaultConfig?=?Config?{
Period:?15?*?time.Second,
Subreddit:?"elastic",
}
第?3?段(可獲?0.89?積分)
R?e;?7個月前?
Beater?TypeBeat本身的代碼在beater?/?redditbean.go中找到。默認(rèn)模板為Beat和三個函數(shù)創(chuàng)建一個struct:Beat構(gòu)造函數(shù)—用來讀取配置:?func?New(b?*beat.Beat,?cfg?*common.Config)?(beat.Beater,?error)?{?...?}?
Run?函數(shù)-?需要覆蓋Beat的主要功能:?func?(bt?*Redditbeat)?Run(b?*beat.Beat)?error?{?...?}?
Stop?函數(shù)管理優(yōu)雅關(guān)閉:?func?(bt?*Redditbeat)?Stop()?{?...?}?
Note?1:在Go中沒有明確的接口實(shí)現(xiàn)。實(shí)現(xiàn)了?interface?中的所有方法,即創(chuàng)建一個隱式繼承關(guān)系.?出于寫文檔的目的,這是?Beater?接口:type?Beater?interface?{
Run(b?*Beat)?error
Stop()
}
第?4?段(可獲?0.93?積分)
R?e;?7個月前?
因此,由于Beat結(jié)構(gòu)實(shí)現(xiàn)了Run和Stop,它是一個Beater。Note?2:?在Go中沒有類的概念,所以方法不能在一個具體類型上聲明。但是,它存在擴(kuò)展函數(shù)的概念:可以添加行為到一個類型(在單個包中)的函數(shù)。它需要聲明receiver?類型:這是在fun關(guān)鍵字和函數(shù)名之間完成的?-?這里是指Redditbeat類型(或者更準(zhǔn)確地說,是一個指向Redditbeat類型的指針,但是這里有一個隱式轉(zhuǎn)換)。構(gòu)造函數(shù)和Stop函數(shù)可以保持不變,無論什么特性都應(yīng)該在Run函數(shù)中。在這種情況下,功能是調(diào)用Reddit?REST?API并為每個Reddit帖子發(fā)送一條消息。
第?5?段(可獲?1.59?積分)
R?e;?7個月前?
最終代碼如下所示:func?(bt?*Redditbeat)?Run(b?*beat.Beat)?error?{
bt.client?=?b.Publisher.Connect()
ticker?:=?time.NewTicker(bt.config.Period)
reddit?:=?""?+?bt.config.Subreddit?+?"/.json"
client?:=?http.Client?{}
for?{
select?{
case?-bt.done:
return?nil
case?-ticker.C:
}
req,?reqErr?:=?http.NewRequest("GET",?reddit,?nil)
req.Header.Add("User-Agent",?"Some?existing?header?to?bypass?429?HTTP")
if?(reqErr?!=?nil)?{
panic(reqErr)
}
resp,?getErr?:=?client.Do(req)
if?(getErr?!=?nil)?{
panic(getErr)
}
body,?readErr?:=?ioutil.ReadAll(resp.Body)
defer?resp.Body.Close()
if?(readErr?!=?nil)?{
panic(readErr)
}
trimmedBody?:=?body[len(prefix):len(body)?-?len(suffix)]
messages?:=?strings.Split(string(trimmedBody),?separator)
for?i?:=?0;?i??len(messages);?i?++?{
event?:=?common.MapStr{
"@timestamp":?common.Time(time.Now()),
"type":???????b.Name,
"message":????"{"?+?messages[i]?+?"}",
}
bt.client.PublishEvent(event)
}
}
}
第?6?段(可獲?0.09?積分)
R?e;?7個月前?
這里是對最重要的幾部分的解釋:line?4:?通過連接字符串創(chuàng)建Reddit?REST?URL,包括配置Subreddit參數(shù)。記住,它的默認(rèn)值已在config.go文件中定義。line?5:?引用httpClient類型line?12:?創(chuàng)建新的HTTP請求。注意Go允許多個返回值。line?13:?如果沒有設(shè)置標(biāo)準(zhǔn)請求頭,Reddit的API將返回429狀態(tài)碼。line?14:?Go標(biāo)準(zhǔn)錯誤不通過異常處理,而是隨著常規(guī)返回值返回。根據(jù)Golang?wiki:指示調(diào)用者的錯誤條件,應(yīng)通過返回錯誤值來完成line?15:?panic()?函數(shù)類似于在Java中拋出異常,?被處理時推到棧頂。?有關(guān)詳細(xì)信息,請查看相關(guān)文檔。line?17:?執(zhí)行HTTP請求。line?21:?將響應(yīng)主體讀入字節(jié)數(shù)組。line?22:?關(guān)閉主體流。注意defer關(guān)鍵字:defer語句延遲函數(shù)的執(zhí)行,直到環(huán)繞的函數(shù)返回。line?26:?創(chuàng)建整個響應(yīng)主體字節(jié)數(shù)組的切片?-?對數(shù)組的一部分的引用。實(shí)質(zhì)上,它刪除了前綴和后綴以保持相關(guān)的JSON值。之后將字節(jié)數(shù)組解析成JSON。line?27:?分割切片以單獨(dú)獲取每個JSON片段。line?29:?將消息創(chuàng)建為簡單的字典結(jié)構(gòu)。line?34:?發(fā)送。
第?7?段(可獲?3.11?積分)
R?e;?7個月前?
配置,?構(gòu)建,?運(yùn)行默認(rèn)配置參數(shù)可以在項目根目錄下的redditbeat.yml文件中找到。請注意,redditbeat.full.yml中列出了其他常見的Beat參數(shù),以及相關(guān)注釋。關(guān)于Beats的一個有趣的事情是,他們的消息可以直接發(fā)送到Elasticsearch或Logstash進(jìn)行進(jìn)一步處理。這在上述配置文件中配置。redditbeat:
period:?10s
output.elasticsearch:
hosts:?["localhost:9200"]
output.logstash:
hosts:?["localhost:5044"]
enabled:?true
第?8?段(可獲?0.78?積分)
R?e;?7個月前?
此配置片段將每10秒循環(huán)運(yùn)行Run方法,并將消息發(fā)送到在localhost上運(yùn)行的Logstash實(shí)例在端口5044上。這可以在運(yùn)行Beat時被覆蓋(見下文)。注意:為了使Logstash接受來自Beats的消息,必須安裝Logstash?Beat插件,并且必須為Beats配置Logstash的input:input?{
beats?{
port?=?5044
}
}
要構(gòu)建項目,請在項目的根目錄中鍵入make。它將創(chuàng)建一個可以運(yùn)行的可執(zhí)行文件。./redditbeat?-e?-E?redditbeat.subreddit=java
-E參數(shù)可以覆蓋在的redditbeat.yml配置文件中找到的參數(shù)(見上文)。在這里,它設(shè)置subreddit讀為“java”,而不是默認(rèn)的“elastic”。
第?9?段(可獲?1.3?積分)
R?e;?7個月前?
輸出如下所示:2016/12/17?14:51:19.748329?client.go:184:?DBG??Publish:?{
"@timestamp":?"2016-12-17T14:51:19.748Z",
"beat":?{
"hostname":?"LSNM33795267A",
"name":?"LSNM33795267A",
"version":?"6.0.0-alpha1"
},
"message":?"{
\"kind\":?\"t3\",?\"data\":?{
\"contest_mode\":?false,?\"banned_by\":?null,?
\"domain\":?\"blogs.oracle.com\",?\"subreddit\":?\"java\",?\"selftext_html\":?null,?
\"selftext\":?\"\",?\"likes\":?null,?\"suggested_sort\":?null,?\"user_reports\":?[],?
\"secure_media\":?null,?\"saved\":?false,?\"id\":?\"5ipzgq\",?\"gilded\":?0,?
\"secure_media_embed\":?{},?\"clicked\":?false,?\"report_reasons\":?null,?
\"author\":?\"pushthestack\",?\"media\":?null,?\"name\":?\"t3_5ipzgq\",?\"score\":?11,?
\"approved_by\":?null,?\"over_18\":?false,?\"removal_reason\":?null,?\"hidden\":?false,?
\"thumbnail\":?\"\",?\"subreddit_id\":?\"t5_2qhd7\",?\"edited\":?false,?
\"link_flair_css_class\":?null,?\"author_flair_css_class\":?null,?\"downs\":?0,?
\"mod_reports\":?[],?\"archived\":?false,?\"media_embed\":?{},?\"is_self\":?false,?
\"hide_score\":?false,?\"spoiler\":?false,?
\"permalink\":?\"/r/java/comments/5ipzgq/jdk_9_will_no_longer_bundle_javadb/\",?
\"locked\":?false,?\"stickied\":?false,?\"created\":?1481943248.0,?
\"url\":?\"\",?
\"author_flair_text\":?null,?\"quarantine\":?false,?
\"title\":?\"JDK?9?will?no?longer?bundle?JavaDB\",?\"created_utc\":?1481914448.0,?
\"link_flair_text\":?null,?\"distinguished\":?null,?\"num_comments\":?4,?
\"visited\":?false,?\"num_reports\":?null,?\"ups\":?11
}
}",
"type":?"redditbeat"
}
定義一個切片,然后讓切片去引用一個已經(jīng)創(chuàng)建好的數(shù)組?;菊Z法如下:
索引1:切片引用的起始元素位
索引2:切片只引用該元素位之前的元素
例程如下:
在該方法中,我們未指定容量cap,這里的值為5是系統(tǒng)定義的。
在方法一中,可以用arr數(shù)組名來操控數(shù)組中的元素,也可以通過slice切片來操控數(shù)組中的元素。切片是直接引用數(shù)組,數(shù)組是事先存在的,程序員是可見的。
通過 make 來創(chuàng)建切片,基本語法如下:
make函數(shù)第三個參數(shù)cap即容量是可選的,如果一定要自己注明的話,要注意保證cap≥len。
用該方法可以 指定切片的大小(len)和容量(cap)
例程如下:
由于未賦值系統(tǒng)默認(rèn)將元素值置為0,即:
數(shù)值類型數(shù)組:????默認(rèn)值為 0
字符串?dāng)?shù)組:? ? ? ?默認(rèn)值為 ""
bool數(shù)組:? ? ? ? ? ?默認(rèn)值為 false
在方法二中,通過make方式創(chuàng)建的切片對應(yīng)的數(shù)組是由make底層維護(hù),對外不可見,即只能通過slice去訪問各個元素。
定義一個切片,直接就指定具體數(shù)組,使用原理類似于make的方式。
例程如下:
本文介紹一些Go語言的基礎(chǔ)語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進(jìn)一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標(biāo)準(zhǔn)庫,
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問中的fmt包。
log包實(shí)現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運(yùn)行時無法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。
算術(shù)運(yùn)算符:
關(guān)系運(yùn)算符:
邏輯運(yùn)算符:
位運(yùn)算符:
賦值運(yùn)算符:
指針相關(guān)運(yùn)算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強(qiáng)制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過標(biāo)記退出循環(huán):
--THE END--