標籤: 如何寫文案

  • 質量硬,性價比無敵,懂車的都說這3款車比BBA更值得買

    質量硬,性價比無敵,懂車的都說這3款車比BBA更值得買

    點評:放在以前,皇冠就是身份的象徵,也算是款足以媲美百萬級別車輛的車子,隨着諸多豪華品牌的入駐以及價格的降低,市場份額確實也受到了一定的衝擊。但秉承豪華穩重路線的18款皇冠在外觀和內飾上進行了年輕化,這一性格上的變化致使皇冠既穩住了老用戶也吸引了不少年輕的消費者。

    在中國,汽車市場有個很奇妙的現象:有時候沒有競爭優勢的車型,卻成為銷量榜單上前幾名的常客;而有些產品競爭力很強的車型,卻好似不怎麼如意。但今天要為大家揭曉的是那些銷量看似不怎樣,在細分市場卻有不錯表現的特殊車型。

    在進行分析點評之前,我們首先來看看本次分析的那些車子在今年前3個月的銷量指數。

    點評:金牛座是福特品牌旗下的一款高端轎車車型,雖非屬豪華品牌但售價快30萬的它,素質可謂非常的高,大氣又低調的外觀配以變態級別的配置,以絕對性的優勢足以和豪華品牌扳手腕。但面對豪華品牌和同級車大眾的帕薩特和邁騰在20幾萬區間所帶來的巨大壓力,在今年1-3月的總銷量中金牛座還是頂住了壓力,賣出了4778輛。就性價比而言,金牛座還是很高的,就是售價有點偏高,如若售價能稍微降低一些,並配以一些購車優惠,相信在接下來的日子里,金牛的銷售表現會更令人滿意。

    點評:放在以前,皇冠就是身份的象徵,也算是款足以媲美百萬級別車輛的車子,隨着諸多豪華品牌的入駐以及價格的降低,市場份額確實也受到了一定的衝擊。但秉承豪華穩重路線的18款皇冠在外觀和內飾上進行了年輕化,這一性格上的變化致使皇冠既穩住了老用戶也吸引了不少年輕的消費者。況且,皇冠本身就擁有不錯的綜合性價比和情懷感,並不會比BBA車型差,如果30萬讓消費者選擇購車,相信不少消費者都會選擇這些開起來更有格調又有品味的車子。

    點評:非豪華品牌的輝昂和奧迪A7、A8等車型屬同平台打造,帶點奧迪影子,並帶有眾多賣點的輝昂在實力上絲毫也不比豪華品牌同級別車型遜色,在國內市場大眾也有不少專屬中國的車子,藉助大眾的品牌影響,輝昂這款車的知名度也有相應的提升。另外從市場行情來說,雖說中大型車的市場仍舊是豪華品牌車的天下,但是大街上千篇一律的豪華品牌車也給了輝昂一定的機遇,憑藉過硬的實力在這个中大型車的市場中還是分得一杯羹。

    總結

    金牛座、皇冠、輝昂三款車都很好,性價比也很不錯,在整個細分市場上表現還算是差強人意!其實吧,覺得金牛座這些怎麼也是比3系和C級車要高上一個等級,轉而有不少的消費者放棄BBA車型,選擇這些二線豪華品牌也不足為奇。畢竟與其選擇開着分分鐘與人撞車的BBA上街,不如選擇這些二線豪華品牌車,開起來更有格調和氣質。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計最專業,超強功能平台可客製化

  • 曾經的銷量強者,三十而立能否再度發力?

    曾經的銷量強者,三十而立能否再度發力?

    整個內飾最吸睛的地方是方向盤,兩輻式設計的方向盤尺寸不算小,但是會感覺有點奇怪,喇叭蓋板是從下往上包,而不是一般的從上往下,而且整個設計形狀有點彆扭,需要一點時間去適應,具介紹稱整個形狀調轉一百八十度就是跟中控面板的形狀一致的,好像是這樣,但是打滿一百八十度的感覺會更怪,這算是個彩蛋。

    說起海馬這個品牌,是需要花一點時間去回憶起來,然後感覺到有點惋惜,近幾年自主品牌突飛猛進,很多都發展到令人佩服的地步,眾多車型充斥着各大主流市場,而海馬則沒能成為其中之一,對於第一代的福美來記憶猶新,年銷量可達10萬輛,而現在已經不堪回首。

    海馬從1988建立至今已經30年了,福美來再推新車型,那麼在而立之年,這款新車有着怎樣的表現呢?它對比自身有什麼突破,對比對手競爭力又在哪裡呢?前往海南三亞,一探究竟。

    外觀:這大概是最好看的福美來了

    這裏需要提一下福美來家族的其他車型,雖然臉和顏值這個是比較主觀的東西,但客觀地講,福美來家族的外觀設計比起同級競品,是存在一定差距的,譬如福美來MpV和福美來F7,兩款車其實是兄弟車型,只是兩款車型採用了不同的設計。

    福美來MpV的設計是比較年輕、張揚一點,外觀最奪目的就是前臉的進氣格柵和大燈的設計,大量的豎立鍍鉻飾條,對於顏值高低保留意見,而F7採用了橫向的鍍鉻飾條,看起來更居家一點,而大燈的造型是一樣的,相比福美來MpV,我更容易接受福美來F7。

    福美來F5定位緊湊型家轎,車身尺寸和福美來大體一致,可以看做是兄弟車型,長寬高分別是4698*1805*1477(mm),軸距2685mm,只是寬度差了1mm。

    尺寸相同,但是前臉比起福美來,就如福美來F7之於福美來MpV,採用差異化的設計風格,更居家的設計讓更容易接受一些,最大的變化在於前進氣格柵,相比起福美來那粗大的橫飾條,F5採用了滿天星前臉格柵,據介紹星星的形狀是用上下翻轉重合的兩個海馬車標合成的這麼一個設計理念,一眼看上去的話是比較有辨識度。

    大燈的形狀其實是跟福美來一致的,試駕的是高配車型,全系採用鹵素光源,有加透鏡。

    LED日行燈手動擋和自動擋的頂配才有配備,布置在最外側,霧燈靠裡邊。

    對比起福美來也是有一點區別的,福美來沒有LED日行燈,兩側進氣口的裝飾都不一樣,比起它比較犀利的兩個尖角裝飾,F5的這個設計明顯更大氣,有橫向拉伸感。

    個人覺得側面是F5最大的看點,上腰線斷開若隱若現,下腰線一直延伸至尾部,非常有動感,特別是寶藍色的車色,特別騷,配合三亞藍天、藍海、藍車,完美。

    換一個角度看着車身側面的腰線,簡直賞心悅目。

    高配車型配備無鑰匙進入和無鑰匙啟動,這個價位的車型來說,應該是值得肯定的表現。

    電動調節后視鏡為全系標配,不過後視鏡加熱/自動摺疊這些就沒有了。

    前後都採用盤剎制動,標配205 /55 R16的輪胎,輪胎是韓泰的,輪轂形狀也是比較運動年輕的設計。

    車尾也有可圈可點之處,其實可以看到尾部是想奔馳C級的那樣翹起一個小尾巴,營造出不錯的動感。

    個人覺得尾燈的設計比前大燈更具協調感,雙邊共雙出的排氣是裝飾的,視覺效果還想;試駕車型是頂配車型,配備后駐車雷達和倒車影像,除了最低配以外,其餘車型均為標配項,比較良心。

    內飾設計有點“皮”&配置基本夠用

    內飾和福美來相比完全是兩個設計風格,但是有幾個地方讓人覺得設計師有點“調皮”,整體的設計風格比較居家簡約,把空調按鍵布置在空調下方,是跟奔馳相似的做法,中控用料基本都是硬塑料,相信這個價位是無功無過吧。

    整個內飾最吸睛的地方是方向盤,兩輻式設計的方向盤尺寸不算小,但是會感覺有點奇怪,喇叭蓋板是從下往上包,而不是一般的從上往下,而且整個設計形狀有點彆扭,需要一點時間去適應,具介紹稱整個形狀調轉一百八十度就是跟中控面板的形狀一致的,好像是這樣,但是打滿一百八十度的感覺會更怪,這算是個彩蛋?設計師很皮。

    方向盤用的是液壓助力,尺寸比較大,但是形狀不粗,反而比較細,握感不飽滿,8點、4點鐘方向其實是設計有手指凹紋的,方便這樣操作

    只有一側有功能按鍵,右側是空的,這樣給人感覺欠妥,或許日後會有功能加上?

    另外是一鍵啟動的位置,把它布置在空調按鍵下方,說不上市奇特,但是不常見,另外更不常見的是居然有配備無線充電,不過是頂配車型才有。

    儀錶盤是中規中矩,雙圓設計比較常見,然後加入了石英錶設計元素。

    配備8英寸中控屏,Carplay/CarLife手機互聯、藍牙連接,都是除最低配以外其餘車型配備,高配車型還有車載導航。

    ESp和电子手剎也是除最低配以外其餘車型配備,另外,這裏的後備廂開啟鍵目前找到的唯一一個打開方式,似乎找不到其他方式打開後備廂,這多少會有點不便,比如買完東西準備放後備廂,只能先打開車門然後再打開後備廂最後把東西拿到後備廂放進去。

    空間方面,體驗者身高為1.75米,在調整好駕駛坐姿后,在後排有接近2拳腿部空間,頭部空間一拳由於,表現還是不錯的。

    有點不足的是作為一輛前驅車,中央地板的凸起高度比較高,而且只有兩個頭枕,這樣的話後排坐3個人中間那個就會有點難受。

    後備廂官方容積為415L,不算大,但縱深比較深,有點不足是第二排座椅不能放到,中間也不能把扶手拉下來從後備廂拿東西,這個有待改進,另外再提一下,後備廂真的應該加上一個打開按鈕或者拉扣。

    好開舒服,底盤基本功到位是最大的優勢

    F5搭載和福美來一樣的1.6L發動機,最大馬力125匹,在6000轉才能爆發十成功力,匹配5擋手動和6擋手自一體變速箱,發動機採用全鋁發動機,最大扭矩151N·m,峰值扭矩從四千轉后開始輸出,作為一款自吸發動機來說,賬面數據也就這樣了。

    在習慣了渦輪浪潮下,開着這裏僅有125匹馬力的轎車真的感覺到不少差距,在市區或者說中低速路段行駛其實還算夠用,超個車提提速什麼的都沒什麼大問題,但是上了高速的話真的顯得有點佛系了,即使地板油猛催它提速依然是比較慢的,讓一度以為是不是忘記鬆手剎?不對呀,电子的。

    還需要挑刺的是深踩油門發動機提速起來噪音抑制的一般般,轟鳴聲也會傳到車內,不過在6AT變速箱兢兢業業的工作下,時刻都會抓住油門的動作,只要有較大的動力需求就會立馬提速,總的來說平順性已經響應性都是不用擔心的,只不過提速真的急不來,畢竟一輛家轎,滿足平順的駕駛體驗以及夠用的動力就已經很高分了。

    接下來都是F5值得肯定的點,首先是油門和剎車,這是首先感覺到的有點,兩者調教的很線性,而且很均勻,不會像日系或者其他車型前半段或者前三分之一要麼一下子用力過猛要麼就基本沒反應,特別是剎車,做得很線性,加上前後盤剎,踩得越深是越有勁,感覺怎麼樣都能剎得住,這給日常駕駛帶來了足夠信心。

    而且這個油門配上自吸天生的特性,真的是想要多少踩多少,不像渦輪發動機那樣猛的沖一下讓人覺得措手不及,就這兩個方面就能給比較好的影像。

    前懸架是麥弗遜獨立懸架,后懸架是雙E型多連桿獨立懸挂,后懸都是獨立的再這個級別當中可以說是相當厚道了,很多十來萬的都是板車呢,所以F5開起來路過一些顛簸路面,它可以處理得游刃有餘,完全沒有廉價感,濾震是做的很到位,是一款稱職的家用車。

    另外底盤的紮實感以及對轉彎、變道的側傾做的是比較不錯的,整個底盤很整、很穩,跑了半天高速深有體會,時速接近120km/h,整個車身一點都不飄,甚至有點大眾那樣的感覺,而且在一些中高速的變道或者是超車,就完全不像一款幾萬塊的車的表現,應該像十來萬或者以上,側傾小,車身姿態平穩,底盤基本功沒丟,有祖傳的功力。

    總的來說,F5最大的優勢在於底盤的質感以及整個偏向紮實的調教,但是不足依然很多,小缺點依然是存在一部分的,另外最大的爭議點或許是外形設計和內飾,這個跟同級競品相比確實有待提高,海馬或許是不想隨波逐流,保留自己的特色,但是覺得,有很多東西是可以借鑒一下的,即便順應大部分消費者的審美口味也可以做出自己的特色,最重要的好事賣得好。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※別再煩惱如何寫文案,掌握八大原則!

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 復聯3上映的深夜,一群男人卻鑽進地庫嗨翻了天

    復聯3上映的深夜,一群男人卻鑽進地庫嗨翻了天

    對於性能向改裝玩家來說,不管平時駕駛時到底會不會時刻關注如此豐富的數據,像這樣的三聯表是必須裝上的。十代思域顯然也是如今性能向改裝的主力車型,1。5T渦輪增壓發動機有着相當不錯的改裝潛力。“網紅車”五菱宏光現身。

    相信大部分車迷都會對改裝車感興趣,甚至自己本身就是一位改裝車玩家,而對於廣大改裝車愛好者來說,靜態車聚就是一種讓大家能夠零距離接觸各類改裝案例,同時大量車友交流改裝心得的活動之一。很多改裝團體會選擇地下停車場這種封閉性公共場所作為大型改裝車聚的舉辦地,而在廣州,卻從未有過此類車聚。日前,趁着熱度極高的漫威電影《復讎者聯盟3》的國內上映,一個名為Aibo par的“地庫車聚”在廣州某商場舉行,自己作為一個車迷,筆者當然不會錯過這場被稱為“廣州首次”的地庫車聚。

    與珠三角地區常見的賽道日活動相比,地庫車聚更多的還是驚喜改裝車的靜態展示,因此在這裏集結的改裝車大多以外觀、內飾改裝為核心,每一台改裝車都显示出鮮明的個性。

    低姿態

    “姿態”,這是外觀向改裝一個非常常用的詞語,是一台車改裝水平的重要評定標準,而所謂姿態,涉及到離地間隙、車輪傾角、輪轂選擇等多個方面,但在國內的改裝愛好者群體中,“低趴”就是最受歡迎的改裝風格之一。

    就在會場簽到處,主辦方就擺出了兩台霸氣的VIp風格改裝作品,巨大的傾角、嵌入翼子板的大尺寸輪轂,讓這台奔馳S級和豐田皇冠看起來霸氣十足。

    豐田皇冠是國內的VIp風格主流改裝用車,其中以第12代皇冠最為常見。

    除了多基於中大型甚至大型轎車的VIp風格之外,在這裏還要提到一個改裝風格的專用名詞:“Hella Flush”。這種非常流行的外觀改裝風格要求輪轂邊緣與輪眉平齊,大部分玩家會選擇換裝氣動避震來實現最大幅度降低車身的效果,而在行駛時又可將離地間隙提升,保證一定的實用性。

    克萊斯勒300C是國內難得的純種美式轎車,粗獷的線條搭配巨大的鍍鉻輪轂,盡顯美式風範。

    什麼?國內竟有豐田bB?淡定,這是被改造成豐田bB外觀的長城酷熊。

    外觀向改裝玩家可不只是會對外觀進行改造,他們還會用一些小物件來裝飾愛車的內部,模型車、玩偶、汽車主題貼紙等各式各樣的裝飾物看得筆者眼花繚亂。

    這位車主直接將自己的酷熊打造成了移動的日式工藝品專賣店。

    由於靜態車聚中常會有車友打開前蓋展示精心改造的發動機艙,為了讓愛車美得更全面,發動機蓋的背面也是不能放過的。

    對於趴地玩家來說,前後包圍被蹭壞甚至掉落是一項必修課程,包圍還沒掉下來?用黃黑膠布貼上“假裝”掉了也可以。

    “鑽桿”是低趴改裝玩家在車聚中最喜愛的活動,車友們設法降低車身離地高度,開車鑽過一根限定高度的杆子,以評比出車身最低的車型。

    既然是漫威電影的首映車聚,怎能少得了鋼鐵俠的身影?

    猜猜這台有着哆啦A夢塗裝的是什麼車?記得在下方留言框把你猜到的答案告訴我們哦!

    性能派

    當然,雖說靜態車聚是外觀向改裝的主場主場,但這不代表性能派就不能出現了。

    豐田86顯然是最受歡迎的日系跑車之一,也是各類賽道日活動的常見車型;只可惜這款超級實惠的后驅小跑車如今已經退出中國內地市場了。

    素有“平民超跑”之稱的飛度GK5,是改裝界最火爆的車型之一,能夠駕馭從低趴到性能的多種改裝風格。

    比亞迪F0被降低車身,換上競技輪轂之後,突然有了一種性能小鋼炮的感覺。

    這台狀態上佳的第八代STI是全場性能車的焦點之一。

    對於性能向改裝玩家來說,不管平時駕駛時到底會不會時刻關注如此豐富的數據,像這樣的三聯表是必須裝上的。

    十代思域顯然也是如今性能向改裝的主力車型,1.5T渦輪增壓發動機有着相當不錯的改裝潛力。

    “網紅車”五菱宏光現身!

    這個巨大的碳纖維進氣風箱是必須秀出來的。

    市售兩千多元的電動渦輪增壓器,它的增壓值能有0.1個Bar么?

    本田高性能圖騰思域Type R一現身,大批車友上前圍觀拍照,這人氣,恐怕是法拉利的旗艦跑車都無法比擬。

    經典派

    現場還能見到許多經典車的身影,比如近年流行起來的桑塔納,以及老皇冠、虎頭奔、Spura等車型都看得筆者口水直流。

    近年老款桑塔納在國內再次流行起來,這次車聚就出現了不少桑塔納的身影。

    曾幾何時,斯巴魯在中國和貴州雲雀合作,以合資生產的方式推出了雲雀小公主,也就是斯巴魯Vivio;而圖中這台可不是國內最常見的雲雀小公主,而是一台正兒八經的斯巴魯Vivio!

    W140“虎頭奔”登場,哪怕這隻是一台S320,但是氣場也是足夠強大的。

    斯巴魯Vivio的Bistro版本,而這台則是非常少見的雙門車型。

    喲!豐田Supra出租車!請問起步價多少?

    寶馬推出的第二款Z系列跑車:Z3。

    這台皇冠155的車主看來頗有美國情懷啊,但是這樣的國旗搭配,不應該用在經典的紅旗或者林肯、凱迪拉克身上嗎?

    豐田在90年代推出的緊湊型轎車Altezza,在國內以雷克薩斯第一代IS的身份銷售,但國內車主更願意用它的日本名字:Altezza,或者親切地叫它“咬地鯊”。

    大跑車

    在這一次地庫車聚中,吸引眼球的可不止是那些低姿態、性能車和經典車,現場更有大批跑車現身,對於車迷來說,這些又帥又快的高性能跑車就是心中的Dream Cars。

    國內罕見的阿爾法羅密歐4C!也許很快大家就能在玩車TV的推送里見到它哦!

    保時捷911 GT3 RS,只可惜國內已買不到手動變速箱版本。

    法拉利,作為世界超級跑車標杆的地位也阻止不了車主給它換上氣動避震,玩起了姿態。

    氣動避震的儲氣罐就隱藏在車頭的狹小行李箱中。

    結語

    這場看似簡單的地庫車聚,當晚共吸引了數百台改裝車前來參与,用盡了活動區域的每一個車位;地庫的悶熱和難以消散的廢氣都無法阻擋改裝車愛好者的熱情。拋開電影上映這個活動主題不說,實際上絕大部分前來參与車聚的人都是被改裝車本身所吸引,能夠讓過千人在一個擁擠的地下停車場玩得如此盡興,也許就只有改裝車聚這一種活動能夠做到了。

    本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

    FB行銷專家,教你從零開始的技巧

  • 8萬就夠,近期最多人關注的3款6座車都這麼給力,買誰好?

    8萬就夠,近期最多人關注的3款6座車都這麼給力,買誰好?

    而寶駿360第三排的空間表現不錯,美中不足的是其坐墊對於大腿的承托稍顯不足。比亞迪宋MAX 6座版表現要比7座版本更為靈活和更為寬鬆,不管前排、中排還是後排都能夠找到舒適輕鬆的坐姿。扒一扒內飾寶駿360:中控檯布局與寶駿510相似,整體內飾層次感較為豐富,配合懸浮式中控屏以及液晶儀錶盤,整個內飾顯得科技感十足。

    什麼車廠最了解國內消費者的需要?答案必定是本土車廠。想必大家也知道2018車輛年檢時間有新規定,非營運轎車享有6年內免上線檢測政策,可尷尬的是現在許多MpV車型是7座的布局,因此許多MpV被迫要一年一檢。對此本土車廠紛紛為消費者排憂解難,相繼推出了6座MpV車型,讓新車可以滿足新規從而6年內免上線檢測。接下來我們看看最近新上市的3款6座MpV吧。

    寶駿作為一個善於打造爆款車型的品牌,不僅能打造出高性價比的車型,更重要的是它清晰當今消費者需求,上周剛推出了旗下第二款MpV車型——寶駿360,該車瞄準的就是6座MpV這一細分市場。

    全新的歐尚A600是長安繼歐尚A800后又一力作,從命名來看,其定位是在A800之下。從外觀跟內飾看,歐尚A600可作為歐尚的升級改款。相比於原本的歐尚,多了一種動力組成,也多了自動擋車型的選擇,這樣的變化讓歐尚A600更加的親民。

    作為爆款車型的比亞迪宋MAX也推出了六座車型,可見比亞迪對於六座MpV這一細分市場的重視程度。新車在尺寸上保持與7座車型一致,減少了一個座位,換來的是更寬敞的中排空間以及能更方便進出第三排的中央通道。

    比一比尺寸

    通過三車尺寸數據的對比可以看出比亞迪宋MAX佔據一定的優勢,尤其是在軸距以及寬度方面。由此可以推斷出比亞迪宋MAX的車內空間表現應為三車之最。寶駿360在尺寸上比歐尚A600稍微大一些,可是軸距上的差距是明顯的,其軸距已貼近宋MAX,換句話說寶駿360在車廂內的空間不比宋MAX差太多。

    經過實測也驗證了前文的觀點,可以看到,三台車前排空間是足夠寬敞。受限於軸距,長安歐尚A600在第二排以及第三排在腿部空間上稍顯局促,應付日常短途出行問題不大。而寶駿360第三排的空間表現不錯,美中不足的是其坐墊對於大腿的承托稍顯不足。比亞迪宋MAX 6座版表現要比7座版本更為靈活和更為寬鬆,不管前排、中排還是後排都能夠找到舒適輕鬆的坐姿。

    扒一扒內飾

    寶駿360:中控檯布局與寶駿510相似,整體內飾層次感較為豐富,配合懸浮式中控屏以及液晶儀錶盤,整個內飾顯得科技感十足。

    長安歐尚A600:內飾與歐尚相似,連貫式儀錶和中控台是一討喜的設計,細節部分歐尚A600與歐尚有着細微的差別,比如空調出風口飾板的微調以及空調控制區域按鈕的布局,這些微調使歐尚A600較於歐尚更為精緻。

    比亞迪宋MAX:6座版本內飾布局與7座完全一致,在內飾的配色上新增了黑+棕色的版本,使整個內飾看上去不再沉悶。

    瞧一瞧動力

    動力方面,寶駿360搭載與寶駿310系列相同的1.5L自然吸氣發動機,最大輸出功率82kW,和發動機相匹配是6速手動和自動擋。長安歐尚A600動力配置上較為豐富,提供了1.5L和1.6L兩種動力選擇,此外,新車在1.6L車型上均匹配了六速自動變速箱,從而提高了車型的競爭力。比亞迪宋MAX則是熟悉的1.5T渦輪增壓發動機匹配6速手動變速箱或6速雙離合變速箱。

    總結:以上三台車都是本土車廠為滿足國內消費者需要而交出的答卷。可以看出歐尚A600與寶駿360均走高性價比路線,歐尚A600自動變速箱是其一個優勢,同樣的價格區間內寶駿360有空間的優勢。相比之下,比亞迪宋MAX6座版整體配置是跟7座版本看齊,更多的可以將其看作為順應新政策而在座椅數上作出的妥協,不過也因為少了一個座,車內的空間表現將比7座版本更好。以上就是最近新上市的三款六座MpV至於要怎麼選,相信各位心中自有答案。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

    網頁設計最專業,超強功能平台可客製化

  • 淑女?劈蕉佬?這些雷人車型名字你了解幾個?

    淑女?劈蕉佬?這些雷人車型名字你了解幾個?

    有誰想到這款車當年竟然是名棄嬰,四處找人收留。Jimny的型號的原本來自一間叫希望汽車的生產廠家,該公司研製了一部希望之星ON360,但鑒於公司規模,老闆小野定良計劃向三菱汽車推銷代工制權,但三菱礙於希望汽車的往績,並沒有接受這單生意,最後只能硬着頭皮自行生產,並於1967年底上市,可惜銷量不如預期。

    每部車都有着自己的型號名,一般來說就是字母加数字的組合,或單純以文字作為型號名,在當中有的更隱藏別具意義的故事,今天就和大家分享幾個有趣的故事。

    淑女的由來

    “惡魔Z”、“大魔王”這些都是我們對Fairlady的尊稱,日產經典跑車系列Fairlady這個名字的靈感來源於百老匯歌舞劇My Fair Lady, 1961年時任社長川又克二正在美國公幹,機緣巧合下觀看了這套長壽歌舞劇,同期美國即將推出新款跑車SLp213,一下子就決定新車冠以Fairlady之名,希望它像該歌劇一樣受歡迎,並成為經典。

    380萬中挑一

    Sunny(陽光)於1966年推出,曾經是日產主力家庭用車,當年日產在報紙廣告上預告推出一升的新車,並進行募集車名活動,在緊接一輪廣告攻勢逐步發布新車細節后,接連一個月宣傳吸引了848萬人參與,收到共380萬個名字推薦,最後選定了切合車型概念的Sunny為名。

    南美洲“劈蕉佬”

    不少越野發燒友及工程人員鍾情的三菱pajero(帕傑羅),因其英文發音和粵語里的“劈蕉佬”有着99%的相似度,瞬間顯得親民又剛強。至於pajero名稱的起源,則是取自於生活在阿根廷南部高原地帶的一種山貓,它活躍於崎嶇山間,正好吻合pajero的強勁野外走破性能,更讓這隻猛獸衝出南美洲,穿梭於全球各地山野。

    人棄我取,終成經典

    硬派越野車一直給人一種高大上的感覺,但也有例外,鈴木Jimny(吉姆尼)就是這樣一款小巧見稱的越野車,即使到了今天仍然是不少越野愛好者的寵兒。有誰想到這款車當年竟然是名棄嬰,四處找人收留。Jimny的型號的原本來自一間叫希望汽車的生產廠家,該公司研製了一部希望之星ON360,但鑒於公司規模,老闆小野定良計劃向三菱汽車推銷代工制權,但三菱礙於希望汽車的往績,並沒有接受這單生意,最後只能硬着頭皮自行生產,並於1967年底上市,可惜銷量不如預期。於是小野定良改去向鈴木汽車負責人鈴木修推銷此車,鈴木修對此車一見鍾情,即使公司上下都反對仍堅持一己之見,最終以1,200萬日元向希望汽車買斷整個設計,並於1970年4月推出初代Jimny,造就這部鈴木的招牌車款。

    買回來的名字

    在Integra未面世之前,prelude(廣東及港澳地區稱“披露”)就是本田coupe車款的代表,也是展現本田各種黑科技的試驗田。DOHC VTEC、雙搖臂懸架及四輪轉向系統等配置早早就出現在prelude之上,中文意謂“前奏曲”的prelude名字原為豐田擁有,當本田於70年代末期決定以此為新車型號后才發現早已被豐田註冊了名字。本來最簡單的方法就是改名,但當年本田執意鍾情於prelude這個名字,於是主動向豐田提出轉讓要求,結果一輪商議后prelude終於歸入本田名下。雖然雙方未有提到當中細節,不過相信離不開用金錢來解決,而這個買回來的名字就一直使用到2001年第五代prelude停產為止,歷時23年。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※教你寫出一流的銷售文案?

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※回頭車貨運收費標準

    ※別再煩惱如何寫文案,掌握八大原則!

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 近5米長,舒適度同級無敵,這款18.99萬起的車值不值?

    近5米長,舒適度同級無敵,這款18.99萬起的車值不值?

    雪鐵龍C6上配備的1。8T發動機是pSA集團在中國最高階的發動機。這台發動機的賬面數據和實際表現當然比不上對手最高階的發動機,但是比起他們中階發動機,倒也不至於落後。傳動系統是來自愛信的6AT變速箱,這台變速箱可以說拖了後腿,競爭對手大多數用上了8、9AT或者7速雙離合的產品。

    在2008年,C6曾經以中大型車的身份引進中國。當時的雪鐵龍C6是C級車的身份,售價高達64萬。時過境遷,當C6再次回到國人視線里時,已經是B級車的身份,而且售價也僅需18.99-27.99萬。

    這一代的C6是一款中國特供車型,專為國人設計。中國人喜歡的元素,超大後排空間、肉眼可見的豪華感、豐富高端的配置、運動流暢的車身造型,在這台C6上一樣不缺。然而,C6的銷量非常慘淡。好在,今天我的任務不是解答為什麼C6銷量慘淡,而是要告訴你這台車到底有多棒。

    雪鐵龍C6的外觀以沉穩為主,前臉的雪鐵龍雙人標識延伸到整個車頭,車頭的線條以水平為主,搭配上大面積的鍍鉻格柵,鑽晶型日間行車燈,彰顯了C6行政級轎車的定位。尾部造型飽滿,銀色的鍍鉻裝飾條連接了兩旁的回字形尾燈,盡顯格調。C6側麵線條流暢動感,缺少了一絲行政級轎車應有的厚重感,而且影響了頭部空間的表現。

    雪鐵龍C6的車身尺寸比市面上大多數B級車都要大,甚至可以列入C級車的行列。

    上帝在製造法國人的時候,只給了他們優秀的設計能力,卻沒有把將設計付諸現實的能力一併安裝上去。C6車身漆面左右厚薄不一,而且這款白色車漆容易沾灰且難以清潔。

    雪鐵龍C6的內飾比外觀做得還好。C6的內飾採用了最新家族式對稱式設計,造型設計更加註重檔次感。材質方面啊,C6的內飾採用了大量的Nappa真皮,實木飾板,同級再也找不到更好的。全液晶儀錶盤的显示效果清晰,可調節的選項豐富,UI設計出色。

    C6座椅方面採用了Nappa真皮包裹,座椅寬大,填充物支撐性足。這台C6的頂配車型,前後座椅均有座椅通風/加熱/按摩功能,這種級別的配置也是同級所不具備的。

    C6的乘坐空間只有一個字——大。1米73的乘客在前排調好位置后,在後排能夠獲得3拳2指左右的腿部空間。可惜,受流線型車身的影響,頭部空間不容樂觀,前排和後排分別只有3指和4指的表現。

    C6的後備廂空間非常大,有523L的容積。不過後排座椅不能放倒,所以沒有擴充的空間。

    雪鐵龍C6上配備的1.8T發動機是pSA集團在中國最高階的發動機。這台發動機的賬面數據和實際表現當然比不上對手最高階的發動機,但是比起他們中階發動機,倒也不至於落後。傳動系統是來自愛信的6AT變速箱,這台變速箱可以說拖了後腿,競爭對手大多數用上了8、9AT或者7速雙離合的產品。這款6AT的擋位數就顯得落後了。從匹配上來說,整套動力系統也不夠線性,起步時需要很小心地控制油門才不會突然被“踢”一腳。如果C6能來個ECO模式,相信會好很多。

    雪鐵龍C6的0-100km/h實測百公里加速時間為9.4秒。當天有小雨,地面略微有積水,但是加速的過程245mm寬的輪胎幾乎沒有打滑,很平順地就衝出去了。這數據雖然不能跟競爭對手的高階動力系統對比,但是跟他們的1.5T或1.8T的動力對比,還是有競爭力的。

    既然雪鐵龍C6作為一款行政級定位的轎車,底盤肯定是以舒適為主的。雪鐵龍C6的減振器和避震彈簧採用斜置的布置方式,而且減振器和避震彈簧另一端連接的是副車架,而不是車身。這麼做的好處,就是減少減振器上垂直方向的力和避免力直接作用於車身,最終達到乘坐舒適的效果。實際體驗下來,雪鐵龍C6確實能很好地將路面顛簸過濾掉,比起同級對手單薄的濾震能力要好上不少,甚至可以說,這是C級車上會有的濾震能力。

    雪鐵龍C6的方向盤採用電動液壓助力,路感非常清晰,沒有什麼虛位,回正的力度也線性,只是手感比較重,更加適合男性駕駛。

    C6的隔音水平也是行政級水準的。C6四門車窗都使用了雙層隔音玻璃。C6在怠速時幾乎聽不到發動機的聲音,高速跑起來的時候輪胎噪音會相對較大,而風噪不明顯。

    從市場定位上來說,與C6有相似定位的B級車,只有別克君越這一款。他們都有舒適的底盤表現,寬敞的乘坐空間,高檔的內飾氛圍。兩款拿出來比較,C6的配置更高,後期保養更便宜,而君越的動力會更完善。如果不考慮品牌知名度,C6會更加合適。當然,如果雪鐵龍的品牌知名度能夠打出來,C6肯定不會是現在這個定價。所以,各位觀眾朋友,要撿便宜趁現在了。

    本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※超省錢租車方案

    ※別再煩惱如何寫文案,掌握八大原則!

    ※回頭車貨運收費標準

    ※教你寫出一流的銷售文案?

    FB行銷專家,教你從零開始的技巧

  • 漲姿勢了解一下Kafka消費位移可好?

    漲姿勢了解一下Kafka消費位移可好?

    摘要:Kafka中的位移是個極其重要的概念,因為數據一致性、準確性是一個很重要的語義,我們都不希望消息重複消費或者丟失。而位移就是控制消費進度的大佬。本文就詳細聊聊kafka消費位移的那些事,包括:

    概念剖析

    kafka的兩種位移

    關於位移(Offset),其實在kafka的世界里有兩種位移:

    • 分區位移:生產者向分區寫入消息,每條消息在分區中的位置信息由一個叫offset的數據來表徵。假設一個生產者向一個空分區寫入了 10 條消息,那麼這 10 條消息的位移依次是 0、1、…、9;

    • 消費位移:消費者需要記錄消費進度,即消費到了哪個分區的哪個位置上,這是消費者位移(Consumer Offset)。

    注意,這和上面所說的消息在分區上的位移完全不是一個概念。上面的“位移”表徵的是分區內的消息位置,它是不變的,即一旦消息被成功寫入到一個分區上,它的位移值就是固定的了。而消費者位移則不同,它可能是隨時變化的,畢竟它是消費者消費進度的指示器。

    消費位移

    消費位移,記錄的是 Consumer 要消費的下一條消息的位移,切記,是下一條消息的位移! 而不是目前最新消費消息的位移

    假設一個分區中有 10 條消息,位移分別是 0 到 9。某個 Consumer 應用已消費了 5 條消息,這就說明該 Consumer 消費了位移為 0 到 4 的 5 條消息,此時 Consumer 的位移是 5,指向了下一條消息的位移。

    至於為什麼要有消費位移,很好理解,當 Consumer 發生故障重啟之後,就能夠從 Kafka 中讀取之前提交的位移值,然後從相應的位移處繼續消費,從而避免整個消費過程重來一遍。就好像書籤一樣,需要書籤你才可以快速找到你上次讀書的位置。

    那麼了解了位移是什麼以及它的重要性,我們自然而然會有一個疑問,kafka是怎麼記錄、怎麼保存、怎麼管理位移的呢?

    位移的提交

    Consumer 需要上報自己的位移數據,這個彙報過程被稱為位移提交。因為 Consumer 能夠同時消費多個分區的數據,所以位移的提交實際上是在分區粒度上進行的,即Consumer 需要為分配給它的每個分區提交各自的位移數據。

    鑒於位移提交甚至是位移管理對 Consumer 端的巨大影響,KafkaConsumer API提供了多種提交位移的方法,每一種都有各自的用途,這些都是本文將要談到的方案。

    void commitSync(Duration timeout);
    void commitSync(Map<TopicPartition, OffsetAndMetadata> offsets);
    void commitSync(final Map<TopicPartition, OffsetAndMetadata> offsets, final Duration timeout);
    void commitAsync();
    void commitAsync(OffsetCommitCallback callback);
    void commitAsync(Map<TopicPartition, OffsetAndMetadata> offsets, OffsetCommitCallback callback);
    

    先粗略的總結一下。位移提交分為自動提交和手動提交;而手動提交又分為同步提交和異步提交。

    自動提交

    當消費配置enable.auto.commit=true的時候代表自動提交位移。

    自動提交位移是發生在什麼時候呢?auto.commit.interval.ms默認值是50000ms。即kafka每隔5s會幫你自動提交一次位移。自動位移提交的動作是在 poll()方法的邏輯里完成的,在每次真正向服務端發起拉取請求之前會檢查是否可以進行位移提交,如果可以,那麼就會提交上一次輪詢的位移。假如消費數據量特別大,可以設置的短一點。

    越簡單的東西功能越不足,自動提交位移省事的同時肯定會帶來一些問題。自動提交帶來重複消費和消息丟失的問題:

    • 重複消費: 在默認情況下,Consumer 每 5 秒自動提交一次位移。現在,我們假設提交位移之後的 3 秒發生了 Rebalance 操作。在 Rebalance 之後,所有 Consumer 從上一次提交的位移處繼續消費,但該位移已經是 3 秒前的位移數據了,故在 Rebalance 發生前 3 秒消費的所有數據都要重新再消費一次。雖然你能夠通過減少 auto.commit.interval.ms 的值來提高提交頻率,但這麼做只能縮小重複消費的時間窗口,不可能完全消除它。這是自動提交機制的一個缺陷。

    • 消息丟失: 假設拉取了100條消息,正在處理第50條消息的時候,到達了自動提交窗口期,自動提交線程將拉取到的每個分區的最大消息位移進行提交,如果此時消費服務掛掉,消息並未處理結束,但卻提交了最大位移,下次重啟就從100條那消費,即發生了50-100條的消息丟失。

    手動提交

    當消費配置enable.auto.commit=false的時候代表手動提交位移。用戶必須在適當的時機(一般是處理完業務邏輯后),手動的調用相關api方法提交位移。比如在下面的案例中,我需要確認我的業務邏輯返回true之後再手動提交位移

     while (true) {
         try {
             ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofMinutes(KafkaConfig.pollTimeoutOfMinutes));
             if (!consumerRecords.isEmpty()) {
                 for (ConsumerRecord<String, String> record : consumerRecords) {
                     KafkaMessage kafkaMessage = JSON.parseObject(record.value(), KafkaMessage.class);
                     // 處理業務
                     boolean handleResult = handle(kafkaMessage);
                     if (handleResult) {
                         log.info(" handle success, kafkaMessage={}" ,kafkaMessage);
                     } else {
                         log.info(" handle failed, kafkaMessage={}" ,kafkaMessage);
                     }
                 }
                 // 手動提交offset
                 consumer.commitSync(Duration.ofMinutes(KafkaConfig.pollTimeoutOfMinutes));
            
             } 
         } catch (Exception e) {
             log.info("kafka consume error." ,e);
         }
     }
    

    手動提交明顯能解決消息丟失的問題,因為你是處理完業務邏輯后再提交的,假如此時消費服務掛掉,消息並未處理結束,那麼重啟的時候還會重新消費。

    但是對於業務層面的失敗導致消息未消費成功,是無法處理的。因為業務層的邏輯千變萬化、比如格式不正確,你叫Kafka消費端程序怎麼去處理?應該要業務層面自己處理,記錄失敗日誌做好監控等。

    但是手動提交不能解決消息重複的問題,也很好理解,假如消費0-100條消息,50條時掛了,重啟後由於沒有提交這一批消息的offset,是會從0開始重新消費。至於如何避免重複消費的問題,在這篇文章有說。

    手動提交又分為異步提交和同步提交。

    同步提交

    上面案例代碼使用的是commitSync() ,顧名思義,是同步提交位移的方法。同步提交位移Consumer 程序會處於阻塞狀態,等待 Broker 返回提交結果。同步模式下提交失敗的時候一直嘗試提交,直到遇到無法重試的情況下才會結束。在任何系統中,因為程序而非資源限制而導致的阻塞都可能是系統的瓶頸,會影響整個應用程序的 TPS。當然,你可以選擇拉長提交間隔,但這樣做的後果是 Consumer 的提交頻率下降,在下次 Consumer 重啟回來后,會有更多的消息被重新消費。因此,為了解決這些不足,kafka還提供了異步提交方法。

    異步提交

    異步提交會立即返回,不會阻塞,因此不會影響 Consumer 應用的 TPS。由於它是異步的,Kafka 提供了回調函數,供你實現提交之後的邏輯,比如記錄日誌或處理異常等。下面這段代碼展示了調用 commitAsync() 的方法

     consumer.commitAsync((offsets, exception) -> {
     if (exception != null)
         handleException(exception);
     });
    

    但是異步提交會有一個問題,那就是它沒有重試機制,不過一般情況下,針對偶爾出現的提交失敗,不進行重試不會有太大問題,因為如果提交失敗是因為臨時問題導致的,那麼後續的提交總會有成功的。所以消息也是不會丟失和重複消費的。
    但如果這是發生在關閉消費者或再均衡前的最後一次提交,就要確保能夠提交成功。因此,組合使用commitAsync()commitSync()是最佳的方式。

    try {
        while (true) {
            ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofMinutes(KafkaConfig.pollTimeoutOfMinutes));
            if (!consumerRecords.isEmpty()) {
                 for (ConsumerRecord<String, String> record : consumerRecords) {
                    KafkaMessage kafkaMessage = JSON.parseObject(record.value(), KafkaMessage.class);
                    boolean handleResult = handle(kafkaMessage);             
                 }
                 //異步提交位移               
                 consumer.commitAsync((offsets, exception) -> {
                 if (exception != null)
                     handleException(exception);
                 });
               
            }
        }
    } catch (Exception e) {
        System.out.println("kafka consumer error:" + e.toString());
    } finally {
        try {
            //最後同步提交位移
            consumer.commitSync();
        } finally {
            consumer.close();
        }
    }
    

    讓位移提交更加靈活和可控

    如果細心的閱讀了上面所有demo的代碼,那麼你會發現這樣幾個問題:

    1、所有的提交,都是提交 poll 方法返回的所有消息的位移,poll 方法一次返回1000 條消息,則一次性地將這 1000 條消息的位移一併提交。可這樣一旦中間出現問題,位移沒有提交,下次會重新消費已經處理成功的數據。所以我想做到細粒度控制,比如每次提交100條,該怎麼辦?

    答:可以通過commitSync(Map<TopicPartition, OffsetAndMetadata>)commitAsync(Map<TopicPartition, OffsetAndMetadata>)對位移進行精確控制。

    2、poll和commit方法對於普通的開發人員而言是一個黑盒,無法精確地掌控其消費的具體位置。我都不知道這次的提交,是針對哪個partition,提交上去的offset是多少。

    答:可以通過record.topic()獲取topic信息, record.partition()獲取分區信息,record.offset() + 1獲取消費位移,記住消費位移是指示下一條消費的位移,所以要加一。

    3、我想自己管理offset怎麼辦?一方面更加保險,一方面下次重啟之後可以精準的從數據庫讀取最後的offset就不存在丟失和重複消費了。
    答:可以將消費位移保存在數據庫中。消費端程序使用comsumer.seek方法指定從某個位移開始消費。

    綜合以上幾個可優化點,並結合全文,可以給出一個比較完美且完整的demo:聯合異步提交和同步提交,對處理過程中所有的異常都進行了處理。細粒度的控制了消費位移的提交,並且保守的將消費位移記錄到了數據庫中,重新啟動消費端程序的時候會從數據庫讀取位移。這也是我們消費端程序位移提交的最佳實踐方案。你只要繼承這個抽象類,實現你具體的業務邏輯就可以了。

    public abstract class PrefectCosumer {
        private Map<TopicPartition, OffsetAndMetadata> offsets = new HashMap<>();
        int count = 0;
        public final void consume() {
            Properties properties = PropertiesConfig.getConsumerProperties();
            properties.put("group.id", getGroupId());
            Consumer<String, String> consumer = new KafkaConsumer<>(properties);
            consumer.subscribe(getTopics());
            consumer.poll(0);
            // 把offset記錄到數據庫中 從指定的offset處消費 
            consumer.partitionsFor(getTopics()).stream().map(info ->
            new TopicPartition(getTopics(), info.partition()))
            .forEach(tp -> {
                   consumer.seek(tp, JdbcUtils.queryOffset().get(tp.partition()));   
             });
            try {
                while (true) {
                    ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofMinutes(KafkaConfig.pollTimeoutOfMinutes));
                    if (!consumerRecords.isEmpty()) {
                        for (ConsumerRecord<String, String> record : consumerRecords) {
    
                            KafkaMessage kafkaMessage = JSON.parseObject(record.value(), KafkaMessage.class);
                            boolean handleResult = handle(kafkaMessage);
                            if (handleResult) {
                                //注意:提交的是下一條消息的位移。所以OffsetAndMetadata 對象時,必須使用當前消息位移加 1。
                                offsets.put(new TopicPartition(record.topic(), record.partition()),
                                        new OffsetAndMetadata(record.offset() + 1));
    
                                // 細粒度控制提交 每10條提交一次offset
                                if (count % 10 == 0) {
                                    // 異步提交offset
                                    consumer.commitAsync(offsets, (offsets, exception) -> {
                                        if (exception != null) {
                                            handleException(exception);
                                        }
                                        // 將消費位移再記錄一份到數據庫中
                                        offsets.forEach((k, v) -> {
                                            String s = "insert into kafka_offset(`topic`,`group_id`,`partition_id`,`offset`) values" +
                                                    " ('" + k.topic() + "','" + getGroupId() + "'," + k.partition() + "," + v.offset() + ")" +
                                                    " on duplicate key update offset=values(offset);";
                                            JdbcUtils.insertTable(s);
                                        });
    
    
                                    });
                                }
                                count++;
                            } else {         
                                System.out.println("消費消息失敗 kafkaMessage={}" + getTopics() + getGroupId() + kafkaMessage.toString());                         
                            }
                        }
    
    
                    }
                }
            } catch (Exception e) {
                System.out.println("kafka consumer error:" + e.toString());
            } finally {
                try {
                    // 最後一次提交 使用同步提交offset
                    consumer.commitSync();
                } finally {
                    consumer.close();
                }
    
    
            }
        }
    
    
        /**
         * 具體的業務邏輯
         *
         * @param kafkaMessage
         * @return
         */
        public abstract boolean handle(KafkaMessage kafkaMessage);
    
        public abstract List<String> getTopics();
    
        public abstract String getGroupId();
    
        void handleException(Exception e) {
            //異常處理
        }
    }
    

    控制位移提交的N種方式

    剛剛我們說自己控制位移,使用seek方法可以指定offset消費。那到底怎麼控制位移?怎麼重設消費組位移?seek是什麼?現在就來仔細說說。

    並不是所有的消息隊列都可以重設消費者組位移達到重新消費的目的。比如傳統的RabbitMq,它們處理消息是一次性的,即一旦消息被成功消費,就會被刪除。而Kafka消費消息是可以重演的,因為它是基於日誌結構(log-based)的消息引擎,消費者在消費消息時,僅僅是從磁盤文件上讀取數據而已,所以消費者不會刪除消息數據。同時,由於位移數據是由消費者控制的,因此它能夠很容易地修改位移的值,實現重複消費歷史數據的功能。

    了解如何重設位移是很重要的。假設這麼一個場景,我已經消費了1000條消息后,我發現處理邏輯錯了,所以我需要重新消費一下,可是位移已經提交了,我到底該怎麼重新消費這1000條呢??假設我想從某個時間點開始消費,我又該如何處理呢?

    首先說個誤區:auto.offset.reset=earliest/latest這個參數大家都很熟悉,但是初學者很容易誤會它。大部分朋友都覺得在任何情況下把這兩個值設置為earliest或者latest ,消費者就可以從最早或者最新的offset開始消費,但實際上並不是那麼回事,他們生效都有一個前提條件,那就是對於同一個groupid的消費者,如果這個topic某個分區有已經提交的offset,那麼無論是把auto.offset.reset=earliest還是latest,都將失效,消費者會從已經提交的offset開始消費。因此這個參數並不能解決用戶想重設消費位移的需求。

    kafka有七種控制消費組消費offset的策略,主要分為位移維度和時間維度,包括:

    • 位移維度。這是指根據位移值來重設。也就是說,直接把消費者的位移值重設成我們給定的位移值。包括Earliest/Latest/Current/Specified-Offset/Shift-By-N策略

    • 時間維度。我們可以給定一個時間,讓消費者把位移調整成大於該時間的最小位移;也可以給出一段時間間隔,比如 30 分鐘前,然後讓消費者直接將位移調回 30 分鐘之前的位移值。包括DateTime和Duration策略

    說完了重設策略,我們就來看一下具體應該如何實現,可以從兩個角度,API方式和命令行方式。

    重設位移的方法之API方式

    API方式只要記住用seek方法就可以了,包括seek,seekToBeginning 和 seekToEnd。

    void seek(TopicPartition partition, long offset);    
    void seek(TopicPartition partition, OffsetAndMetadata offsetAndMetadata);    
    void seekToBeginning(Collection<TopicPartition> partitions);    
    void seekToEnd(Collection<TopicPartition> partitions);    
    

    從方法簽名我們可以看出seekToBeginningseekToEnd是可以一次性重設n個分區的位移,而seek 只允許重設指定分區的位移,即為每個分區都單獨設置位移,因為不難得出,如果要自定義每個分區的位移值則用seek,如果希望kafka幫你批量重設所有分區位移,比如從最新數據消費或者從最早數據消費,那麼用seekToEnd和seekToBeginning。

    Earliest 策略:從最早的數據開始消費

    從主題當前最早位移處開始消費,這個最早位移不一定就是 0 ,因為很久遠的消息會被 Kafka 自動刪除,主要取決於你的刪除配置。

    代碼如下:

    Properties properties = PropertiesConfig.getConsumerProperties();
    properties.put("group.id", getGroupId());
    Consumer<String, String> consumer = new KafkaConsumer<>(properties);
    consumer.subscribe(getTopics());
    consumer.poll(0);
    consumer.seekToBeginning(
    consumer.partitionsFor(getTopics()).stream().map(partitionInfo ->
       new TopicPartition(getTopics(), partitionInfo.partition()))
       .collect(Collectors.toList()));
    

    首先是構造consumer對象,這樣我們可以通過partitionsFor獲取到分區的信息,然後我們就可以構造出TopicPartition集合,傳給seekToBegining方法。需要注意的一個地方是:需要用consumer.poll(0),而不能用consumer.poll(Duration.ofMillis(0))

    在poll(0)中consumer會一直阻塞直到它成功獲取了所需的元數據信息,之後它才會發起fetch請求去獲取數據。而poll(Duration)會把元數據獲取也計入整個超時時間。由於本例中使用的是0,即瞬時超時,因此consumer根本無法在這麼短的時間內連接上coordinator,所以只能趕在超時前返回一個空集合。

    Latest策略:從最新的數據開始消費

        consumer.seekToEnd(
            consumer.partitionsFor(getTopics().get(0)).stream().map(partitionInfo ->
                new TopicPartition(getTopics().get(0), partitionInfo.partition()))
                  .collect(Collectors.toList()));
    
    

    Current策略:從當前已經提交的offset處消費

    consumer.partitionsFor(getTopics().get(0)).stream().map(info ->
            new TopicPartition(getTopics().get(0), info.partition()))
            .forEach(tp -> {
                long committedOffset = consumer.committed(tp).offset();
                consumer.seek(tp, committedOffset);
            });
    

    **Special-offset策略:從指定的offset處消費 **

    該策略使用的方法和current策略一樣,區別在於,current策略是直接從kafka元信息中讀取中已經提交的offset值,而special策略需要用戶自己為每一個分區指定offset值,我們一般是把offset記錄到數據庫中然後可以從數據庫去讀取這個值

        consumer.partitionsFor(getTopics().get(0)).stream().map(info ->
                    new TopicPartition(getTopics().get(0), info.partition()))
                    .forEach(tp -> {
                        try {
                            consumer.seek(tp, JdbcUtils.queryOffset().get(tp.partition()));
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    });
    
    

    以上演示了用API方式重設位移,演示了四種常見策略的代碼,另外三種沒有演示,一方面是大同小異,另一方面在實際生產中,用API的方式不太可能去做時間維度的重設,而基本都是用命令行方式。

    重設位移的方法之命令行方式

    命令行方式重設位移是通過 kafka-consumer-groups 腳本。比起 API 的方式,用命令行重設位移要簡單得多。

    Earliest 策略指定–to-earliest。

    bin/kafka-consumer-groups.sh --bootstrap-server kafka-host:port --group test-group --reset-offsets --all-topics --to-earliest –execute
    

    Latest 策略指定–to-latest。

    bin/kafka-consumer-groups.sh --bootstrap-server kafka-host:port --group test-group --reset-offsets --all-topics --to-latest --execute
    

    Current 策略指定–to-current。

    bin/kafka-consumer-groups.sh --bootstrap-server kafka-host:port --group test-group --reset-offsets --all-topics --to-current --execute
    

    Specified-Offset 策略指定–to-offset。

    bin/kafka-consumer-groups.sh --bootstrap-server kafka-host:port --group test-group --reset-offsets --all-topics --to-offset <offset> --execute
    

    Shift-By-N 策略指定–shift-by N。

    bin/kafka-consumer-groups.sh --bootstrap-server kafka-host:port --group test-group --reset-offsets --shift-by <offset_N> --execute
    

    DateTime 策略指定–to-datetime。

    DateTime 允許你指定一個時間,然後將位移重置到該時間之後的最早位移處。常見的使用場景是,你想重新消費昨天的數據,那麼你可以使用該策略重設位移到昨天 0 點。

    bin/kafka-consumer-groups.sh --bootstrap-server kafka-host:port --group test-group --reset-offsets --to-datetime 2019-06-20T20:00:00.000 --execute
    

    Duration 策略指定–by-duration。
    Duration 策略則是指給定相對的時間間隔,然後將位移調整到距離當前給定時間間隔的位移處,具體格式是 PnDTnHnMnS。如果你熟悉 Java 8 引入的 Duration 類的話,你應該不會對這個格式感到陌生。它就是一個符合 ISO-8601 規範的 Duration 格式,以字母 P 開頭,後面由 4 部分組成,即 D、H、M 和 S,分別表示天、小時、分鐘和秒。舉個例子,如果你想將位移調回到 15 分鐘前,那麼你就可以指定 PT0H15M0S

    bin/kafka-consumer-groups.sh --bootstrap-server kafka-host:port --group test-group --reset-offsets --by-duration PT0H30M0S --execute
    

    提交的位移都去哪了?

    通過上面那幾部分的內容,我們已經搞懂了位移提交的方方面面,那麼提交的位移它保存在哪裡呢?這就要去位移主題的的世界里一探究竟了。kafka把位移保存在一個叫做__consumer_offsets的內部主題中,叫做位移主題。

    注意:老版本的kafka其實是把位移保存在zookeeper中的,但是zookeeper並不適合這種高頻寫的場景。所以新版本已經是改進了這個方案,直接保存到kafka。畢竟kafka本身就適合高頻寫的場景,並且kafka也可以保證高可用性和高持久性。

    既然它也是主題,那麼離不開分區和副本這兩個機制。我們並沒有手動創建這個主題並且指定,所以是kafka自動創建的, 分區的數量取決於Broker 端參數 offsets.topic.num.partitions,默認是50個分區,而副本參數取決於offsets.topic.replication.factor,默認是3。

    既然也是主題,肯定會有消息,那麼消息格式是什麼呢?參考前面我們手動設計將位移寫入數據庫的方案,我們保存了topic,group_id,partition,offset四個字段。topic,group_id,partition無疑是數據表中的聯合主鍵,而offset是不斷更新的。無疑kafka的位移主題消息也是類似這種設計。key也是那三個字段,而消息體其實很複雜,你可以先簡單理解為就是offset。

    既然也是主題,肯定也會有刪除策略,否則消息會無限膨脹。但是位移主題的刪除策略和其他主題刪除策略又不太一樣。我們知道普通主題的刪除是可以通過配置刪除時間或者大小的。而位移主題的刪除,叫做 Compaction。Kafka 使用Compact 策略來刪除位移主題中的過期消息,對於同一個 Key 的兩條消息 M1 和 M2,如果 M1 的發送時間早於 M2,那麼 M1 就是過期消息。Compact 的過程就是掃描日誌的所有消息,剔除那些過期的消息,然後把剩下的消息整理在一起。

    Kafka 提供了專門的後台線程定期地巡檢待 Compact 的主題,看看是否存在滿足條件的可刪除數據。這個後台線程叫 Log Cleaner。很多實際生產環境中都出現過位移主題無限膨脹佔用過多磁盤空間的問題,如果你的環境中也有這個問題,我建議你去檢查一下 Log Cleaner 線程的狀態,通常都是這個線程掛掉了導致的。

    總結

    kafka的位移是個極其重要的概念,控制着消費進度,也即控制着消費的準確性,完整性,為了保證消息不重複和不丟失。我們最好做到以下幾點:

    • 手動提交位移。

    • 手動提交有異步提交和同步提交兩種方式,既然兩者有利也有弊,那麼我們可以結合起來使用。

    • 細粒度的控制消費位移的提交,這樣可以避免重複消費的問題。

    • 保守的將消費位移再記錄到了數據庫中,重新啟動消費端程序的時候從數據庫讀取位移。

    獲取Kafka全套原創學習資料及思維導圖,關注【胖滾豬學編程】公眾號,回復”kafka”。

    本文來源於公眾號:【胖滾豬學編程】。一枚集顏值與才華於一身,不算聰明卻足夠努力的女程序媛。用漫畫形式讓編程so easy and interesting!求關注!

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計最專業,超強功能平台可客製化

  • SpringMVC-攔截器

    SpringMVC-攔截器

    概述

    Java 里的攔截器是動態攔截 action 調用的對象。

    可以在Controller 中的方法執行之前與執行之後,及頁面显示完畢后,執行指定的方法,自定義的攔截器必須實現HandlerInterceptor 接口。

    方法介紹

    preHandle

    在業務處理器處理請求之前被調用

    postHandle

    在業務處理器處理完請求后

    afterCompletion

    在 DispatcherServlet 完全處理完請求后被調用

    SpringMVC攔截器使用

    攔截所有請求

    創建一個類實現 HandlerInterceptor 接口

     

     配置文件當中添加攔截器

     

     內部源碼分析

     

     

     

     

    攔截指定請求

     

     

    配置多個攔截器執行順序

     

     

     

     

     

     

     

    第 2 個返回 false

     

     

     

     

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※別再煩惱如何寫文案,掌握八大原則!

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • salesforce零基礎學習(九十八)Type淺談

    salesforce零基礎學習(九十八)Type淺談

    在Salesforce的世界,凡事皆Metadata。

    先通過一句經常使用的代碼帶入一下:

    Account accountItem = (Account)JSON.deserialize(accountString,Account.class);

    這種代碼相信大部分開發都會寫過,前台將數據序列化,通過字符串的形參傳遞給後台,後台將數據進行反序列化,從而獲取到這個表或者這個自定義類的實例。所以問題來了,為啥第二個參數是 Account.class?我們通過官方的API描述可能更好的進行了解。

     這裏我們引出了 Type的概念,他是apex 預定的類型,包括 基礎數據類型(Integer等) , 集合, sObject類型以及 用戶定義的類。基礎數據類型等等都是 object類型,所以當我們理解salesforce裏面的類型時,可以簡單的分成兩個大類:Object & sObject。所以Type概念引入完了,它用來幹嘛?怎麼聲明?什麼時候用呢?

    Type t1 = Integer.class;
    Type t2 = Type.forName('Integer');
    system.debug(t1.equals(t2));

    上面的簡單的demo中提供了兩種聲明Type的方式,一種是根據 object | sObject使用 .class聲明,另外一種是使用 Type的方法forName來實例化變量。既然變量可以聲明出來,我們就可以看看他的方法考慮如何搞事情了。

     Type的方法非常少,所以我們想要查看其對應的方法描述以及使用很容易就看完。這裏針對幾個重要的方法進行描述:

    • forName(fullyQualifiedName):返回與指定的完全限定的類名相對應的類型。這裏的類名包括salesforce系統預製的類,自定義的類以及sObject名稱;
    • isAssignableFrom(sourceType):如果object指定類型的引用可以從子類型分配,則返回true,否則返回false。這個方法我們可能首先會先想到 instanceof,因為都是來判斷類型是否相兼容匹配,但是 instanceof必須是初始化這個類或者對象的變量,才能使用 instanceof 來進行判斷,使用 此方法可以省去了靜態編譯時的依賴,所以如果想判斷依賴性,可以優先考慮此方法。
    • newInstance():此方法用來實例化一個指定Type的對象,返回類型是一個object對象,我們可以強制轉換成我們需要的對象類型。因為apex也是面向對象的語言,封裝,繼承,多態三大特性,我們可以通過 newInstance實現父子類型的輕鬆轉換調用相關的方法從而實現動態配置。

    基礎信息介紹完畢,此篇淺入淺出,介紹兩種可能用到的場景。

    1.  JSON序列化與反序列化

    這個我們經常使用,一筆帶過:通過字符串以及指定的 Type類型可以轉換成指定的數據類型。

    Account accountItem = (Account)JSON.deserialize(accountString,Account.class);

    2. 針對Custom Setting等根據配置的動態的類調用動態方法的使用

    ParentClass是一個父類,有兩個變量以及一個虛擬的方法,繼承的子類可以進行實現

    public abstract class ParentClass {
        public String param1 { get; set; }
        public String param2 { get; set; }
    
        public ParentClass() {
            this.param1 = 'value1';
            this.param2 = 'value2';
        }
    
        public virtual String joinParam() {
            return param1 + param2;
        }
    }

    SonClass1繼承了它並實現了它相關的方法

    public class SonClass1 extends ParentClass {
        public SonClass1() {
            super();
            this.param1 = 'son value1';
            this.param2 = 'son value2';
        }
    
        public override String joinParam() {
            return super.joinParam();
        }
    }

    還有其他的SonClassn繼承了它並實現了它的相關的方法,我們在custom setting中配置了不同的場景應該調用的不同的子類,公共方法中,我們只需要使用以下的代碼來判斷和調用即可。

    public String executeJoin(String className) {
        Type t = Type.forName(className);
        Type t2 = Type.forName('ParentClass');
        if(!t2.isAssignableFrom(t)) {
            throw new CustomException('should be son class of ParentClass');
        }
        ParentClass newObj = (ParentClass)t.newInstance();
        return newObj.joinParam();
    }

    總結:篇中簡單的介紹了salesforce中的 Type的使用,拋磚引玉,想要深入了解還要自行查看官方文檔。篇中有錯誤的地方歡迎指出,有不懂的歡迎留言。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

    FB行銷專家,教你從零開始的技巧

  • Nginx服務器的使用與反向代理負載均衡

    Nginx服務器的使用與反向代理負載均衡

    Nginx服務器

    一:什麼是Nginx?

    我們生活的世界中,有的時候需要上網。我們可以瀏覽很多很多的網頁,這些網頁都是由一系列的程序組成,但是我們是否想過,這些程序存儲在什麼地方呢?沒錯,這些程序都是存儲在一種名叫服務器的硬件上,比如我們的電腦也是一種服務器,只不過我們的個人電腦作為服務器的話性能會比較低。我們的網頁程序存儲在服務器硬件上,是否可以隨意存儲呢?不是的,我們需要在服務器硬件的操作系統中搭建一個服務器軟件,那麼這樣,有服務器軟件跟服務器硬件配合,才形成一個完整的服務器。服務器軟件有非常多,比如Apache、tomcat等等都是服務器軟件,而我們今天要學習的Nginx也是一種服務器軟件之一。

    Nginx是一種服務器軟件,故而其最主要、最基本的功能當然是可以與服務器硬件結合,讓程序員可以將程序放在Nginx服務器上,將程序發布出去,讓成千上萬的網民可以瀏覽。除此之外,Nginx是一種高性能的HTTP和反向代理服務器,同時也是一個代理郵件服務器。也就是說,我們Nginx上可以發布網站,也可以實現負載均衡的功能,還可以作為郵件服務器實現收發郵件等功能。所謂的負載均衡是指,當同時有N多用戶訪問我們服務器的時候,為了減少服務器壓力,我們需要將用戶分別引入各服務器,分擔服務器的壓力。

    Nginx與其他服努器的性能比較

    首先說IIS, IIS服務器只能在Windows上運行,Windows服務器性能不如Linux— 類服務器。其次說Tomcat,Tomcat服務器面向的是Java語言,是一種重量級的服 務器,而Nginx是輕量級服務器,Tomcat與Nginx不具備可比性。最後,我們講一 下Apache,Apache優點非常多,比如穩定、幵源、跨平台等等,但是Apache不支 持高併發。Nginx能支持處理百萬級的TCP連接,10萬以上的併發連接,並且是一 個很好的跨平台服務器。

    Nginx的主要優點有可以實現高併發、部署簡單、內存消耗少、成本低等等。

    Nginx的主要缺點有rewrite功能不夠強大,模塊沒有Apache的多。

    本文版權歸微信公眾號”代碼藝術”(ID:onblog)所有,若是轉載請務必保留本段原創聲明,違者必究。若是文章有不足之處,歡迎關注微信公眾號私信與我進行交流!

    二:Linux中搭建Nginx服務器

    新建壓縮包下載位置(可選)

    新建目錄
    mkdir /usr/local/nginx_down
    切換目錄
    cd /usr/local/nginx_down
    

    下載解壓 Nginx

    下載
    wget http://nginx.org/download/nginx-1.14.0.tar.gz
    解壓
    tar -zxvf nginx-1.14.0.tar.gz
    切換目錄
    cd nginx-1.14.0
    

    配置 Nginx

    ./configure --with-http_ssl_module
    
    1. 這樣會默認安裝nginx在 /usr/local/nginx 目錄,可以使用--prefix=/usr/local/nginx指定安裝位置。

    2. 如果需要HTTPS(SSL)的支持,需要指定參數--with-http_ssl_module

    如果提示錯誤,那麼需要其它環境,請參考下面

    安裝 make

    yum -y install gcc automake autoconf libtool make
    

    安裝 g++

    yum -y install gcc gcc-c++
    

    安裝 PCRE庫

    yum -y install pcre pcre-devel
    

    安裝 Zlib

    yum -y install zlib zlib-devel
    

    安裝 GD library

    yum -y install gd-devel
    

    安裝 openssl

    yum -y install openssl openssl-devel
    

    -y:跳過所有手動確認輸入

    如果./configure安裝成功,只需要再執行兩個命令:

    make
    
    make install
    

    查看是否安裝成功

    cd /usr/local/nginx
    

    如果安裝成功,則會出現下列目錄:

    conf  html  logs  sbin
    

    切換到sbin目錄

    cd /sbin
    

    啟動程序

    ./nginx
    

    追加參數 -c 可以指定配置文件。

    常見的錯誤

    在Linux操作系統下搭建Nginx服務器,很多時候會出現不同的錯誤,在此,我們對搭建過程中出現的錯誤進行一些總結。主要有這些類型:

    防火牆問題,缺少gc++,缺少pcre、zlib等庫。

    三:Nginx的反向代理和負載均衡

    什麼是反向代理

    我們有時候,用自己的計算機A想訪問國外的某個網站B,但是訪問不了,此時,有一台中間服務器C可以訪問國外的網站B,那麼,我們可以用自己的電腦訪問服務器C,通過C來訪問B這個網站。那麼這個時候,服務器C稱為代理服務器,這種訪問方式叫做正向代理。正向代理有一個特點,就是我們明確知道要訪問哪個網站。再如,當我們有一個服務器集中,並且服務器集群中的每台服務器的內容一樣的時候,同樣我們要直接從個人電腦訪問到服務器集中的服務器的時候無法訪問,且此時第三方服務器能訪問集群,這個時候,我捫通過第三方服務器訪問服務器集群的內容,但是此吋我們並不知道是哪一台服務器提供的內容,此時的代理方式稱為反向代理。

    正向代理

    反向代理

    什麼是負載均衡

    當一台服務器的單位時間內的訪問量越大的時候,服務器的壓力會越大。當一台服務器壓力大得超過自身的承受能力的時候,服務器會崩潰。為了避免服務器崩潰,讓用戶有更好地體驗,我們通常通過負載均衡的方式來分擔服務器的壓力。那麼什麼是負載均衡呢?是這樣,我們可以建立很多很多個服務器,這些服務器組成一個服務器集群,然後,當用戶訪問我們網站的時候,先訪問一个中間服務器,再讓這个中間服務器在服務器集群中選擇一個壓力較小的服務器,然後將該訪問請求引入該選擇的服務器。這樣,用戶的每次訪問,都會保證服務器集群中的每個服務器的壓力趨於平衡,分擔了服務器壓力,避免了服務器崩潰的情況。

    基於反向代理的原理實現負載均衡

    四:Nginx負載均衡的實現

    Nginx 是一款可以通過反向代理實現負載均衡的服務器,使用 Nginx 服務實現負載均衡的時候,用戶的訪問首先會訪問到 Nginx 服務器,然後 Nginx 服務器再從服務器集群表中選擇壓力較小的服務器,然後將該訪問請求引向該服務器。若服務器集群中的某個服務器崩潰,那麼從待選服務器列表中將該服務器刪除,也就是說一個服務器假如崩潰了,那麼 Nginx 就肯定不會將訪問請求引入該服務器了。那麼下面,我們通過實例來講解一下 Nginx 負載均衡的實現。

    負載均衡配置文件

    默認配置文件nginx.conf 很重要,我們一般是新建一個配置文件,在啟動時指定加載。

    [root@hostname conf]# ls  //查看目錄
    fastcgi.conf            koi-win             scgi_params
    fastcgi.conf.default    mime.types          scgi_params.default
    fastcgi_params          mime.types.default  uwsgi_params
    fastcgi_params.default  nginx.conf          uwsgi_params.default
    koi-utf                 nginx.conf.default  win-utf
    [root@hostname conf]# touch fzjh.conf  //新建負載均衡配置文件
    

    編輯fzjh.conf配置文件

    vi fzjh.conf
    
    worker_processes  1;#工作進程的個數,一般與計算機的cpu核數一致  
      
    events {  
        worker_connections  1024;#單個進程最大連接數(最大連接數=連接數*進程數) 併發 
    }  
      
    http {  
        include       mime.types; #文件擴展名與文件類型映射表  
        default_type  application/octet-stream;#默認文件類型  
      
        sendfile        on;#開啟高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片显示不正常把這個改成off。  
          
        keepalive_timeout  65; #長連接超時時間,單位是秒  
      
        gzip  on;#啟用Gizp壓縮  
          
        #服務器的集群  
        upstream  myproject {  #服務器集群名字   
            server    220.181.111.188:80  weight=1;#服務器配置   weight是權重的意思,權重越大,分配的概率越大。  
            server    42.121.252.58:80  weight=2;  
        }     
      
        #當前的Nginx的配置  
        server {  
            listen       80;  #監聽80端口,可以改成其他端口  
            server_name  localhost; ##############   當前服務的域名  
      
            location / {  ##配置路徑/下實現負載均衡
                proxy_pass http://myproject;  ##對應哪個服務器集群
                proxy_redirect default;  
            }  
              
            error_page   500 502 503 504  /50x.html;  
            location = /50x.html {  
               root   html;  #根目錄
            }  
        }  
    }  
    

    我們在nginx目錄下執行命令,啟動負載均衡

    ./sbin/nginx -c ./conf/fzjh.conf
    

    然後嘗試訪問你的服務器,多訪問幾次,你會發現它會訪問2次csdn網站,1次百度。說明我們的負載均衡已經部署完畢。

    如何重啟Nginx

    【本文版權歸微信公眾號”代碼藝術”(ID:onblog)所有,若是轉載請務必保留本段原創聲明,違者必究。若是文章有不足之處,歡迎關注微信公眾號私信與我進行交流!】

    ./sbin/nginx -s reload
    

    如何關閉Nginx服務器

    1.查看nginx進程號

    ps -ef|grep nginx
    

    2.kill掉進程即可 (1709是第二列的進程號)

    kill 1709
    

    或者

    killall -9 nginx
    

    五:HTTP Upstream 模塊

    HTTP Upstream 模塊

    Upstream 模塊是 Nginx 服務器的一個重要模塊。 Upstream 模塊實現在輪詢和客戶端 iP 之間實現後端的負載均衡。常用的指令有 ip_hash指令、 server 指令和 upstream 指令等,下面我們分別來講一下。

    Http Upstream模塊- ip_hash指令

    在負載均衡系統中,假如用戶在某台服務器上登錄,那麼如果該用戶第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到服務器集群中的一個服務器,那麼此時如果將已經登錄服務器A的用戶再定位到其他服務器,顯然不妥。故而,我們可以採用 ip_hash指令解決這個問題,如果客戶端請求已經訪問了服務器A並登錄,那麼第二次請求的時候,會將該請求通過哈希算法自動定位到該後端服務器中。下面我們通過實例講解。

    實例

    此時不應該使用weight權重。

    
    tp {  
       ....
      upstream  myproject {    
          ip_hash; #實現會話跟蹤
          server 140.205.140.234;
          server 61.135.169.125;
    
      }     
     ....
    
    

    Http Upstream 模塊一 upstream 指令及相關變量

    upstream 指令主要是用於設置一組可以在 proxy_pass 和 fastcgi_pass 指令中使用代理服務器,默認負載均衡方式為輪詢。

    六:其他負載均衡實現方式

    負載均衡的實現方法除了可以使用 Nginx服務器實現外,還可以通過很多種方法來實現。負載均衡的核心就是建立一個服務器集群,然後用戶首先訪問到第三方代理服務器,然後由代理服務器選擇一個集群中的服務器,然後將請求引入選定的服務器。那麼代理服務器可以使用多種方式來充當,故而實現負載均衡的方式也是多種。總的來說,負載均衡實現的方式分為軟件實現和硬件實現兩種,如果中間的代理機構是硬件,那麼就是通過硬件設備來實現負載均衡的方式,如果中間的代理機構為軟件,就是軟件實現負載均衡的方式。而其中,軟件又可以是服務器軟件、系統軟件以及應用軟件等充當。

    負載均衡實現方式小結

    下面我們簡單總結一下負載均衡不同實現方式的優缺點:

    假如使用硬件的方式實現負載均衡,那麼中間的轉發機構就是硬件,這個時候運行的效率非常高,但是對應的成本也非常高。如果我們採用軟件的方式來實現負載均衡,那麼中間的轉發機構就是軟件,這個時候,運行效率不如硬件,但是成本相對來說低得多。而使用Nginx服務器實現負載均衡,那麼就是通過軟件的方式來實現負載均衡,並且 Nginx本身支持高併發等。故而使用 Nginx服務器實現負載均衡,能大大節約企業的成本,並且由於 Nginx是服務器軟件,其執行效率也是非常高。

    七:location匹配順序

    1. “=”前綴指令匹配,如果匹配成功,則停止其他匹配
    2. 普通字符串指令匹配,順序是從長到短,匹配成功的location如果使用^~,則停止其他匹配(正則匹配)
    3. 正則表達式指令匹配,按照配置文件里的順序,成功就停止其他匹配
    4. 如果第三步中有匹配成功,則使用該結果,否則使用第二步結果

    注意點

    1. 匹配的順序是先匹配普通字符串,然後再匹配正則表達式。另外普通字符串匹配順序是根據配置中字符長度從長到短,也就是說使用普通字符串配置的location順序是無關緊要的,反正最後nginx會根據配置的長短來進行匹配,但是需要注意的是正則表達式按照配置文件里的順序測試。找到第一個比配的正則表達式將停止搜索。
    2. 一般情況下,匹配成功了普通字符串location后還會進行正則表達式location匹配。有兩種方法改變這種行為,其一就是使用“=”前綴,這時執行的是嚴格匹配,並且匹配成功后立即停止其他匹配,同時處理這個請求;另外一種就是使用“^~”前綴,如果把這個前綴用於一個常規字符串那麼告訴nginx 如果路徑匹配那麼不測試正則表達式。

    匹配模式及順序

      location = /uri    =開頭表示精確匹配,只有完全匹配上才能生效。

      location ^~ /uri   ^~ 開頭對URL路徑進行前綴匹配,並且在正則之前。

      location ~ pattern  ~開頭表示區分大小寫的正則匹配。

      location ~* pattern  ~*開頭表示不區分大小寫的正則匹配。

      location /uri     不帶任何修飾符,也表示前綴匹配,但是在正則匹配之後。

      location /      通用匹配,任何未匹配到其它location的請求都會匹配到,相當於switch中的default。

    八:配置HTTPS

    1.獲取證書

    獲得SSL證書文件 1_www.domain.com_bundle.crt 和私鑰文件 2_www.domain.com.key

    2.證書安裝

    將域名 www.domain.com 的證書文件1_www.domain.com_bundle.crt 、私鑰文件2_www.domain.com.key保存到同一個目錄,例如/usr/local/nginx/conf目錄下。

    3.配置conf

    打開nginx.conf文件,找到nginx.conf的下段配置內容:

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
    
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    

    打開註釋,修改server_name為綁定證書的域名(如:www.domain.com),修改ssl_certificate 為 1_www.domain.com_bundle.crt,修改 ssl_certificate_key 為 2_www.domain.com.key 即可。

    4.HTTP自動跳轉HTTPS

    對於用戶不知道網站可以進行https訪問的情況下,讓服務器自動把http的請求重定向到https。 在服務器這邊的話配置的話,可以在頁面里加js腳本,也可以在後端程序里寫重定向,當然也可以在web服務器來實現跳轉。

    Nginx是支持rewrite的(只要在編譯的時候沒有去掉pcre) 在http的server里增加rewrite ^(.*) https://$host$1 permanent; 這樣就可以實現80進來的請求,重定向為https了。

    還是在此配置文件中,加入下面一句:

    server {
            listen       80;
            server_name  localhost;
            
    		rewrite ^(.*) https://$host$1 permanent;
    		...
    

    版權聲明

    本文版權歸微信公眾號”代碼藝術”(ID:onblog)所有,若是轉載請務必保留本段原創聲明,違者必究。若是文章有不足之處,歡迎關注微信公眾號私信與我進行交流!

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

    網頁設計最專業,超強功能平台可客製化