go語言的rpc go語言的優(yōu)缺點(diǎn)

想知道現(xiàn)在golang語言怎樣,它能不能開發(fā)網(wǎng)站?

先給結(jié)論:完全可以

10余年的黎城網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整黎城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“黎城網(wǎng)站設(shè)計(jì)”,“黎城網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

商用實(shí)踐:

已經(jīng)通過很多大公司的商用實(shí)踐,例如B站,YY,包括字節(jié)跳動,國外更不用說了,Google,所以從這個角度上來說,已經(jīng)經(jīng)過大規(guī)模的實(shí)踐,所以如果你想用用于自己小網(wǎng)站的搭建是沒有任何問題,如果你想用于初創(chuàng)公司的使用,還是需要有自己的一定積累,至少有過實(shí)踐的經(jīng)驗(yàn)

golang周邊:

java在國內(nèi)的強(qiáng)大,得益于它的生態(tài),各種組件百花爭鳴,例如消息中間件rocketmq,分庫分表sharding-jdbc,spring整個生態(tài),mybatis,jedis,elasticsearch,zookeeper,dubbo等等都非常齊全,這樣可以方便大家能夠快速地進(jìn)行公司業(yè)務(wù)開發(fā),可以減少重復(fù)造輪子

golang這幾年也開始逐漸發(fā)力,各個組件也開始完善起來,例如etcd,消息中間件nsq,從跟上解決數(shù)據(jù)量巨大問題,pingcap公司開發(fā)了線事務(wù)處理/在線分析處理的融合型數(shù)據(jù)庫產(chǎn)品TIDB,

web框架gin,beego,iris等等,也有各路大神提供了連接各個其他redis,elasticsearch等等組件,還是比較齊全的,rpc框架也有g(shù)o-mirco,rpcx等等,只要你想要用,基本上來說,golang的生態(tài)周邊還是比較全的,方便大家使用

golang的模塊管理

java的方便還得益于它的包管理,maven,gradle,這樣大大方便了大家的使用,可以提供大家的開發(fā)效率,而golang從1.12開始也開始有了自己內(nèi)嵌的包管理工具

golang的新特性

在這邊我并不是說golang好于java,但是golang畢竟屬于新一代的語言,它的并發(fā)模型CSP,和java的并發(fā)模型是有很大的區(qū)別的,并發(fā)模型的易用性,從根本上來說,是好于java的

再說golang目前最大的優(yōu)勢,docker和kubernetes,是目前github上最火的前20名項(xiàng)目,并且都是golang寫的,所以golang和docker,kubernetes集成有天然的優(yōu)勢

綜上所述,我覺得golang可以開發(fā)商用網(wǎng)站,不管你是做大型網(wǎng)站還是小型demo,都可以滿足你的要求

golang 多人開發(fā)怎么保證源碼安全

