南非「宰獅取骨」販賣給中國當藥材 專家擔憂致命病毒傳染

摘錄自2020年06月15日聯合報報導

英國保守黨前副主席邁克爾(Lord Ashcroft)近期推出新書「不公平的遊戲(Unfair Game)」,揭露了南非333個屠宰場,將大量獅子宰殺取骨,之後販賣給商人,以利中國和東南亞將其製作成傳統藥材,對此獸醫表示若獅子因病毒死亡,人類可能會因接觸其骨頭而感染。

根據「每日郵報」「太陽報」報導,中國和東南亞每年推動幾百萬英鎊(約千萬台幣)的獅子骨交易,他們將獅子骨視為傳統藥材,而獅子骨和虎骨也會被用來製作成葡萄酒和小飾品。

不過,邁克爾指出圈養的獅子在極為惡劣的環境中生長,牠們可能會將致命疾病傳播給人類,包括結核病或肉毒桿菌中毒,甚至引發一場大流行,南非普利托利亞的野生動物獸醫彼得(Peter Caldwell)表示肉毒桿菌中毒是一種會攻擊神經系統的疾病,可以通過被感染的骨頭和皮膚傳播給人類,另外布魯氏菌病也會透過獅子骨頭傳播,造成關節炎、心臟發炎、結核病、發燒等細菌感染。

物種保育
生活環境
生態保育
生物多樣性
國際新聞
中國
南非
屠宰場
人畜共通傳染病
蝙蝠與新興傳染病
獅子
公共衛生

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家公司費用怎麼算?

長矛射殺國家公園大猩猩領袖 四男恐被關到死

摘錄自2020年6月14日自由時報報導

遊客到訪烏干達都會排上尋找山地大猩猩的行程,近日卻傳出一隻「明星」大猩猩遭到長矛刺殺死亡,涉嫌殺害大猩猩的4名男子供稱,因為大猩猩企圖發動攻擊,因此自衛時才會不小心誤殺大猩猩,目前4人因違反野生動物保護法而被起訴,警方尚在釐清犯案過程,若4人罪名成立將可能面臨540萬美元(約新台幣1.6億元)的罰款或終身監禁。

綜合外媒報導,25歲的銀背大猩猩拉飛奇(Rafiki)在布恩迪難以穿越國家公園(Bwindi Impenetrable National Park)擔任恩庫林哥(Nkuringo)大猩猩團的領袖,深受遊客喜愛,6月1日拉飛奇離奇失蹤,隔日救難隊發現其遺體。

烏干達野生動物管理局表示拉飛奇的死亡是「很大的打擊」,因大猩猩是烏干達的主要旅遊景點之一,且目前大猩猩已瀕臨絕種被列為保育類動物,拉飛奇生前喜歡與人類互動,如今死亡恐怕導致大猩猩團不再信任人類甚至團體分裂,進而影響到當地旅遊發展與經濟。

物種保育
生態保育
生物多樣性
國際新聞
烏干達
銀背大猩猩

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

※超省錢租車方案

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

※推薦台中搬家公司優質服務,可到府估價

研究:全球大型瀕危哺乳動物消失 最終原因是人口激增

環境資訊中心外電;姜唯 翻譯;林大利 審校;稿源:ENS

西藏野氂牛(Wild Yak,學名:Bos mutus)、巴塔哥尼亞馬駝鹿(Patagonian Huemul,學名:Hippocamelus bisulcus)、不丹的羚牛(Takin,學名:Budorcas taxicolor)、越南的中南大羚(Saola,學名:Pseudoryx nghetinhensis)等世界各地特殊大型哺乳動物正在悄悄消失。過去的幾十年間,連非洲的三種斑馬和牛羚也大幅度減少。

研究人員指出,造成這些哺乳動物消失的原因不僅僅是疾病和棲息地破碎化、森林砍伐或野生動植物貿易。最終原因是人口激增。

而且,除非人類行為大幅度改變,否則科學家認為,這些哺乳動物未來的族群狀況將永遠回不去了。

