通過(guò)beego快速創(chuàng)建一個(gè)Restful風(fēng)格API項(xiàng)目及API文檔自動(dòng)化:
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括灌云網(wǎng)站建設(shè)、灌云網(wǎng)站制作、灌云網(wǎng)頁(yè)制作以及灌云網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,灌云網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到灌云省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Go 語(yǔ)言構(gòu)建 RESTful Web 服務(wù):
Golang中使用 JWT認(rèn)證來(lái) 保障Restful JSON API的安全(英文):
polaris: 一個(gè)用go實(shí)現(xiàn)的支持restful的web框架:
關(guān)于RESTFUL API 安全認(rèn)證方式的一些總結(jié):
有沒(méi)有人用golang實(shí)現(xiàn)過(guò)restful框架的實(shí)例:
Micro 一個(gè)用Go語(yǔ)言實(shí)現(xiàn)的微服務(wù)框架:
基于微服務(wù)庫(kù)的可插拔RPC go-micro:
golang適合做web開(kāi)發(fā)嗎?:
a-survey-of-5-go-web-frameworks:
Ozzo Framework:
avelino/awesome-go:
Beego Framework:
golang其實(shí)不適合做web開(kāi)發(fā):
Go語(yǔ)言現(xiàn)有Web開(kāi)發(fā)框架:
使用Golang快速構(gòu)建WEB應(yīng)用:
Martini 極好的 Go WEB 框架:
golang 有哪些比較穩(wěn)定的 web 開(kāi)發(fā)框架?:
是的,Go語(yǔ)言需要使用service接口來(lái)實(shí)現(xiàn)服務(wù)器端的功能,例如處理HTTP請(qǐng)求、接收和發(fā)送數(shù)據(jù)等等。是的,Go語(yǔ)言需要使用service接口來(lái)實(shí)現(xiàn)服務(wù)器端的功能,例如處理HTTP請(qǐng)求、接收和發(fā)送數(shù)據(jù)等等。
如何優(yōu)雅地打一個(gè)有效借條
借條可以署名 “優(yōu)雅的借條”
如何優(yōu)雅地打張更具法律效力的借條
《借條》的正規(guī)寫(xiě)法,沒(méi)有什么優(yōu)雅或高端的之說(shuō)。一般認(rèn)為,借條的書(shū)寫(xiě)應(yīng)當(dāng)規(guī)范、嚴(yán)謹(jǐn),關(guān)鍵的要素比如貸款人、借款人、借款金額、還款期限、有無(wú)利息、借款日期等,必須齊全、真實(shí)、準(zhǔn)確、無(wú)涂改、雙方當(dāng)事人無(wú)異議。對(duì)借款人、貸款人的名字要與其身份證上的姓名相符,要避免使用張叔叔、李伯伯、王老弟、趙大哥等昵稱或代號(hào),防止以后發(fā)生誤會(huì)或爭(zhēng)議。
如何優(yōu)雅地關(guān)閉一個(gè)socket
先判斷winsocket的狀態(tài)
如果是 關(guān)閉 則忽略
如果是打開(kāi),則使用關(guān)閉動(dòng)作去關(guān)閉它即可
1. 關(guān)閉Socket時(shí)究竟做了什么
關(guān)閉socket分為主動(dòng)關(guān)閉(Active closure)和被動(dòng)關(guān)閉(Passive closure)兩種情況。前者是指有本地主機(jī)主動(dòng)發(fā)起的關(guān)閉;而后者則是指本地主機(jī)檢測(cè)到遠(yuǎn)程主機(jī)發(fā)起關(guān)閉之后,作出回應(yīng),從而關(guān)閉整個(gè)連接。
其狀態(tài)圖如下圖所示:
起初每個(gè)socket都是CLOSED狀態(tài),當(dāng)客戶端初使化一個(gè)連接,他發(fā)送一個(gè)SYN包到服務(wù)器,客戶端進(jìn)入SYN_SENT狀態(tài)。
服務(wù)器接收到SYN包,反饋一個(gè)SYN-ACK包,客戶端接收后返饋一個(gè)ACK包客戶端變成ESTABLISHED狀態(tài),如果長(zhǎng)時(shí)間沒(méi)收到SYN-ACK包,客戶端超時(shí)進(jìn)入CLOSED狀態(tài)。
當(dāng)服務(wù)器綁定并監(jiān)聽(tīng)某一端口時(shí),socket的狀態(tài)是LISTEN,當(dāng)客戶企圖建立連接時(shí),服務(wù)器收到一個(gè)SYN包,并反饋SYN-ACK包。服務(wù)器狀態(tài)變成SYN_RCVD,當(dāng)客戶端發(fā)送一個(gè)ACK包時(shí),服務(wù)器socket變成ESTABLISHED狀態(tài)。
當(dāng)一個(gè)程序在ESTABLISHED狀態(tài)時(shí)有兩種圖徑關(guān)閉它, 第一是主動(dòng)關(guān)閉,第二是被動(dòng)關(guān)閉。如果你要主動(dòng)關(guān)閉的話,發(fā)送一個(gè)FIN包。當(dāng)你的程序closesocket或者shutdown(標(biāo)記),你的程序發(fā)送一個(gè)FIN包到peer,你的socket變成FIN_WAIT_1狀態(tài)。peer反饋一個(gè)ACK包,你的socket進(jìn)入FIN_WAIT_2狀態(tài)。如果peer也在關(guān)閉連接,那么它將發(fā)送一個(gè)FIN包到你的電腦,你反饋一個(gè)ACK包,并轉(zhuǎn)成TIME_WAIT狀態(tài)。
TIME_WAIT狀態(tài)又號(hào)2MSL等待狀態(tài)。MSL意思是最大段生命周期(Maximum Segment Lifetime)表明一個(gè)包存在于網(wǎng)絡(luò)上到被丟棄之間的時(shí)間。每個(gè)IP包有一個(gè)TTL(time_to_live),當(dāng)它減到0時(shí)則包被丟棄。每個(gè)路由器使TTL減一并且傳送該包。當(dāng)一個(gè)程序進(jìn)入TIME_WAIT狀態(tài)時(shí),他有2個(gè)MSL的時(shí)間,這個(gè)充許TCP重發(fā)最后的ACK,萬(wàn)一最后的ACK丟失了,使得FIN被重新傳輸。在2MSL等待狀態(tài)完成后,socket進(jìn)入CLOSED狀態(tài)。
被動(dòng)關(guān)閉:當(dāng)程序收到一個(gè)FIN包從peer,并反饋一個(gè)ACK包,于是程序的socket轉(zhuǎn)入CLOSE_WAIT狀態(tài)。因?yàn)閜eer已經(jīng)關(guān)閉了,所以不能發(fā)任何消息了。但程序還可以。要關(guān)閉連接,程序自已發(fā)送給自已FIN,使程序的TCP socket狀態(tài)變成LAST_ACK狀態(tài),當(dāng)程序從peer收到ACK包時(shí),程序進(jìn)入CLOSED狀態(tài)。
2. Winsock2 API中的相關(guān)函數(shù)
先當(dāng)然是查MSDN,看到winsocks2 API中的相關(guān)函數(shù)有:closesocket,shutdown,WSASendDisconnect. 我大致說(shuō)一下,具體詳細(xì)的資料還請(qǐng)自行查MSDN.
int closesocket( SOCKET s)的作用是關(guān)閉指定的socket,并且回收其所有的資源。
int shutdown( SOCKET s, int how)則是禁止在指定的socket s上禁止進(jìn)行由how指定的操作,但并不對(duì)資源進(jìn)行回收,shutdown之后而closesocket之前s還不能再次connect或者WSAConnect.
int WSASendDisconnect( SOCKET s, LPWSABUF lpOutboundDisconnectData)則和shutdown基本類似,稍有不同的就是WSASendDisconnect函數(shù)多了一個(gè)lpOutboundDisconnectData參數(shù),可以允許發(fā)送“斷開(kāi)數(shù)據(jù)”(disconnect data).但MSDN上寫(xiě)了“The native implementation of TCP/IP on Windows does not support disconnect data.”,所以一般我們就用shutdown函數(shù)就行了。
3. Socket的優(yōu)雅關(guān)閉
在MSDN中對(duì)shutdown函數(shù)中的Remarks部分有下面一段話,指出了如何進(jìn)行一次優(yōu)雅的slcket關(guān)閉:
To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. For example, to initiate a graceful disconnect:
Call WSAAsyncSelect to register for FD_CLOSE notification.
Call shutdown with how=SD_SEND.
When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
Call closesocket.
closesocket的行為也是隨setsockopt()中參數(shù)的不同而有不同的表現(xiàn),這里影響它的行為的主要就是那個(gè)linger結(jié)構(gòu)。
SO_DONTLINGER 若為真,則SO_LINGER選項(xiàng)被禁止。
SO_LINGER 延遲關(guān)閉連接 struct linger
上面這兩個(gè)選項(xiàng)影響close行為
選項(xiàng) 間隔 關(guān)閉方式 等待關(guān)閉與否
SO_DONTLINGER 不關(guān)心 優(yōu)雅 否
SO_LINGER 零 強(qiáng)制 否
SO_LINGER 非零 優(yōu)雅 是
若設(shè)置了SO_LINGER(亦即linger結(jié)構(gòu)中的l_onoff域設(shè)為非零),并設(shè)置了零超時(shí)間隔,則closesocket()不被阻塞立即執(zhí)行,不論是否有排隊(duì)數(shù)據(jù)未發(fā)送或未被確認(rèn)。這種關(guān)閉方式稱為“強(qiáng)制”或“失效”關(guān)閉,因?yàn)樘捉涌诘奶撾娐妨⒓幢粡?fù)位,且丟失了未發(fā)送的數(shù)據(jù)。在遠(yuǎn)端的recv()調(diào)用將以WSAECONNRESET出錯(cuò)。
若設(shè)置了SO_LINGER并確定了非零的超時(shí)間隔,則closesocket()調(diào)用阻塞進(jìn)程,直到所剩數(shù)據(jù)發(fā)送完畢或超時(shí)。這種關(guān)閉稱為“優(yōu)雅的”關(guān)閉。請(qǐng)注意如果套接口置為非阻塞且SO_LINGER設(shè)為非零超時(shí),則closesocket()調(diào)用將以WSAEWOULDBLOCK錯(cuò)誤返回。
若在一個(gè)流類套接口上設(shè)置了SO_DONTLINGER(也就是說(shuō)將linger結(jié)構(gòu)的l_onoff域設(shè)為零),則closesocket()調(diào)用立即返回。但是,如果可能,排隊(duì)的數(shù)據(jù)將在套接口關(guān)閉前發(fā)送。請(qǐng)注意,在這種情況下WINDOWS套接口實(shí)現(xiàn)將在一段不確定的時(shí)間內(nèi)保留套接口以及其他資源,這對(duì)于想用所以套接口的應(yīng)用程序來(lái)說(shuō)有一定影響。
所以一般來(lái)說(shuō),不應(yīng)該把linger設(shè)置為SO_LINGER 并且設(shè)置timeout為0,這樣的話,當(dāng)本地主機(jī)調(diào)用closesocket時(shí)將會(huì)造成一個(gè)“強(qiáng)制”或“失效”的非優(yōu)雅關(guān)閉??梢愿鶕?jù)實(shí)際情況設(shè)置為另外兩種情況。
如何優(yōu)雅地關(guān)閉一個(gè)Socket
輕輕地 *** 去不要太用力 慢慢的取出來(lái)不要太心急(絕對(duì)不污)
污者不留名,留名不污者
如何優(yōu)雅地寫(xiě)一個(gè) Mesos Framework
go語(yǔ)言Go語(yǔ)言是谷歌2009年發(fā)布的第二款開(kāi)源編程語(yǔ)言。Go語(yǔ)言專門針對(duì)多處理器系統(tǒng)應(yīng)用程序的編程進(jìn)行了優(yōu)化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持并行進(jìn)程。北京時(shí)間2010年1月10日,Go語(yǔ)言摘得了TIOBE公布的2009年年度大獎(jiǎng)。
Marathon:
這個(gè)是mesosphere公司開(kāi)源的基于Mesos的通用框架,主要是用來(lái)執(zhí)行長(zhǎng)期任務(wù),比如web服務(wù)、db服務(wù)等。見(jiàn)到一個(gè)比方,覺(jué)得很貼切“marathon好比集群的init.d,需要確保其上的服務(wù)始終運(yùn)行著”。當(dāng)然marathon也執(zhí)行運(yùn)行其他框架比如hadoop。
他的主要優(yōu)勢(shì)在于: 提供了完整的REST API 以及多語(yǔ)言的CLI實(shí)現(xiàn)如python、java、ruby等。同時(shí)也提供了webUI。并且貌似國(guó)內(nèi)有企業(yè)已經(jīng)在用該框架了。我當(dāng)前所在的公司就是選擇的基于Marathon做的自己的SaaS服務(wù)。
Marathon有幾個(gè)比較主要的概念:
約束條件:Marathon支持通過(guò)“約束條件”來(lái)限制AP
如何優(yōu)雅地有效用完一本筆記本
有錢的話。。買一個(gè)3w的準(zhǔn)系統(tǒng)。。。然后用兩年。。然后低價(jià)賣出去。。就是這樣的。。。這樣的話最好。。。
如何優(yōu)雅地使用 Vim
裝逼不可取,還不如多看點(diǎn)書(shū),推薦kindle去看書(shū)提升自我。
kindle特別適合看小說(shuō) 看英文版本的書(shū)籍,體驗(yàn)超級(jí)給力 ,對(duì)眼睛的傷害可以說(shuō)很低,看久了也不疲勞, 待機(jī)也不錯(cuò) 手感也很棒,個(gè)人推薦KPW3,日版才600多,問(wèn)日版國(guó)內(nèi)能不能用,回答是肯定的。亞馬遜資源也是很豐富的,但是kindle對(duì)PDF的書(shū)籍支持的很不好。
kindle原系統(tǒng)支持azw、pdf、mobi、prc、txt格式。其中mobi、azw和prc格式支持最為優(yōu)秀。 PDF如果是掃描版的,因?yàn)椴皇菫?寸量身定做的,所以,顯示會(huì)不太清晰,或者由于本身掃描效果就不太好,所以會(huì)不太清晰。如果是字太小,原系統(tǒng)可以考慮局部放大,多看系統(tǒng)下可以用智能切邊功能。 txt格式支持不是太好,有可能會(huì)出現(xiàn)亂碼或者翻頁(yè)有問(wèn)題。把txt格式編碼另存為UTF-8的編碼的效果會(huì)好點(diǎn)(在電腦中打開(kāi)一個(gè)txt文件,點(diǎn)擊文件→另存為→編碼選擇UTF-8→保存),但是建議最好是轉(zhuǎn)換成mobi。
如何優(yōu)雅地使用 Windows
軟件正版,桌面干凈,花錢提配置,掌握基本的電腦使用及設(shè)置(擺脫衛(wèi)士和管家)技巧即可。
介紹Vault的基本用法,包括安裝和數(shù)據(jù)存取
vault是使用go語(yǔ)言開(kāi)發(fā)的開(kāi)源工具,必須先安裝golang
這個(gè)例子中,我們使用zookeeper作為后段存儲(chǔ)。
因?yàn)樾枰С侄鄠€(gè)vault實(shí)例,不能使用本地文件系統(tǒng)存儲(chǔ);另外使用zookeeper作為存儲(chǔ),必須配置api_addr參數(shù)。
初始化只需要整個(gè)vault集群執(zhí)行一次就行;如果有多個(gè)vault實(shí)例,只要任何一個(gè),只需要執(zhí)行一次即可。
會(huì)生成5個(gè)unseal key和一個(gè)root token;其中unseal key下面就會(huì)用到,必須存好不可丟失,而root token則是一個(gè)超級(jí)用戶token,必須妥善保管,一般用它來(lái)做系統(tǒng)配置,然后簽出用戶token。
Rest API:
前面我們生成了5個(gè)unseal key,這是vault的缺省配置,一共生成5個(gè)unseal key,每次解封必須使用其中的三個(gè)。(這5和3可以在初始化的時(shí)候配置)
解封操作需要在每一個(gè)實(shí)例的每次啟動(dòng)時(shí)執(zhí)行。
Rest API
三次解封,在查看結(jié)果:
Rest API
查看secrets激活狀態(tài)
在能夠進(jìn)行secret的讀寫(xiě)操作之前,必須先激活secrets引擎。
激活操作也初始化一樣,整個(gè)集群只需要第一次啟動(dòng)的時(shí)候執(zhí)行一次就行。
這里用到了TOKEN,是在vault初始化的時(shí)候生成的。
Rest API
Rest API
這個(gè)地方需要注意的是,雖然每個(gè)path(secert/mypath)下面有多個(gè)key/value對(duì),但他們都是值,實(shí)際上只有path才是唯一的key,這就是說(shuō)不能對(duì)一個(gè)path下面的單獨(dú)key進(jìn)行修改,vault只能覆蓋整個(gè)path的內(nèi)容,例如:
Rest API
上面這兩條命令,后面一條可能是想修改mykey1的值,保留mykey2的值,但實(shí)際情況會(huì)覆蓋前面一條的所有值,即mykey2會(huì)丟掉。