隨著PHP有著越來越深入的了解,以及遇到越來越多的不同業(yè)務(wù)時,使用PHP總會讓我有一種莫名的無力感。當(dāng)然,并不是我一個人在使用PHP的時候遇到了問題。事實(shí)上,每個略微有一些經(jīng)驗(yàn),接觸過一些需求的人都會有同樣的困惑。各種配合LAMP(或者LNMP?)架構(gòu)的后端技術(shù)也因此被發(fā)明或被發(fā)現(xiàn),進(jìn)而整合到PHP的開發(fā)的技術(shù)體系中。從簡單的Memcached作為數(shù)據(jù)中轉(zhuǎn),cron后端定時處理;到Gearman、RabbitMQ這些隊(duì)列神器;最近Laruence甚至封裝了利用libcurl的異步特性實(shí)現(xiàn)并發(fā)RPC調(diào)用的yar擴(kuò)展。幾乎整個社區(qū)都在尋找PHP的摩西之路。好吧,說了一大堆,回歸主題。之前我寫了一篇英文練筆《WhyyouPHPguysshouldlearnGolang》,獲得不少國際友人的關(guān)注。排除拼寫和語法被他們詬病外,主要是有許多朋友覺得我沒把事情說清楚。所以這里我用母語重新聊聊這個事情,只是這些國際友人什么時候能學(xué)會閱讀中文呢?;)Go或者Golang,是由Google支持的快速、一致、穩(wěn)定的,有活躍的社區(qū)支持的開源編程語言。越來越多的應(yīng)用選擇使用Golang進(jìn)行構(gòu)建。雖然RobPike說“…我們希望C++程序員來了解Go并作為一個可選的語言…”,不過我真得認(rèn)為:PHPer應(yīng)當(dāng)學(xué)習(xí)Golang!接下來我們就來談?wù)勗?。容易學(xué)習(xí)PHP相當(dāng)容易學(xué)習(xí)。Golang也是!在這點(diǎn)上,一群大老外對我的觀點(diǎn)進(jìn)行了猛烈的抨擊。他們認(rèn)為我羞辱了PHPer,說得好像只有簡單的東西PHPer才能學(xué)會一樣。但是,這難道不是事實(shí)嗎?或者換個說法:像我一樣的喜歡PHP的人,或多或少都會更喜歡簡單的東西。PHP的語法接近C族編程語言(C/C++/Java等等)。如果有這些語言的經(jīng)驗(yàn),在第一次遇到PHP的時候立刻就能開始上手編寫代碼。在我看來,編寫PHP代碼或許更加考驗(yàn)程序員的記憶力,而不是智力(當(dāng)你面對各種不同風(fēng)格的函數(shù)定義、各種擴(kuò)展的特殊約定時,你一定會相當(dāng)認(rèn)同我的觀點(diǎn))。Golang同樣是一個C族編程語言。呃,或者有一些不同吧。例如關(guān)鍵字“for”,功能上和PHP的接近,但是沒有括號。條件語句“if”同樣無需括號??梢蚤喿xEffectiveGo了解內(nèi)容。Golang只有3025個關(guān)鍵字和47個操作符號、分隔符號或其他特殊標(biāo)記。記住這些標(biāo)記確實(shí)不需要什么特別的努力。精巧的類型系統(tǒng)相當(dāng)容易使用。實(shí)用的,具有方法的結(jié)構(gòu)體類型代替了笨重的對象系統(tǒng)。接口的設(shè)計(jì)是Golang中我最喜歡的部分。當(dāng)完成了《Go指南》的學(xué)習(xí)之后,利用PHP積累的經(jīng)驗(yàn),立刻就可以開始使用Golang處理一些簡單的任務(wù)。容易使用PHP腳本是由SAPI組件進(jìn)行解析執(zhí)行的,如Web服務(wù)器模塊、PHP-FPM或者CLI。部署PHP所需要的全部東西就是一個SAPI環(huán)境。配置這個環(huán)境對于新手來說可能是學(xué)習(xí)PHP過程中最為困難的部分。所有的Golang代碼會編譯和鏈接為本地碼。所以除了編譯環(huán)境,執(zhí)行時無需再為其進(jìn)行任何特別的部署。對比PHP環(huán)境的配置,這要簡單很多。你真得認(rèn)為配置PHP環(huán)境很復(fù)雜嗎?我不覺得,真的!而配置Golang編譯環(huán)境比那還要簡單點(diǎn)。我確信已經(jīng)有大量的Golang相關(guān)的書籍、文章介紹過如何進(jìn)行編譯環(huán)境的配置了。為了更加清晰,我這里梳理一下思路。有三個步驟需要處理:下載Golang的源代碼;根據(jù)《[翻譯]Go環(huán)境設(shè)置》的提示設(shè)置環(huán)境變量;運(yùn)行源代碼src目錄中的all.bash?;蛘咭徊降轿唬菏褂枚M(jìn)制包進(jìn)行安裝。然后就會得到一個叫做“go”的工具集合。使用“go”工具和使用PHP的CLI工具一樣簡單?!禰翻譯]go工具》對此進(jìn)行了詳細(xì)的解釋。PHP的迷思如果一個編程語言容易學(xué)習(xí)和使用,我們是不是就應(yīng)當(dāng)學(xué)習(xí)它呢?有許多容易學(xué)習(xí)和使用的編程語言。難道要把它們都學(xué)一遍?答案是顯然的:NO!但是呢?只是因?yàn)樗芸幔∈堑?,我在開玩笑,但是這是真的。無論如何先從PHP自身談起吧。PHP“原本是為了開發(fā)動態(tài)的Web頁面而設(shè)計(jì)的服務(wù)器端通用語言(Wikipedia)”。PHP一個重要的特性就是可以嵌入到HMTL中。代碼編寫在“”標(biāo)簽內(nèi);HTML寫在標(biāo)簽外。它有一個強(qiáng)大的擴(kuò)展系統(tǒng)。擴(kuò)展使用C調(diào)用ZendAPI編寫。數(shù)據(jù)的處理實(shí)際上要利用這些擴(kuò)展完成。在我看來,PHP是世界上最好的模板語言。但是當(dāng)積累了一些PHP的經(jīng)驗(yàn),并且開始面對一些更加復(fù)雜的Web應(yīng)用時,你一定會對PHP產(chǎn)生一種無力的感覺。它沒有內(nèi)建的并行機(jī)制,沒有線程、進(jìn)程(你真得認(rèn)為那個簡陋的進(jìn)程控制可以不加改造的用在高并發(fā)的生產(chǎn)環(huán)境?),或者其他某“程”。一個慢數(shù)據(jù)源可以阻塞整個頁面的處理。消息隊(duì)列、緩存、代理……系統(tǒng)開始不僅僅是PHP這么單純,還包括了許多服務(wù)和系統(tǒng)組件。這時,PHP只處理很少的業(yè)務(wù)邏輯,成為真正的模板語言了。PHPer們總是在尋找解決這一問題的法,如“PHPmultithread”或者PHPRPC并發(fā)框架。我很難說哪種會更好一些。不過我肯定你會需要選擇一些編程語言用于后端工作的開發(fā)。就我自己的經(jīng)驗(yàn),我嘗試過C(一直在和malloc/free進(jìn)行搏斗)/Java(陷入到了jar地獄中)/Python(從來沒能做到Pythonic不說,還總是在錯誤的類型中打轉(zhuǎn))……如果想要獲得性能,就得同內(nèi)存管理進(jìn)行搏斗;如果用GC,就得部署和調(diào)優(yōu)VM;當(dāng)獲得便利性的時候,同時也是走在刀尖上,一個小錯誤就引起巨大的災(zāi)難……每個都有優(yōu)勢,同樣每個都有問題。好吧!現(xiàn)在回到Golang!Golang有GC,無需關(guān)心內(nèi)存管理(或者可以用較少的精力去關(guān)注它)。代碼被編譯為本地碼,因此“cp”和“mv”就是部署Golang編寫的應(yīng)用所需要的全部工具。噢,我剛才已經(jīng)說過了,Golang是一個具有靜態(tài)類型系統(tǒng)的編譯語言。所以你沒有機(jī)會弄亂變量的類型。當(dāng)然,PHPer應(yīng)該學(xué)習(xí)Golang的一個重要原因是“轉(zhuǎn)到Go是因?yàn)樗麄儾⑽捶艞壧嗟谋磉_(dá)能力,但是獲得了性能,并且與并發(fā)共舞(RobPike)”。《WhyNotGo?(英文)》對此進(jìn)行了深入的分析。我可以分享一些我的經(jīng)驗(yàn):有一個Gearman的worker用于處理后端數(shù)據(jù)。PHP通過其API連接到Gearman的JobServer向worker發(fā)起請求。最初worker是使用python編寫的(還有更加原始的版本,PHP的,但是你能想像它工作起來……唉,不說了……)。這個版本有許多的問題(是我們自己的問題,不關(guān)Python的事),但是至少它能工作。后來用Golang重寫了這個worker。為此我開發(fā)了Golang的GearmanAPI,并使用ZendAPI編寫了一個在Golang中執(zhí)行PHP腳本的包。然后將它們放在一起:一個可以執(zhí)行PHP的Gearmanworker。它已經(jīng)工作了一段時間了,看起來還不錯!哦,受到Y(jié)ar的啟發(fā),這里還有一個Golang編寫的RPC合并器,用來合并PHP腳本中的RPC調(diào)用。現(xiàn)在還是個玩具,不過或許日后能用得著。這其實(shí)是將Golang的channel當(dāng)作消息隊(duì)列來用。我在《Golang:有趣的channel應(yīng)用》中對此有一些說明。世界真美好啊。謝謝Golang!無論如何,大多數(shù)PHPer在進(jìn)行后端開發(fā)的時候都會需要學(xué)習(xí)一些其他語言。如果你正在尋找,或者已經(jīng)嘗試了一些其他語言。為什么不來試試Golang?它真得可以讓你的生活更加輕松和快樂。讓你可以有的時間陪伴你的家人和朋友,吃你愛吃的東西,去你想去的地方。貌似我還是沒說清楚???好吧,沒關(guān)系,在下個月的中國軟件開發(fā)者大會上再跟大家就這個話題做一個探討吧。

