欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言netty go語言net接收不定長數(shù)據(jù)

尋求一款好用的端口映射工具,求大神推薦一款,謝謝

輕量級(jí)的內(nèi)網(wǎng)映射工具,holer服務(wù)端采用Java語言實(shí)現(xiàn),服務(wù)端界面漂亮簡潔。

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、灌陽ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的灌陽網(wǎng)站制作公司

Holer客戶端采用了Java語言和GO語言實(shí)現(xiàn)了兩種版本,支持幾乎所有的OS平臺(tái)。

用到流行的微服務(wù)框架springboot和Java網(wǎng)絡(luò)框架netty。

配置很簡單,針對(duì)所有TCP協(xié)議只需在客戶端設(shè)置一個(gè)holer access key即可。

采用MySQL數(shù)據(jù)庫統(tǒng)一管理數(shù)據(jù)。

go有沒有開源的類似java的mina或者netty的socket框架

go語言應(yīng)該沒有,java netty這種高性能異步IO模型的框架,建議你還是用java語言開發(fā)吧

netty是什么?

netty是一個(gè)封裝了nio的java語言實(shí)踐的io框架,使編程人員從繁瑣且容器出bug的nio編程中解放出來,更專注于業(yè)務(wù)創(chuàng)新能力,而且很多其他的上層框架也會(huì)使用netty作為io模塊的實(shí)現(xiàn),例如dubbo,spring-gateway之類.沒事可以去黑馬程序員官網(wǎng)視頻庫看免費(fèi)視頻。

netty系列之:netty對(duì)http2消息的封裝

無論是什么協(xié)議,如果要真正被使用的話,需要將該協(xié)議轉(zhuǎn)換成為對(duì)應(yīng)的語言才好真正的進(jìn)行應(yīng)用,本文將從http2消息的結(jié)構(gòu)出發(fā),探討一下netty對(duì)http2消息的封裝,帶大家領(lǐng)略一下真正的框架應(yīng)該做到什么程度。

http2和http1.1不同的是它使用了新的二進(jìn)制分幀,通過客戶端和服務(wù)器端建立數(shù)據(jù)流steam來進(jìn)行客戶端和服務(wù)器端之間消息的交互。其中數(shù)據(jù)流是一個(gè)雙向字節(jié)流,用來發(fā)送一條或者多條消息。

消息是客戶端和服務(wù)端發(fā)送的一個(gè)邏輯上完整的數(shù)據(jù)。根據(jù)數(shù)據(jù)大小的不同,可以將消息劃分為不同的幀F(xiàn)rame。也就是說message是由不同的frame組成的。

frame就是http2中進(jìn)行通信的最小單位,根據(jù)上一節(jié)的介紹,我們知道frame有這樣幾種:

我們看一下http2中stream和frame的一個(gè)大體的結(jié)構(gòu):

在http2中,一個(gè)TCP連接,可以承載多個(gè)數(shù)據(jù)流stream,多個(gè)stream中的不同frame可以交錯(cuò)發(fā)送。

每個(gè)frame通過stream id來標(biāo)記其所屬的stream。

有了上面的http2的基本概念,我們接下來就看下netty對(duì)http2的封裝了。

作為一個(gè)TCP連接下面的最大的單位stream,netty中提供了接口Http2Stream。注意,Http2Stream是一個(gè)接口,它有兩個(gè)實(shí)現(xiàn)類,分別是DefaultStream和ConnectionStream。

Http2Stream中有兩個(gè)非常重要的屬性,分別是id和state。

id前面已經(jīng)介紹了,是stream的唯一標(biāo)記。這里要注意由客戶端建立的 Stream ID 必須是奇數(shù),而由服務(wù)端建立的 Stream ID 必須是偶數(shù)。另外Stream ID 為 0 的流有特殊的作用,它是CONNECTION_STREAM_ID,1 表示HTTP_UPGRADE_STREAM_ID。

