Nginx 在運維領域中的應用,看這一篇就夠了

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/09/09ea3bdf0ba03915dcbc09f577f32f59.webp","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"關於 Nginx"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Nginx 已誕生十餘年,其作爲一款開源的 Web 服務器軟件,因其具有性能穩定、高併發、低內存耗用、高性能的處理能力等特點,被廣泛應用到國內外各互聯網廠商的實際生產架構中。其主要有如下場景應用:"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Web 服務應用,可實現靜態資源、PHP、Python 等網站的架設"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代理負載服務,支持 TCP/UDP、HTTP、HTTP/2、gRPC、FastCGI、SCGI、uWSGI 等協議的轉發處理,並實現了相應通信協議的請求解析、長連接、代理轉發、負載均衡、會話保持等互聯網架構中常見的應用功能"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"緩存應用,基於其代理功能,實現正向或反向代理緩存功能"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"API 網關應用,其提供了包括身份認證、路由轉發、更基於支持 Lua 語言腳本模塊擴展的可編程能力,使其可用於各種複雜環境的路由處理"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Nginx 基於事件驅動架構,具有可支持數百萬級別併發請求的處理能力,其通常被用於技術架構中的訪問入口。近幾年雲計算、微服務、服務中臺等架構及 DevOps 標準的快速發展,統一入口、智能路由、有效解耦、基礎設施拆分等架構需求更使得 Nginx 被廣泛應用其中。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Nginx 在 DevOps 中的應用"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"DevOps 已成爲當前最流行的研發管理標準,其倡導的雲計算、微服務曾被無數運維從業者視爲洪水猛獸,認爲是取代了運維的工作。然而當我們真正的理解雲計算及微服務的架構時,也應深刻的認識到,這不是搶飯碗而是主動投餵。DevOps 標準也正在驅動我們運維工作者能更深入的參與到開發架構中,並與研發達成交織共存的狀態。在我看來,這個紐帶就是 Nginx。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1、業務架構中的應用"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"互聯網產品的開發過程,都是先做一個當前需求的版本,然後再根據不斷變更的需求,添加新的功能。這是非常符合現實的邏輯,但隨着技術的迭代及業務需求的增加,也會給我們的工作帶來諸多的挑戰。比如,在某一功能比較少的時候,會由一個項目組去開發,由於業務的不斷的發展,就會逐漸擴大到一個部門或事業部的人去共同協作開發。此時,原有的單體服務,就會面臨因業務部門調整或業務產品的變化而進行拆分。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2015年我就遇到過這樣的問題,商戶服務曾是一個團隊開發的,但由於業務部門拆分,就提出了部分分類商戶獨立開發的需求,如果拆分由開發完成,則會面臨技術架構、技術棧遷移、業務開發成本增加等多方面的問題。基於實施的便捷性,所以我們運維就提供了一個基於 Nginx 實現動態路由的平滑拆分方案。訪問架構如下所示:"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c3/c308ce12545d3b65ceda84802c362a4f.jpeg","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"該服務的URL只有域名和商戶標識碼(http://www.xxxxx.com/shop/111xxxxx),根據這個特點,我們設計了一個由 Nginx + Lua + Redis 構成的動態路由架構, 由 Nginx 做入口動態路由。爲避免阻塞,所以我們本着最少路由判斷邏輯的原則,將所有的商戶標識碼都以 Key 的形式存儲在 Redis,每個 key 對應的 value 則是相應的被代理服務器組標識,當用戶的訪問進入 Nginx 後,由 lua 腳本快速的從 redis 中讀取到對應的標識,並將用戶的訪問,路由到對應標識的被代理服務器組中。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"開發同事開發了一個商戶代碼管理小工具,可以實現商戶標識碼的動態管理。這樣我們就用很短的時間,將單一商戶服務的代碼按照業務的維度拆分成了商戶、酒店、旅遊、電影等多個服務,開發可以先將代碼複製多套,再根據各自開發的進度進行逐商戶或整體的進行替換。該方案在很短的時間內實現了服務拆分工作的實施,併爲開發團隊爲日後商戶服務的開發提供了更多的可能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"總之,無論是 Open API 、微服務亦或是中臺架構,Nginx 總可以通過其強大的功能,爲開發減負並實現架構變化的平滑過渡。通過 Nginx 做路由及數據處理可以靈活的解決開發架構多變的問題,並以不變應萬變的能力,滿足不同階段開發架構的需求。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2、應急保障中的應用"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在運維保障工作中,RTO(Recovery Time Objective,恢復時間目標)和 RPO(Recovery Point Objective,恢復點目標)是衡量運維保障工作的一個重要指標。RTO 指的是從業務故障發生到整個業務系統恢復所需的最大時長。而 RPO 則是指可能丟失數據的最大時長。這兩個指標,都對運維架構的災備、應急切換能力提出了嚴峻的挑戰。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"目前流行的做法是多活架構,但在實際實施中,多活架構投入成本高、實施週期長、對已有的技術架構變更的難度較大,且後期投入的維護工作也非常巨大。此時可以利用Nginx 設計一個動態降級的方案,對小規模且開發架構技術能力較低時期的應急保障工作起到有效的補充。該方案整體投入小,即可以快速實施落地,又可以在發生故障時實快速切換,並記錄故障期間的用戶變更數據的請求,最大化的避免數據的丟失。方案設計如下:"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/1a/1adc894c742e638f7cd66a2f67e6489c.jpeg","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所有的靜態資源交由 CDN 廠商提供訪問服務"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"降級集羣異地機房部署"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正常訪問時,Nginx 負載實時同步 GET 請求及響應結果到降級集羣,降級集羣的Nginx 將同步的數據處理後,存儲到 Redis 集羣中"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當業務服務發生故障時,按照故障情況通過 DNS 或 Nginx 負載將用戶訪問切換到降級集羣中"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"業務服務恢復後,通過 Nginx 負載逐步將用戶訪問切回"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過專用工具,將記錄的 POST 數據中變更的數據恢復到數據庫中"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"該方案只是個探討模型,在實際實施中仍有諸多問題需要去考慮,例如:"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"GET 方法的 URL 最小取值,以避免重複數據佔用更多的存儲空間"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"登錄用戶的處理及 GET 方法請求的個性化問題"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"POST 方法數據與用戶身份的綁定"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"POST 記錄數據的恢復準確性設計"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"訪問切換的監控"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"前端用戶的提示信息"}]}]}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3、運維的數據化運營"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Nginx 通常被置於服務器訪問的入口,其訪問日誌可以全局的記錄用戶訪問的來源、響應時間、行爲熱點等數據,通過對訪問日誌的分析,可以清晰的瞭解用戶來源、行爲習慣及自身服務器性能等情況。藉助 ELK 的高性能處理能力,可以實時的將數據分析結果展現給服務器的維護人員及應用的開發人員,進而不斷提高業務的可用性及產品的用戶體驗。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對 Nginx 的日誌可以從安全、性能、可用性及訪問統計4個方面進行分類處理。安全方面的可以即時記錄訪問者IP,根據現階段的實際情況進行人工或自動的屏蔽。性能方面可以結合基礎資源監控分析原因並作出提前預判。可用性中若是業務設計方面的則可及時反饋給產品,以做出更友好的提示信息。訪問統計方面的則可提供給相應的部門,進行進一步分析處理。運維的工作不僅是響應外部的需求,通過 Nginx 提供的強大功能,也可以主動的參與到企業的數據化運營工作中。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"4、微服務中的 Nginx"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"微服務是 DevOps 水平的一個重要標誌,微服務架構中的服務網格(Service Mesh)及serverless 的架構設計,其最大的理念就是將可複用的、基礎的非業務功能從業務開發中剝離出來,例如服務發現、端到端認證、訪問追蹤、組件依賴等功能。在向服務網格遷移的過程中,Nginx 更是起到了重要的作用。"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"路由網格架構 ,這個架構是向服務網格過渡的初級架構,其無需對原有的單體應用和新的微服務應用做什麼改造,可以很輕易的遷移進來,併爲更復雜的改造積累經驗。"}]}]}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/52/523f9e80ebfc839a7408669232ea86cb.jpeg","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Sidecar 代理/Fabric 模型,該模型應用程序和代理被被放在了POD裏,可以對應用程序的流量做更細粒度的控制。在該階段可以自己開發控制平面,也可以選擇直接切換到istio平臺。"}]}]}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/23/23046912d6b03430fe77c65e4aa66df3.jpeg","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"寫在最後"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2019年初,電影《流浪地球》讓我們看到了中國科幻電影的希望,但導演郭帆則反覆強調,“我們工業化不足的時候就是靠人肉填的,中國電影工業化還是處在一個非常早期的階段”。這不禁讓我想到了我從業的互聯網行業,我們其實也一直是在一個非工業化環境中勞作着。工業化,自然是由自動化的“機器體系”來取代人肉的“手工勞動”,其生產過程中的每個階段都必然是標準化、流程化的。當我看到由中國信息通信研究院牽頭,聯合雲計算開源產業聯盟、高效運維社區及國內多個互聯網大廠編寫的 DevOps 標準-研發運營一體化能力成熟度模型,並正式立項國際標準時,不禁尤感自豪,也深深對爲推動我國互聯網行業工業化進程努力的精英們深表敬佩。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲互聯網從業人員,也深刻認識到用好開源技術、推動工作內容標準化、流程化也是我們在互聯網行業工業化進程中應盡的一份責任。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"關於作者"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"王小東 ,資深運維專家,有十餘年的互聯網企業運維和架構經驗,擅長服務器優化、大規模集羣管理、開源工具應用和業務故障處理等。EXIN 認證 DevOps Master,專注於運維架構優化、自動化運維以及運維工作的 DevOps 治理。著有《Nginx應用與運維實戰》一書。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"《Nginx應用與運維實戰》"},{"type":"text","text":"是一部基於 Nginx 新版本和雲原生應用場景系統講解Nginx的著作,是作者十餘年運維經驗的總結。從應用、運維以及與 Kubernetes 和微服務集成3個維度對 Nginx 的基礎知識、工作原理、核心應用、運維管理、集成擴展等重點內容進行了全面、細緻的講解。完全以實戰爲導向,包含大量的配置案例和示例代碼,能幫助讀者快速掌握並在實際工作中熟練應用 Nginx。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f2/f2133ac42aebb3cb3c5c13be5449a9b2.jpeg","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7a/7a82fc0efe4cb4c547ef5e5bfdcaa129.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"更多精彩回顧"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"書訊 |"},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650299929&idx=1&sn=38dc89b3e68e48c11820100645a81e30&chksm=bec2290e89b5a018185d02e0fddabe16c9828ab9120042ed96292891661957557393b4b8c896&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"10月書訊(下)| 雙節同慶,讀書正當時"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"書訊 |"},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650299669&idx=1&sn=964ad43c7e5141030af6cbf433dbc2ea&chksm=bec22a0289b5a314af9959de088d2228a6fb11aa4370c280014a3759b3bea0aef02313900221&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"10月書訊(上)| 雙節同慶,讀書正當時"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"資訊 |"},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650300080&idx=1&sn=2437f1e2ca3cb5dedb255682f223f815&chksm=bec229a789b5a0b1355dc403ec3545e0347207667b5ca949b395dd4b16262be5b3b828554ef6&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"TIOBE 10 月編程語言排行榜出爐:C語言居首,Python將超Java?"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"上新 | "},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650299958&idx=2&sn=6bf1ba6052b6bfbaace27e78ea07561f&chksm=bec2292189b5a0377d1f64719ed9aaa37ce8d49ea1dbf4b2fa96b4355ea10374e83c60398195&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"百度官方出品 | 全面解讀PaddlePaddle,零基礎快速入門深度學習"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"書單 | "},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650297742&idx=1&sn=ffb72f06303a292489491c051238409f&chksm=bec2229989b5ab8f439da6aa046910de24a2376b0670e984a1a7848de2cf808f7ff9dd8c2148&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"開學季——計算機專業學生必讀的10本暢銷經典"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"乾貨 | "},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650299999&idx=1&sn=fb713871e7eea2323c53f08b7a987aa1&chksm=bec2294889b5a05e22d1e0bb4842494a299b73499d0d9eff2f1cceed93df158dc10371b855f7&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"數據分析必讀乾貨:簡單而實用的3大分析方法"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"收藏 | "},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650299958&idx=1&sn=16ea26cd41c7091d60b61e59f7c00342&chksm=bec2292189b5a0376708c379ead26dd3ffe44599790341d1fd90ac12d69fb0b42dfbd6b7989f&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"(萬字長文)Spring的核心知識盡攬其中"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"視頻 | "},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650298503&idx=2&sn=249426637c6aa56c6c4d030ac7b65314&chksm=bec22f9089b5a686bf023595f82cd77d00046117a86769ad5c2adac1f986d3c4900d8f328a64&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"大佬出鏡推薦不可不讀系列——程序員陳彼得"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"贈書 |"},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650299956&idx=2&sn=e4e70db6a9bf7fd70d661c93b2ffd951&chksm=bec2292389b5a035af91a0051c9c2069cfef4a53117b15f08ae734aab1c69771245bc2508ab1&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"【第25期】國資委發文!10本書講透數字化時代新機遇"}],"marks":[{"type":"underline"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7a/7a82fc0efe4cb4c547ef5e5bfdcaa129.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7a/7a82fc0efe4cb4c547ef5e5bfdcaa129.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"點擊"},{"type":"text","marks":[{"type":"strong"}],"text":"閱讀全文"},{"type":"text","text":"購買"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/s?__biz=MjM5ODE2NzE2MA==&mid=2650300188&idx=1&sn=c1a180a6ade2745b84c82e7f6b5f2e30&chksm=bec2280b89b5a11d701fc258cc598d4672655a537d9639ea437391f7239b3b13341cab6bab88&mpshare=1&scene=1&srcid=1021puDRpgrythS8wbsCM20m&sharer_sharetime=1603285774842&sharer_shareid=76796d0d46264f1ad5dfb57344f04d0d&key=768e34537e4fc40e4ef8cc2b1f8f184306ddf636f398eeec35ef87e7ba8ebd342a2b99a51274ef98b1288e139feb213f9b5fb06536426c6302cd819c9406b58ada8d16080424f75150ea3d1f7dce074aa6ec327c32cf0df5f6dc446f25996a260191bbd03080b5a5bfec3404992839b14d647e559fbabd5fd501034f1830e15f&ascene=1&uin=MTQ1MjgzMTAyNg%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=A6DxMP97PyJDaMTPoqiDWRk%3D&pass_ticket=DyFJ04meFXSfNK3iED55ac%2BUCeZS8MQn8YEV1VGBUus1e88xSuVY4bdKq%2BKtpDcK&wx_header=0&fontgear=2##","title":null},"content":[{"type":"text","text":"閱讀原文"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"閱讀 250"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"贊3在看2"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b8/b89a018cc38a5498a61871764e64a291.jpeg","alt":"","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"寫下你的留言"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章