如何看待go語言泛型的最新設(shè)計(jì)?

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現(xiàn)實(shí)。Go 團(tuán)隊(duì)實(shí)施了一個看起來比較穩(wěn)定的設(shè)計(jì)草案,并且正以源到源翻譯器原型的形式獲得關(guān)注。本文講述的是泛型的最新設(shè)計(jì),以及如何自己嘗試泛型。

例子

FIFO Stack

假設(shè)你要創(chuàng)建一個先進(jìn)先出堆棧。沒有泛型,你可能會這樣實(shí)現(xiàn):

type?Stack?[]interface{}func?(s?Stack)?Peek()?interface{}?{

return?s[len(s)-1]

}

func?(s?*Stack)?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack)?Push(value?interface{})?{

*s?=?

append(*s,?value)

}

但是,這里存在一個問題:每當(dāng)你 Peek 項(xiàng)時,都必須使用類型斷言將其從 interface{} 轉(zhuǎn)換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發(fā)錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發(fā)現(xiàn)到自己的錯誤,直到它影響到你的整個服務(wù)為止。

通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因?yàn)榭梢栽诰幾g時而不是運(yùn)行時發(fā)現(xiàn)問題。

泛型通過允許類型具有類型參數(shù)來解決此問題:

type?Stack(type?T)?[]Tfunc?(s?Stack(T))?Peek()?T?{

return?s[len(s)-1]

}