state表示stream的狀態(tài),具體而言,stream有下面幾個(gè)狀態(tài):

為什么狀態(tài)需要區(qū)分local和remote呢?這是因?yàn)閟tream連接的兩端,所以有兩端的狀態(tài)。

和stream狀態(tài)相對(duì)應(yīng)的就是http2的生命周期了。netty提供了Http2LifecycleManager來表示對(duì)http2生命周期的管理:

分別是關(guān)閉stream,重置stream,拒絕新建stream:goAway,和處理出錯(cuò)狀態(tài)這幾種。

stream之后,就是真實(shí)承載http2消息的Http2Frame了。在netty中,Http2Frame是一個(gè)接口,它有很多具體的實(shí)現(xiàn)。

Http2Frame的直接子類包括HTTP2GoAwayFrame、HTTPPingFrame、Http2SettingsFrame和HTTP2SettingsAckFrame。

其中g(shù)oAway表示不接受新的stream,ping用來進(jìn)行心跳檢測(cè)。SETTINGS用來修改連接或者 Stream 流的配置。

netty中專門有一個(gè)Http2Settings類和其對(duì)應(yīng)。

在這個(gè)類中定義了一些特別的setting名字:

除了上面講的4個(gè)frame之外,其他的frame實(shí)現(xiàn)都繼承自Http2StreamFrame,具體而言有PriorityFrame,ResetFrame,HeadersFrame,DataFrame,WindowUpdateFrame,PushPromiseFrame和UnknownFrame。

各個(gè)frame分別代表了不同的功能。這里最重要的就是Http2HeadersFrame和Http2DataFrame。

Http2HeadersFrame主要是客戶端發(fā)送給服務(wù)器端的http2請(qǐng)求。

具體而言除了標(biāo)準(zhǔn)的http1.1的header之外,http2還支持下面的header:

對(duì)于Http2DataFrame來說,他本身是一個(gè)ByteBufHolder,用來傳遞具體的數(shù)據(jù)信息。data frame的Payload直接存儲(chǔ)在ByteBuf中。

以上就是netty對(duì)http2消息的封裝了。

本文的例子可以參考: learn-netty4

微服務(wù)架構(gòu)之服務(wù)注冊(cè)與發(fā)現(xiàn)(一)

一、服務(wù)注冊(cè)中心的由來

假如沒有服務(wù)注冊(cè)中心,我們會(huì)干些什么事情呢?

在傳統(tǒng)行業(yè)的項(xiàng)目架構(gòu)中以下的方案最為常見了:

這種架構(gòu)開發(fā)、部署都是最簡單的,一般適用于中小企業(yè)訪問量并不是太多的情況下,各個(gè)系統(tǒng)服務(wù)一臺(tái)機(jī)器就搞定了。系統(tǒng)之間的調(diào)用也是拿到對(duì)方的IP+PORT直接連接。

接下來可能因?yàn)閼?yīng)用B開始訪問量大了,單臺(tái)機(jī)器已經(jīng)不能滿足我們的需求,于是一些反向代理工具應(yīng)運(yùn)而出,其中比較常見的有Apache、Nigix,架構(gòu)演變?yōu)椋?/p>

相比之前的應(yīng)用B的單臺(tái)機(jī)器訪問,這種nginx代理的方式減輕了服務(wù)器的壓力,但是可能會(huì)出現(xiàn)Nginx掛了,那么整個(gè)服務(wù)也不可用,于是又來了這么一套架構(gòu):

這樣看方案算是完美了吧。然后事情并不是想象的那么一帆風(fēng)順,這還只是應(yīng)用A調(diào)用一個(gè)應(yīng)用B,如果應(yīng)用A調(diào)用的可能是應(yīng)用B、C、D、E...,這種完全就不知道他后面到底還想干嘛,這種架構(gòu)看似可以,但是絕對(duì)會(huì)累死運(yùn)維的(nginx的配置將會(huì)非常混亂,直接導(dǎo)致運(yùn)維不干了)。