西藏野氂牛、巴塔哥尼亞馬駝鹿等世界各地特殊大型哺乳動物正悄悄消失。照片來源:birdcapemay(CC BY-NC-ND 2.0)

科學家分析全球大型哺乳動物角色改變的原因 答案正是人口激增

科學家將這些發現發表在《生態與演化前線(Frontiers in Ecology and Evolution)》期刊上,題目是「破碎的食物網和混亂的未來:面對地球人口不斷成長的現代有蹄類(Disassembled food webs and messy projections: modern ungulate communities in the face of unabating human population growth)」。

研究主要作者、科羅拉多州立大學教授伯傑(Joel Berger)說,是付諸行動的時候了,吹捧過去的保育成就對改善人類的未來沒什麼幫助。

在這項研究中,科學家們分析了導致全球生態系統中哺乳動物角色改變的直接和間接原因,同時也指出生態交互作用的本質如何產生根本性的變化,甚至在未來幾十年內更大規模地發生。

他們研究了巴塔哥尼亞馬駝鹿、不丹的羚牛,北美沙漠的野馬、狼和郊狼的變化,以及大型食肉動物就地滅絕後大生態系統改變的必然性。

科學家認為,隨著人口在陸地上的分布越來越廣,這些改變是現在進行式。

「即使是在喜馬拉雅山脈的偏遠地區,人類入侵帶來流浪狗和野狗,嚴重破壞了高經濟價值和文化象徵意義的野生和圈養物種。」不丹基金會的Wangchuk說。

隨著人口激增,大型哺乳動物數量卻是在遞減。圖為巴塔哥尼亞馬駝鹿。照片來源:Vera & Jean-Christophe(CC BY-SA 2.0)

2020年世界人口已接近80億 地球上的哺乳動物有97%是牲畜和人類

人類定居喜馬拉雅山部分地區還是近年暖化融冰後的事。科學家們還指出全球人口的劇烈變化。1830年,海軍中將羅伯特.斐茲洛伊(Robert Fitzroy)乘著小獵犬號穿越南美洲麥哲倫海峽(Magellan Straits)時,地球人口不到12億。到1970年世界地球日,已超過35億。

僅50年後的今天,世界人口已接近80億,牲畜和人類占了地球哺乳動物生物量高達97%。

研究團隊指出,全世界的食物網已被人類大幅改變無法回頭了,重建過去的條件或恢復曾經由原生種創造的生態功能幾乎是不可能的。例如今日除南極洲外,在每個大陸以及美國70%的州中都有野化的家豬。這些動物影響了魚類、爬行動物、鳥類以及其他小型哺乳動物,甚至植物和土壤。

此外,氣候變遷使海洋暖化,導致海洋藻類增生,漁獲量減少。相對魚類的需求減少,陸地上盜獵野生生物的情況隨之增加。

科學家們還記錄下時尚需求如何增加從蒙古、印度和中國輸出至西方的喀什米爾羊毛,導致更多中亞沙漠牧民飼養山羊。這些山羊與原生物種競爭食物,同時也因當地狗越來越多而身處險境。

這些狗不僅是掠食者,還攜帶疾病,傳染雪豹(Snow Leopard,學名:Panthera uncia)、西藏野驢(Kiang,學名:Equus kiang)和普氏原羚(Przewalski’s gazelle,學名:​​​​​​​Procapra przewalskii)等瀕臨滅絕的物種。

棲息在亞洲中部山區的雪豹。照片來源:Antonio Marín Segovia(CC BY-NC-ND 2.0)

但作者們認為,儘管形勢嚴峻,並非沒有機會挽回。像是在極地,適應寒冷氣候的物種仍是人類重要的文化資產,我們仍然有時間保存僅存的生態。

全世界還有許多保護區,如非洲的塞倫蓋蒂和克魯格國家公園、北美黃石公園和朗格-聖伊利亞斯國家公園暨保護區、玻利維亞麥迪迪國家公園、智利和阿根廷的巴塔哥尼亞冰原、中國長塘自然保護區以及世界最大國家公園東北格陵蘭國家公園。