func?(s?*Stack(T))?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack(T))?Push(value?T)?{

*s?=?

append(*s,?value)

}

這會向 Stack 添加一個類型參數(shù),從而完全不需要 interface{}。現(xiàn)在,當(dāng)你使用 Peek() 時,返回的值已經(jīng)是原始類型,并且沒有機(jī)會返回錯誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)

此外,泛型代碼通常更易于編譯器優(yōu)化,從而獲得更好的性能(以二進(jìn)制大小為代價)。如果我們對上面的非泛型代碼和泛型代碼進(jìn)行基準(zhǔn)測試,我們可以看到區(qū)別:

type?MyObject?struct?{

X?

int

}

var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek().(MyObject)

}

}

func?BenchmarkGo2(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack(MyObject)

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek()

}

}

結(jié)果:

BenchmarkGo1BenchmarkGo1-16?????12837528?????????87.0?ns/op???????48?B/op????????2?allocs/opBenchmarkGo2BenchmarkGo2-16?????28406479?????????41.9?ns/op???????24?B/op????????2?allocs/op

在這種情況下,我們分配更少的內(nèi)存,同時泛型的速度是非泛型的兩倍。

合約(Contracts)

上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實(shí)現(xiàn) String() 函數(shù)

gRPC服務(wù)開發(fā)和接口測試初探「Go」

之前寫過了Grpc服務(wù)開發(fā)和接口測試初探【Java】,中間耽擱了一些時間,Go版本的gRPC測試開發(fā)實(shí)踐才有時間學(xué)習(xí)使用。其中也是由于自己Go語言不夠熟悉導(dǎo)致的。之前有段時間想暫時放棄Go語言的學(xué)習(xí),導(dǎo)致了Go的生疏,原因是從Groovy到Java性能。

回歸正題,Go語言版本的gRPC實(shí)踐相對Java來說是比較簡單的,但是總體的工具鏈?zhǔn)潜容^復(fù)雜的,可能是因?yàn)镚o生態(tài)目前相比Java還是比較匱乏吧。下面我先簡述一下大致的步驟:

以上步驟親自操作可能會遇到一些小問題,我本人搜到的教程什么的也是亂七八糟,踩了一些坑。我沒有整理出一個親自實(shí)踐之后的可行的教程,原因有二:

Go語言的gRPC的 proto 編寫跟Java大致一致,只有一個報名的參數(shù)不太一樣。下面是我的 Hello.proto 內(nèi)容:

這里主要 go_package 網(wǎng)上搜到的配置方式有些不一樣,我沒有全都嘗試,大家在搜索的資料時候,盡量先看看 syntax 這個參數(shù)的值,以及文章教程寫作的時間,如果距離現(xiàn)在太久了,我建議直接關(guān)掉。搜索引擎有過濾功能,可以過濾掉過時的教程。

這里Go語言gRPC的一點(diǎn)優(yōu)勢,就是在一個項(xiàng)目中即可實(shí)現(xiàn),Java需要先弄一個SDK這樣。Go語言的gRPC的代碼可以通過生成代碼命令中的參數(shù)實(shí)現(xiàn)指定路徑。我是放在了和 proto 文件的同級目錄。

服務(wù)端代碼也是比較格式化的內(nèi)容,如下:

其中 pb.RegisterHelloServiceServer(s, Ser{}) 如果報錯,請檢查自己安裝的工具 protoc-gen-go 或者 protoc-gen-gofast 版本,一般提取報錯 message 搜索也能得到解決辦法。

下面是客戶端的代碼,由于學(xué)藝不精,其中大部分參數(shù)的含義目前我也不是很清楚,特別是基于 stream 的請求響應(yīng)的方式使用。后面我先把Java的學(xué)完,再回過頭來看Go的,按照這個順序?qū)W習(xí)和分享。

服務(wù)端輸出:

忘記打日志了。沒有輸出

客戶端輸出:

Go語言的gRPC測試開發(fā)實(shí)踐已經(jīng)完事兒,大概率上我不會在工作中使用Go作為主力gRPC測試語言,后面測試實(shí)踐內(nèi)容還是會以Java為主。

新聞名稱:go語言的rpc go語言的優(yōu)缺點(diǎn)
鏈接地址:http://muchs.cn/article26/ddiidcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、移動網(wǎng)站建設(shè)服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)