服務(wù)注冊(cè)中心干些什么事情呢?

上面提到的那種靠人力(主要是運(yùn)維干的事情)比較繁瑣,還不好維護(hù),有這么幾點(diǎn)不方便:應(yīng)用服務(wù)的地址變了、雙十一搞活動(dòng)服務(wù)器新增等等。那么我們可以有這么的一種架構(gòu):

服務(wù)注冊(cè)中心主要是維護(hù)各個(gè)應(yīng)用服務(wù)的ip+port列表,并保持與各應(yīng)用服務(wù)的通訊,在一定時(shí)間間隔內(nèi)進(jìn)行心跳檢測(cè),如果心跳不能到達(dá)則對(duì)服務(wù)IP列表進(jìn)行剔除,并同時(shí)通知給其它應(yīng)用服務(wù)進(jìn)行更新。同樣要是有新增的服務(wù)進(jìn)來,應(yīng)用服務(wù)會(huì)向注冊(cè)中心進(jìn)行注冊(cè),服務(wù)注冊(cè)中心將通知給其它應(yīng)用進(jìn)行更新。每個(gè)應(yīng)用都有需要調(diào)用對(duì)應(yīng)應(yīng)用服務(wù)的地址列表,這樣在進(jìn)行調(diào)用時(shí)只要處理客戶負(fù)載雜均衡即可。

二、微服務(wù)注冊(cè)中心

1.Zookeeper

ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。

上面的話直接摘抄百度百科的內(nèi)容,國內(nèi)很多公司做分布式開發(fā)最初的選型大部分都是采用dubbo框架。dubbo框架注冊(cè)中心主要使用zookeeper。zookeeper服務(wù)端與客戶端的底層通訊為netty。zookeeper采用CAP理論中的CP,一般集群部署最少需要3臺(tái)機(jī)器。

2.Euraka

先來看一下euraka的架構(gòu)圖:

Register:服務(wù)注冊(cè)

當(dāng)Eureka客戶端向Eureka Server注冊(cè)時(shí),它提供自身的元數(shù)據(jù),比如IP地址、端口,運(yùn)行狀況指示符URL,主頁等。

Renew:服務(wù)續(xù)約

Eureka客戶會(huì)每隔30秒發(fā)送一次心跳來續(xù)約。 通過續(xù)約來告知Eureka Server該Eureka客戶仍然存在,沒有出現(xiàn)問題。 正常情況下,如果Eureka Server在90秒沒有收到Eureka客戶的續(xù)約,它會(huì)將實(shí)例從其注冊(cè)表中刪除。 建議不要更改續(xù)約間隔。

Fetch Registries:獲取注冊(cè)列表信息

Eureka客戶端從服務(wù)器獲取注冊(cè)表信息,并將其緩存在本地。客戶端會(huì)使用該信息查找其他服務(wù),從而進(jìn)行遠(yuǎn)程調(diào)用。該注冊(cè)列表信息定期(每30秒鐘)更新一次。每次返回注冊(cè)列表信息可能與Eureka客戶端的緩存信息不同, Eureka客戶端自動(dòng)處理。如果由于某種原因?qū)е伦?cè)列表信息不能及時(shí)匹配,Eureka客戶端則會(huì)重新獲取整個(gè)注冊(cè)表信息。 Eureka服務(wù)器緩存注冊(cè)列表信息,整個(gè)注冊(cè)表以及每個(gè)應(yīng)用程序的信息進(jìn)行了壓縮,壓縮內(nèi)容和沒有壓縮的內(nèi)容完全相同。Eureka客戶端和Eureka 服務(wù)器可以使用JSON / XML格式進(jìn)行通訊。在默認(rèn)的情況下Eureka客戶端使用壓縮JSON格式來獲取注冊(cè)列表的信息。

Cancel:服務(wù)下線