儘管大型哺乳動物食物網將與過去有所不同、有著不同以往的運作方式,但對於未來的走向還有許多選擇。

作者表示:「現在還不算太晚,我們沒有時間為失去哀悼。必須將生態悲痛化為行動,尊重仍然存在的特殊生物多樣性,並透過保護地球的大片原野地來實現。」

Wildife Suffers Humpty Dumpty Effect as Humans Multiply FORT COLLINS, Colorado, June 9, 2020 (ENS)

Some of the world’s largest, most spectacular and unheralded mammals are silently slipping away – species like Tibetan wild yaks and Patagonia’s huemul, Bhutan’s takin and Vietnam’s saola. Even Africa’s three species of zebras and wildebeest have suffered massive reductions over the last several decades.

The reasons for these losses are more than disease and habitat fragmentation, deforestation or wildlife trade, according to researchers. Ultimately, the cause is rampant human population growth.

And unless human behavior changes in unprecedented ways, these scientists warn that future communities of these mammals will never resemble those of the recent past or even today.

The findings are based on a new study, “Disassembled food webs and messy projections: modern ungulate communities in the face of unabating human population growth,” published June 9 in the journal “Frontiers in Ecology and Evolution.”

Joel Berger, lead author of the study and a professor at Colorado State University, said that the time for action is now, and that touting past conservation achievements does little to better humanity’s future.

In this study, the scientists analyzed direct and indirect disruptions that lead to the changing roles of mammals in global ecosystems and noted how the nature of ecological interactions has changed and will do so, on an even larger scale, in the coming decades.

They looked at what has happened with the huemul in Patagonia, takin in Bhutan, wild horses in deserts, wolves and coyotes in North America, and the inevitability of change in big ecosystems as large carnivores are extirpated.

They said this is happening as the human population increases its footprint on land.

“Even in the remote reaches of the Himalayas, stray and feral dogs, a direct result of human intrusions, wreak havoc on wild and domestic species of high economic value and cultural importance,” said Wangchuk of the Bhutan Foundation.

Humans only recently colonized parts of the Himalayas, areas where ice has receded due to warming temperatures. Yet, the authors also point to human population change at a global scale. In 1830 when Vice-Admiral Robert Fitzroy captained his ship, the Beagle, through the Magellan Straits of South America, fewer than 1.2 billion people inhabited Earth. By Earth Day in 1970, there were more than 3.5 billion.

Today, only 50 years later the world’s population approaches eight billion. Livestock and humans now constitute a staggering 97 percent of the planet’s mammal biomass.

The research team explained that worldwide food webs have become irretrievably altered by humans, with little hope to reconstitute even recent past conditions or to put back the ecological functions once created by native species.

Feral pigs, for instance, exist today on every continent except Antarctica, and in 70 percent of the states in the United States. These animals disrupt fish, reptiles, birds and other small mammals, plants and soils.

In addition, climate change warms the oceans, which in turn foments marine algal blooms, reducing fishery catches. With less demand for fish, a consequent uptick in wildlife poaching on land occurs.

The scientists also documented how an appetite for fashion like cashmere increases imports to the west from Mongolia, India and China, resulting in economic incentives for desert pastoralists to produce more domestic goats in central Asia. These goats compete for food with native species and are in danger due to increasing numbers of dogs in these areas.

The dogs are not only predators but also carry diseases, which jeopardizes endangered species like snow leopards, kiang and Przewalksi’s gazelle.

Berger and the study authors suggest that despite the grim findings, all is not yet lost.

Prospects for ecological integrity and the conservation of unheralded species improve greatly toward the world’s edges where the planet’s cold-adapted species remain important to the human spirit and we still have time to save what we have.

The world has remarkable protected areas including Serengeti and Kruger National Park in Africa, Yellowstone and Wrangell-St. Elias National Park & Preserve in North America, Madidi National Park in Bolivia, the Patagonia Ice Fields of Chile and Argentina, the Chang Tang Nature Reserve in China, and Northeast Greenland National Park, the world’s largest national park.

