Java微服務開發指南 -- 下一步該了解什麼?
下一步該了解什麼?
我們在這本小冊子裏麵介紹了非常多的知識,但是它遠遠不夠涵蓋一切!我們需要知道,這隻是冰山一角,有非常多的微服務所涉及到的領域在本書中沒有探討。在最後這個章節,我們將會簡要的介紹一些你必須了解的概念,並將這些聯係留給讀者進行深入研究。
配置
配置(Configuration)是分布式係統中非常重要的部分,而在微服務架構中變得愈發重要和困難。我們需要在配置和不可變遞交(Immutable delivery)之間尋求平衡,因為我們不希望出現服務的碎片化。例如:我們需要能夠改變日誌級別,在A/B測試上切換特性,配置數據庫連接或者使用秘鑰或者密碼,我們回顧之前介紹的三個Java微服務框架,但是每個框架的配置方式略微不同,那麼在非Java環境下的微服務配置方式又會變成什麼樣子呢?
如果以配置的形式存在,不同的需求就會在一樣的代碼基礎上,生成不同的鏡像,這就是碎片化的開始
為了能夠在容器中,技術無關的進行配置管理,我們需要采用技術無關的方式在容器中進行配置。在Docker環境中,我們能夠通過注入環境變量的方式來進行配置,Kubernetes更是推薦我們這樣進行配置。Kubernetes也提供了相應的APIs,將Secrets
注入到容器中,而在Secrets
中可以放置用戶名、密碼以及私有秘鑰等諸多配置內容。Kubernetes在最近也添加了ConfigMaps
(類似Secrets
),它被用來完成應用級別的配置,在解耦Docker鏡像中的配置同時,它可以支持通過環境變量或者文件的方式注入配置。如果一個應用能夠以配置文件或者環境變量的方式消費配置,那就可以使用Kubernetes來完成配置而不需要引入複雜的配置服務和客戶端。在Kubernetes下對微服務的配置,可以做到技術無關,而配置也被作為集群管理的基礎設施。
在kubernetes中,secret對象類型主要目的是 保存一些私密數據,比如密碼,OAuth tokens,ssh keys等信息。將這些信息放在secret對象中 比 直接放在pod或docker image中更安全,也更方便使用
日誌,Metrics和跟蹤
不可置疑,微服務架構也會帶來諸多缺點,尤其是對日誌、Metrics和跟蹤帶來的影響很大,隨著係統被拆分成為一個個獨立的部分,就需要更多的工具投入來支持你看到全局。當你以可伸縮的方式運行服務,特別是在每個組件都有可能失敗的情況下,我們需要收集服務的信息以及服務相關的數據(類似Metrics和跟蹤信息)而不用理會容器是否存活。接下來,介紹一些途徑和方法當你考慮設計日誌,Metrics和跟蹤策略相關的功能:
- 開發人員暴露他們的日誌
- 聚合/中心化
- 搜索與相關性
- 可視化以及圖表
Kubernetes通過插件的方式,允許添加集群級別的日誌和Metrics收集功能。典型的解決方案包括,syslog
、Fluentd
或者Logstash
,它們可以將日誌從服務中拖走,以流的形式投機到中心化的聚合器中。有些人會使用消息中間件的形式來解決日誌收集,目的是提升可用性,這也可以理解。ElasticSearch
是一個非常好的聚合日誌方案,它支持伸縮以及索引,並且你可以在前端架設Kibana
,它能提供良好的儀表盤展示和搜索界麵。除此之外,還有一些Prometheus
、Zipkin
、Grafana
、Hawkular
和Netflix Servo
方案供選擇。
事實上ELK作為實際方案已經運作很長時間了,它們分別是
ElasticSearch
、Logstash
和Kibana
持續遞交(Continuous Delivery)
在第五章中討論過不可變遞交,它對於微服務而言是至關重要的,當我們擁有了大量小的服務後,我們現有的手工流程就無法支撐微服務的構建,換句話說,當每個團隊都能夠運維自己的服務時,我們就需要一個統一的方式來避免出現運維瓶頸以及人肉錯誤。一旦我們采用了微服務架構,我們需要洞悉並了解服務的反饋,隻有這樣才能幫助我們走的更遠。當業務需求改變了,我們通過迭代開發,將需求在係統中進行了實現,我們就會不斷的分步發布係統,事實上,我們需要一套可以運行的軟件交付流程。這個流程是由許多子流程組成的,它們通過交匯點等特定節點連接而成,理想中,我們希望能夠自動的完成構建、測試以及部署。
就像Docker和Kubernetes,提供給開發者內置的工具,使之能夠做到滾動升級、藍綠發布或者canary releases的部署策略。顯然這些工具並不是專門用來做這些工作的(比如:Amazon或者Netflix在Linux容器之前就已經廣泛使用這項技術),但是容器能夠使我們更加容易的做到。你能夠使用持續集成工具,例如:Jenkins以及Jenkins流程,用它以及Kubernetes來連接你的構建和部署流程。可以通過了解fabric8和OpenShift
項目來學習如何將Kubernetes與Jenkins流程集成起來。
總結
本書是一個以實踐為主導,使用流行的Java為服務框架來一步一步構建分布式係統的教程。微服務不是本書討論的唯一技術解決方案,人也是複雜係統中的重要組成部分,需要使人時刻保持伸縮以及敏捷,在係統發展的同時,也要考慮組織結構的調整。
在介紹了使用Java框架來構建微服務後,我們需要構建、部署和管理它們。使用現有的技術來進行微服務的伸縮性維護非常困難,因此我們使用類似Docker和Kubernetes來幫助我們進行構建和部署,並使用類似不可變遞交的最佳實踐。
當我們開始通過Docker和Kubernetes來構建、部署微服務,我們可以使用本地環境來完成這些工作,為此我們使用了RedHat Container Development Kit
以及運行在上麵的RedHat OpenShift
來完成部署工作。
譯者將其改造為Kubernetes的本地版,minikube
最後我們接觸了一點重要的基本概念,例如:配置、日誌、Metrics和持續遞交,但是我們沒有觸及注入:安全、自服務等其他數不清的話題,但是並不代表著它們不屬於微服務的範疇。
我們希望這本書對你有用。
關於作者
Christian Posta 是RedHat的架構師和中間件專家,他是一名作家、博主和演講家。他作為Apache ActiveMQ
、Apache Camel
、Fabric8
以及相當多項目的committer。他花費了大量的時間再可伸縮web應用以及幫助企業創建大規模分布式係統,而這些在現在被稱作微服務。他熱愛分享和指導,並指導團隊通過分布式原理、微服務、devops以及cloud-native來獲得項目的成功。閑暇時刻,他會和他的妻子Jackie以及兩個女兒Madelyn和Claire來渡過美好時光。
關於譯者
魏鵬,阿裏巴巴集團技術專家。2009年碩士研究生畢業加入阿裏巴巴中國網站技術部,曾擔任中國網站交易平台架構師,主導了交易係統服務化工作,設計實現的數據遷移係統高效的完成了阿裏巴巴中國網站交易數據到阿裏巴巴集團的遷移工作。目前在阿裏巴巴中間件技術部的應用容器與服務框架組從事Java應用容器Pandora和服務框架HSF的相關工作,其中Java應用容器Pandora是阿裏巴巴中間件運行的基礎,而服務框架HSF則是阿裏巴巴集團實現服務化的主要解決方案,二者在阿裏巴巴擁有最為廣泛的使用量。個人平時喜歡閱讀技術書籍,與同事合著了《Java並發編程的藝術》一書,並翻譯一些國外優秀文檔,愛總結,喜分享,對Java應用容器、多線程編程以及分布式係統感興趣,深知“路漫漫其修遠兮,吾將上下而求索”,希望能夠和大家多多交流共同進步。
最後更新:2017-11-03 15:05:17