Eureka客戶端在程序關(guān)閉時(shí)向Eureka服務(wù)器發(fā)送取消請(qǐng)求。 發(fā)送請(qǐng)求后,該客戶端實(shí)例信息將從服務(wù)器的實(shí)例注冊(cè)表中刪除。該下線請(qǐng)求不會(huì)自動(dòng)完成,它需要調(diào)用以下內(nèi)容:

DiscoveryManager.getInstance().shutdownComponent();

Eviction 服務(wù)剔除

在默認(rèn)的情況下,當(dāng)Eureka客戶端連續(xù)90秒沒有向Eureka服務(wù)器發(fā)送服務(wù)續(xù)約,即心跳,Eureka服務(wù)器會(huì)將該服務(wù)實(shí)例從服務(wù)注冊(cè)列表刪除,即服務(wù)剔除。

自我保護(hù)機(jī)制:

既然Eureka Server會(huì)定時(shí)剔除超時(shí)沒有續(xù)約的服務(wù),那就有可能出現(xiàn)一種場(chǎng)景,網(wǎng)絡(luò)一段時(shí)間內(nèi)發(fā)生了 異常,所有的服務(wù)都沒能夠進(jìn)行續(xù)約,Eureka Server就把所有的服務(wù)都剔除了,這樣顯然不太合理。所以,就有了 自我保護(hù)機(jī)制,當(dāng)短時(shí)間內(nèi),統(tǒng)計(jì)續(xù)約失敗的比例,如果達(dá)到一定閾值,則會(huì)觸發(fā)自我保護(hù)的機(jī)制,在該機(jī)制下, Eureka Server不會(huì)剔除任何的微服務(wù),等到正常后,再退出自我保護(hù)機(jī)制。自我保護(hù)開關(guān)(eureka.server.enableself-preservation: false)

3.Consul

consul推薦的架構(gòu)圖:

Consul不像Euraka的部署那么簡單,他是go語言開發(fā)的,需要運(yùn)維單獨(dú)部署,有提供java的客戶端連接,采用的是CAP的CP。

4.Nacos

Euraka是Spring Cloud Netflix早期版本中推薦使用的,后來euraka1.0版本不再維護(hù),euraka2.0已經(jīng)閉源,導(dǎo)致很多新項(xiàng)目基于Spring Cloud Netflix 開發(fā)的選型變遷為Consul.

Nacos是阿里開源的服務(wù)注冊(cè)中心,它可以與spring cloud aliaba集成使用。

Nacos的官方介紹:

Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡單易用的特性集,幫助您實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置管理、服務(wù)及流量管理。

Nacos 幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái)。 Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)(例如微服務(wù)范式、云原生范式)的服務(wù)基礎(chǔ)設(shè)施。

Nacos 地圖

Nacos 生態(tài)圖

如 Nacos 全景圖所示,Nacos 無縫支持一些主流的開源生態(tài),例如

Spring Cloud

Apache Dubbo and Dubbo Mesh TODO

Kubernetes and CNCF TODO

三、服務(wù)注冊(cè)與發(fā)現(xiàn)技術(shù)選型

以下是來自網(wǎng)上的一個(gè)分享:

除了上述的幾種以外,筆者更推薦使用Nacos作為服務(wù)注冊(cè)中心。

推薦理由:

Nacos服務(wù)注冊(cè)表結(jié)構(gòu)Mapnamespace, Mapgroup::serviceName, Service采用多層次Map結(jié)構(gòu),控制的顆粒度更細(xì),支持金絲雀模式發(fā)布,心跳同步機(jī)制也更快速,服務(wù)更新更及時(shí)。

當(dāng)前題目:go語言netty go語言net接收不定長數(shù)據(jù)
分享鏈接:http://chinadenli.net/article30/hppcso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化網(wǎng)站排名網(wǎng)站維護(hù)響應(yīng)式網(wǎng)站建站公司網(wǎng)站改版

廣告

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

綿陽服務(wù)器托管