And although food webs with large mammals will be different from those of the past and operate differently today, there are options to shape the future.

“It is not too late and we simply do not have the luxury of time to mourn what we have lost,” said Lambert. “We need to use our ecological grief to implement action and honor the exceptional biodiversity that remains. This can be done by protecting large tracts of the planet’s wild places.”

※ 全文及圖片詳見:ENS

保育類野生動物
哺乳動物
人口
國際新聞
生態保育
生物多樣性

作者

姜唯

如果有一件事是重要的,如果能為孩子實現一個願望,那就是人類與大自然和諧共存。

林大利

於特有生物研究保育中心服務,小鳥和棲地是主要的研究對象。是龜毛的讀者,認為龜毛是探索世界的美德。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

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

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

※推薦評價好的iphone維修中心

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

「殭屍火」來襲? 破紀錄野火再臨北極圈 碳匯恐不保

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

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

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

中國紅蘿蔔殘留農藥超標 日本發出檢查令

摘錄自2020年6月15日中央社報導

因為從中國進口的紅蘿蔔陸續查出含有超過安全標準的殘留農藥,日本政府今(15日)依法發出檢查令,今後中國產的紅蘿蔔都須接受檢查。

「讀賣新聞」報導,日本厚生勞動省今天根據食品衛生法發出檢查命令,今後如果進口中國產的紅蘿蔔(包含加工品),業者有義務須接受紅蘿蔔殘留農藥的檢查。

生活環境
國際新聞
日本
蘿蔔
殘留農藥
食品安全

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

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

※推薦評價好的iphone維修中心

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

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

疫情拖累原油需求 英國石油損失恐達5200億元

摘錄自2020年6月15日中央社報導

英國石油公司(BP)今(15日)預警,第2季將承受最多175億美元(約新台幣5200億元)損失。因武漢肺炎(COVID-19)疫情帶來「持續」經濟衝擊,重創全球石油需求。

受疫情影響,英國石油日前才公布裁減1萬個職位的計畫,今天又發布聲明表示,現行季將承受130億到175億美元的非現金資產減值和沖銷。

能源轉型
能源議題
國際新聞
英國
疫情
原油
武漢肺炎
經濟衝擊
疫情看氣候與能源
石油

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

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

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

法國擬開採莫三比克天然氣 環團批製造氣候炸彈

摘錄自2020年6月15日中央社報導

法國石油業巨擘道達爾(Total)正在莫三比克發展開採天然氣的大型計畫,環保組織「地球之友」今(15日)指控法國此舉無異是在當地放置一枚「氣候定時炸彈」。

法新社報導,「地球之友」(Friends of the Earth)一份報告名為「產業的意外之財,莫三比克的詛咒:法國把莫三比克推進氣阱」(A windfall for the industry, a curse for the country: France Thrusts Mozambique into the gas trap)。報告指出,2010年代初在莫三比克的北海岸外海水面下發現巨大的天然氣儲量,開採總投資金額將達600億美元。

「地球之友」指控,「法國這項陰謀是代表法國能源產業與銀行家的經濟利益……迫使另個非洲國家仰賴化石燃料」。

這份報告指出,法國正研擬三個天然氣計畫,「釋放出的溫室氣體可能相當於法國一年溫室氣體排放量的7倍,更是莫三比克目前年排放量的49倍」。

能源議題
能源轉型
國際新聞
法國
天然氣
油氣開採

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

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

※超省錢租車方案

※回頭車貨運收費標準

聯合國環境署:清潔能源是新冠疫情後最具成本效益的投資之一 

摘錄自2020年6月11日聯合國新聞報導

聯合國環境署在6月10日發布的《2020年全球可再生能源投資趨勢》顯示,新型冠狀病毒對化石燃料行業造成嚴重衝擊。而可再生能源比以往更具成本效益,為各國在經濟復甦中優先考慮清潔能源提供機會,使世界更接近實現《巴黎協定》的目標。

報告顯示可再生能源裝機成本創新低,意味著未來,可再生能源領域的投資將實現更高的產能。得益於技術進步、規模經濟和激烈競爭,風能和太陽能的成本不斷下降。2019年下半年,新建太陽能發電廠的電力成本比10年前降低了83%。

環境署執行主任安德森(Inger Andersen)表示,利用可再生能源價格不斷下跌的優勢,將清潔能源置於後疫情時代經濟復甦方案的核心,是應對全球疫情的最佳保險政策。

能源議題
能源轉型
國際新聞
美國
清潔能源
聯合國
可再生能源發電
巴黎協定

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

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

※回頭車貨運收費標準

【Spring註解驅動開發】使用@Lazy註解實現懶加載

寫在前面

Spring在啟動時,默認會將單實例bean進行實例化,並加載到Spring容器中。也就是說,單實例bean默認在Spring容器啟動的時候創建對象,並將對象加載到Spring容器中。如果我們需要對某個bean進行延遲加載,我們該如何處理呢?此時,就需要使用到@Lazy註解了。

項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

懶加載

懶加載就是Spring容器啟動的時候,先不創建對象,在第一次使用(獲取)bean的時候,創建並使用對象,大家是不是想到了在【設計模式】專題中的單例模式呢?對單例模式不太了解的同學可以猛戳《淺談JAVA設計模式之——單例模式(Singleton)》,也可以查看《設計模式匯總——你需要掌握的23種設計模式都在這兒了!》來系統學習每種設計模式。

非懶加載模式

此時,我們將PersonConfig2類的配置修改成單實例bean,如下所示。

package io.mykit.spring.plugins.register.config;

import io.mykit.spring.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author binghe
 * @version 1.0.0
 * @description 測試@Scope註解設置的作用域
 */
@Configuration
public class PersonConfig2 {
    @Bean("person")
    public Person person(){
        System.out.println("給容器中添加Person....");
        return new Person("binghe002", 18);
    }
}

接下來,在SpringBeanTest類中創建testAnnotationConfig5()方法,如下所示。

@Test
public void testAnnotationConfig5(){
    ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class);
    System.out.println("IOC容器創建完成");
}

運行SpringBeanTest類中的testAnnotationConfig5()方法,輸出的結果信息如下所示。

給容器中添加Person....
IOC容器創建完成

可以看到,單實例bean在Spring容器啟動的時候就會被創建,並加載到Spring容器中。

懶加載模式

我們在PersonConfig2的person()方法上加上@Lazy註解將Person對象設置為懶加載,如下所示。

package io.mykit.spring.plugins.register.config;

import io.mykit.spring.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

/**
 * @author binghe
 * @version 1.0.0
 * @description 測試@Scope註解設置的作用域
 */
@Configuration
public class PersonConfig2 {

    @Lazy
    @Bean("person")
    public Person person(){
        System.out.println("給容器中添加Person....");
        return new Person("binghe002", 18);
    }
}

此時,我們再次運行SpringBeanTest類中的testAnnotationConfig5()方法,輸出的結果信息如下所示。

IOC容器創建完成

可以看到,此時,只是打印出了“IOC容器創建完成”,說明此時,只創建了IOC容器,並沒有創建bean對象。

那麼,加上@Lazy註解后,bean是何時創建的呢?我們在SpringBeanTest類中的testAnnotationConfig5()方法中獲取下person對象,如下所示。

@Test
public void testAnnotationConfig5(){
    ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class);
    System.out.println("IOC容器創建完成");
    Person person = (Person) context.getBean("person");
}

此時,我們再次運行SpringBeanTest類中的testAnnotationConfig5()方法,輸出的結果信息如下所示。

IOC容器創建完成
給容器中添加Person....

說明,我們在獲取bean的時候,創建了bean對象並加載到Spring容器中。

那麼,問題又來了,只是第一次獲取bean的時候創建bean對象嗎?多次獲取會不會創建多個bean對象呢?我們再來完善下測試用例,在在SpringBeanTest類中的testAnnotationConfig5()方法中,再次獲取person對象,並比較兩次獲取的person對象是否相等,如下所示。

IOC容器創建完成
給容器中添加Person....
true

從輸出結果中,可以看出使用@Lazy註解標註后,單實例bean對象只是在第一次從Spring容器中獲取對象時創建,以後每次獲取bean對象時,直接返回創建好的對象。

總結

懶加載,也稱延時加載。僅對單例bean生效。單例bean是在Spring容器啟動的時候加載的,添加@Lazy註解后就會延遲加載,在Spring容器啟動的時候並不會加載,而是在第一次使用此bean的時候才會加載,但當你多次獲取bean的時候不會重複加載,只是在第一次獲取的時候會加載,這不是延遲加載的特性,而是單例Bean的特性。

好了,咱們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一起學習一起進步!!

項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

寫在最後

如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Spring註解驅動開發。公眾號回復“spring註解”關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發不再迷茫。

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

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

※回頭車貨運收費標準

Zookeeper實現服務註冊/發現

what that?

Zookeeper在分佈式開發中使用頻繁,但許多框架都對其進行了封裝,初學者可能無法較好的理解其工作原理,該文章演示了使用Zookeeper實現服務註冊,服務發現的簡單demo,希望能達到拋磚引玉的效果;

why need RegisterCenter?

之所以需要訪問註冊和服務發現是因為分佈式系統中,服務之間需要相互調用,但若每個服務自己維護一份依賴的服務信息的話,就顯得很麻煩,且自身維護的數據無法保證其實時性,當依賴的服務信息發生變更時,無法及時獲取更新,解決方案就是引入一個註冊中心,服務提供方將自己的信息寫入到註冊中心,服務使用方從註冊中心來獲取服務信息; 如下圖:

client表示服務使用方,server表示服務提供方

實現的效果: 客戶端可自動發現服務信息,當服務狀態發生變化時(上線,下線,更換地址),客戶端可以及時響應變化,效果如下圖:

效果演示

實現

  1. 首先保證Zookeeper以安裝啟動,且可以正常訪問

  2. 創建Maven項目並添加Zookeeper的Java客戶端依賴(注意版本號需>3.6)

    				<dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.6.1</version>
            </dependency>
    
  3. 編寫服務提供方

    package com.jerry;
    
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.KeeperException;
    import org.apache.zookeeper.ZooDefs;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.data.ACL;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.*;
    import java.nio.charset.StandardCharsets;
    import java.util.ArrayList;
    import java.util.Enumeration;
    
    import static java.net.InetAddress.getLocalHost;
    
    public class UserService {
    
        public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
            new UserService().serving();
        }
    
        public void serving() throws IOException, KeeperException, InterruptedException {
            //獲取本機ip地址
            String ip = null;
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) networkInterfaces.nextElement();
                Enumeration<InetAddress> nias = ni.getInetAddresses();
                while (nias.hasMoreElements()) {
                    InetAddress ia = (InetAddress) nias.nextElement();
                    if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
                        ip = ia.getHostAddress();
                    }
                }
            }
            int port = 8988;
    
            //啟動服務
            ServerSocket socket = new ServerSocket(port);
            System.out.println("服務器已啟動...");
            //註冊服務
            serverRegister(ip, port);
            //處理請求
            clientHandler(socket);
        }
    
        private void clientHandler(ServerSocket socket) throws IOException {
            while (true) {
                Socket accept = socket.accept();
                InputStream inputStream = accept.getInputStream();
                byte[] barr = new byte[1024];
                while (true) {
                    int size = inputStream.read(barr);
                    if (size == -1) {
                        //System.out.println("客戶端已關閉..");
                        accept.close();
                        break;
                    }
                    String s = new String(barr, 0, size);
                    //輸出客戶端消息
                    System.out.println(accept.getInetAddress().getHostAddress() + ": " + s);
                }
            }
    
        }
    
        private void serverRegister(String ip, int port) throws IOException, KeeperException, InterruptedException {
            //註冊服務
            ZooKeeper zooKeeper = new ZooKeeper("10.211.55.4: 2181",3000, null);
            try {
                ArrayList<ACL> acl = new ArrayList<>();
                acl.add(new ACL(31, ZooDefs.Ids.ANYONE_ID_UNSAFE));
                zooKeeper.create("/userServer", (ip + ":" + port).getBytes(StandardCharsets.UTF_8), acl, CreateMode.EPHEMERAL);
                System.out.println("服務發布成功!");
            } catch (KeeperException | InterruptedException e) {
                e.printStackTrace();
                throw e;
            }
        }
    }
    
  4. 編寫服務服務使用方

    package com.yyh;
    
    import org.apache.zookeeper.*;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class UserClient implements Watcher {
        String node = "/userServer"; //服務信息所在的節點 服務提供方和服務消費方一致
        private ZooKeeper zooKeeper;
        String server_ip;
        int server_port;
    
        public static void main(String[] args) throws Exception {
            //開始服務監聽
            UserClient userClient = new UserClient();
            userClient.run();
            //當訪問可用時與服務交互
            Scanner scanner = new Scanner(System.in);
            while (true){
                System.out.println("輸入要發送的信息(e:退出)");
                String text = scanner.next();
                if (text.equals("e"))System.exit(-1);
                if (userClient.server_ip == null){
                    System.err.println("沒有可用的服務...");
                }else {
                    userClient.sendToServer(text);
                }
            }
        }
        
        private void run() throws Exception {
            //連接zookeeper
            zooKeeper = new ZooKeeper("10.211.55.4:2181", 3000, null);
            //嘗試獲取服務信息
            getServerInfo();
            //添加對服務信息的永久監聽
            zooKeeper.addWatch(node,this,AddWatchMode.PERSISTENT);
        }
    
        //獲取服務信息
        private void getServerInfo()  {
            try {
                byte[] data = zooKeeper.getData(node, false, null);
                String[] infos = new String(data).split(":");
                server_ip = infos[0];
                server_port = Integer.parseInt(infos[1]);
                System.out.println("獲取服務信息成功!");
                System.out.println(server_ip+":"+ server_port);
            } catch (KeeperException e) {
                System.err.println("服務信息不存在! 等待服務上線........");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        //當節點狀態發送變化時將執行該方法(通知處理)
        @Override
        public void process(WatchedEvent event) {
            if (event.getPath().equals(node)) {
                //根據具體邏輯處理不同的事件類型,此處只關心節點的創建刪除和更新
                if (event.getType() == Event.EventType.NodeCreated) {
                    System.err.println("服務上線了");
                    getServerInfo();
                } else if (event.getType() == Event.EventType.NodeDataChanged) {
                    System.err.println("服務更新了");
                    getServerInfo();
                }else if (event.getType()== Event.EventType.NodeDeleted){
                    server_ip = null;
                    server_port = 0;
                    System.err.println("服務下線了");
                }
            }
        }
    
        public void sendToServer(String text) {
            InetSocketAddress server_address = new InetSocketAddress(server_ip, server_port);
            Socket socket = new Socket();
            try {
                socket.connect(server_address);
                //System.out.println("連接服務器成功!");
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write(text.getBytes());
                System.out.println("消息發送成功!");
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
  5. 打包服務端代碼,該步驟可忽略,僅為了測試客戶端正確性, 為了在打包時附帶其全部依賴,此處藉助Spring的打包插件,在pom中添加以下內容:

    		<build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>1.5.6.RELEASE</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    注意:Spring-boot打包插件會自動獲取項目中的主函數,必須保證主函數只有一個,所以需要暫時註釋客戶端的主函數,最後執行maven的package,得到jar包

  6. 將jar上傳至虛擬機並運行

    java -jar ZookeeperTest-1.0-SNAPSHOT.jar
    

    若沒有其他問題則客戶端依然可以正常連接服務器發送消息;

以上便是使用Zookeeper實現服務註冊和服務發現的具體步驟,在實際開發中,我們可能還會將提供的服務部署為集群,這時可將集群中的各個服務信息作為子節點註冊到指定節點下,客戶端監聽該節點變化,獲取子節點列表從而獲取到服務列表,還可以在此基礎上加上負載均衡算法實現對服務列表的合理訪問; 如圖:

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

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!