⑴ AFNetworking源碼——基本架構
從上圖可以發現,AFNetwoking框架是一個比較簡潔的框架,主要分為了幾個部分
在這幾個模塊中,AFNetworking的核心模塊是通信模塊,在通信模塊中有兩個類,AFHTTPSessionManager和AFURLSessionManager,其中前者繼承於後者,是對HTTP的專一化封裝處雀斗理。大家都知道AFNetworking 3.0其實只是對NSURLSession做了封裝處理,那接下來,就從源碼角度來解釋這個事情,在這之前我們先來看看使用NSURLSession和使用AFNetworking做網路請求在實現過程中有什麼區別
可以發現使用AFHTTPSessionManager進行網路請求大致分為了兩步:
從調頃臘磨用上來看,AFNetworking的請求會更加易讀和編寫,接下來我們就看看這兩部分在框架中是如何實現的
在方法列表中,大致分為兩部分,第一部分是初始化方法
manager這個類初始化方法是很常用的,我們去看它的實現,發現它也是調用了自己的對象初始化方法
那我們就先來研究一下第一個部分,初始化AFHTTPSessionManager的內部實現,我們首先來看看,初始化方法的函數調用棧
從上面的函數調用棧可以發現,AFNetworking的內部實現局首到棧底仍然是操作了原生的NSURLSession,從根本上只是對原生的NSURLSession做了封裝操作,封裝了一些序列化、通信安全等策略,提供簡潔的API,方便用戶編碼。
了解了初始化之後,我們再來看看發送請求的內部實現,在這里就用
GET:parameters:process:success:failure: 方法作為例子來查看一下源碼實現
⑵ 不懂源碼、NDK、架構設計,只會寫業務代碼,真的會被淘汰嗎
做安卓的吧
你要是普通開發不需要用到,如果要開發圖像處理,人臉識別等app,還是脫不掉的。至於架構,安卓裡面的架構相比java後端范圍小了很多。源碼當然要看看,能學到很多設計思想和底層實現原理。學了會更有競爭力,不學的話也能開發,但是年紀一大就完蛋了。
⑶ 7. PhxPaxos源碼分析之整體架構
目錄
1. PhxPaxos源碼分析之關於PhxPaxos
2. PhxPaxos分析之網路基礎部件
3. PhxPaxos源碼分析之Proposer、Acceptor
4. PhxPaxos源碼分析之Learner
5. PhxPaxos源碼分析之狀態機
6. PhxPaxos源碼分析之歸檔機制
7. PhxPaxos源碼分析之整體架構
前面幾章我們依次介紹了網路基礎部件、paxos三個核心角色(ProposerAcceptorLearner)、狀態機、Checkpoint機制。在PhxPaxos中,Instance對象將上述角色組合到差讓一起。多節點上Instance互相通信共同構成了一個paxos集群,有序的確定多個值。架構關系圖如下:
Instance的實現類大約有900行,主要做了一些和網路數據處理相關的邏輯,這部分並不復雜。這里我想談的是Instance初始化邏輯。
Instance的初始化在進程啟動時,進程有可能時首次啟動,也可能是異常退出後的重啟。重啟要將Instance恢復到啟動前的狀態,需要把磁碟中的數據恢復到內存中。對於PhxPaxos來說,磁碟中的數據主要集中在Acceptor、CheckpointMgr中。這里先讀取Acceptor中的數據叢慶姿,隨後讀取CheckpointMgr中的數據,並將Acceptor中未體現在CheckpointMgr中的數據進行重演。最終,將paxos的instance恢復到啟動前的狀態:
隨後將當前的instance id標記為Max Chosen Instance ID。
嚴格講llNowInstanceID不一定是Max Chosen Instance ID。因為Acceptor落盤的最後一條記錄可能是尚未選中(Chosen)的「半成品」,即提案尚未完成。所以,這里將llNowInstanceID做為Max Chosen Instance ID是不準確的。只不過當前Max Chosen Instance ID僅在確定需要保留的paxos log數量時使用,而且最小的paxos log保留數量為300,因此並沒有出什麼問題。
Instance之上是Group,每個Group包含一個Instance,Group負責Instance初始化:
Group的價值在於概念抽象,不同節點的Instance的運行狀態可能不同,即Instance ID不同,但這些Instnace仍舊屬於一個Group。另外,PhxPaxos允許同時存在多個Group,每個Group下運行多個Instance(和節點個數相同)。如果不抽象Group概念,本Group內的Instance和Group間的Instance容易產生混淆。
既然允許運行多個Group,我們需要一個Group Manager,在PhxPaxos中這個角色是Node抽象類。Node是整個PhxPaxos庫對外提供的服務類,應用通過Node :: RunNode啟動本節點的PhxPaxos服務。
至此,PhxPaxos的整體架構已經滲絕浮現:
PhxPaxos中的節點除了做為Paxos協議的參與者,還運行另外一類成為follower的節點。Follower指定一個運行Paxos協議的節點用於數據同步,它節點不參與Paxos協議,也不參與Paxos選主。Follower更像傳統意義上的同步備,當Paxos協議節點確定一個值後,將數據同步到Follower節點。但有一點不同的是:Follower節點運行Learner,當某個值缺失時,可以通過Learner主動發起AskForLearn習得。
到這里,PhxPaxos源碼分析就結束了。
整體上看,微信開源的PhxPaxos無論從架構設計、編碼質量、細節優化上絕對可以配得上「生產級」這個稱號(編碼質量尤其值得稱贊)。
更多PhxPaxos相關文章請參見官方 WIKI 。
⑷ 微服務架構 | *3.5 Nacos 服務注冊與發現的源碼分析
參考資料 :
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服務原理與實戰》
《B站 尚矽谷 SpringCloud 框架開發教程 周陽》
為方便理解與表達,這里把 Nacos 控制台和 Nacos 注冊中心稱為 Nacos 伺服器(就是 web 界面那個),我們編寫的業務服務稱為 Nacso 客戶端;
Nacos 客戶端將自己注冊進 Nacos 伺服器。《1. 服務如何注冊進 Nacos 注冊中心》主要從 Nacos 客戶端角度解釋如何發送信息給 Nacos 伺服器;《2. Nacos 伺服器注冊服務》主要從 Nacos 伺服器角度解釋注冊原理;
《3. 客戶端查詢所有服務實例》將從服務消費者和提供者的角度,解釋服務消費者如何獲取提供者的所有實例。服務消費者和提供者都是 Nacos 的客戶端;
《4. 客戶端監聽 Nacos 伺服器以動態獲取服務實例》從消費者客戶端角度出發監聽 Nacos 伺服器,以動態獲知提供者的變化;
⑸ android架構組件之Lifecycle源碼解析
Lifecycle-Aware是Google官方的生命周期感知組件。同時,在Google推出的Android Jetpack組件中,也將Lifecycle-Aware放在了Architecture類別之中。我們可以利用 android.arch.lifecycle 包提供的類來控制數據、監聽器等的 lifecycle。同時,LiveData和ViewModel的lifecycle也依賴於Lifecycle框架,所以我們有必要去了解一下Lifecycle。
/app/build/intermediates/manifests/full/debug/AndroidManifest.xml,是我們應用在構建完成之後完整生成的AndroidManifest.xml文件。其中,我們可以找到舉喚升Lifecycle-Aware組件在AndroidManifest的定義。
是ContentProvider的子類,利用其onCreate()生命周期方法,處理Lifecycle組件初始化。因此,這是一種隱式初始化的方式。
繼續關注的onCreate()方法,其調用了LifecycleDispatcher的init()方法進行相應初始化。
init()方法其實就是在Application中注冊了一個ActivityLifecycleCallbacks監聽(即DispatcherActivityCallback),用來監聽每個Activity的生命周期變化。
我們再看下DispatcherActivityCallback的onActivityCreated()回調方法,如果Activity是FragmentActivity,則注冊一個FragmentLifecycleCallbacks(即FragmentCallback)用來監聽Activity中Fragment的生命周期。
我們看到FragmentCallback的onFragmentCreated()回調方法中,當Fragment如果實現了LifecycleRegistryOwner,就會為其添加一個DestructionReportFragment,用來監聽Fragment的生命周期。
之後,會在Activity中添加一個ReportFragment,用來監聽Activity生命周期。
如此,利用一個附著在Activity上無UI的Fragment,通過相應的生命周期回調方法,實質上是對Activity生命周期的監聽。
至此,我們知道了Lifecycle組件通過ActivityLifecycleCallbacks、FragmentLifecycleCallbacks及 無UI的Fragment來感知Activity/Fragment的生命周期變化並產生相應的事件。
在上面的分析中,我們只是重點關注了Lifecycle如何感知生命周期,也就是如何監聽Activity/Fragment的生命周期。在相應的回調方法當中,其實都包含了很多生命周期事件分發相關的邏輯。通過相關的源碼分析,我們可以發現最終都會調用到Activity/Fragment的getLifecycle()方法獲取Lifecycle對象,之後再調用Lifecycle對象的handleLifecycleEvent()方法進行事件分發。26.1.0及更高版本Support支持庫中的Activity和Fragment已經實鏈脊現了正老LifecycleOwner介面。
有上述源碼可以,其實getLifecycle() 方法最終返回的都是LifecycleRegistry對象,事件分發最後也都是調用LifecycleRegistry的handleLifecycleEvent()方法。
這些只是分發的邏輯,那麼在事件分發之前,肯定要有事件的注冊,這就得看一下addObserver()方法。
至此,我們可以知道,當lifecycle發生變化時,handleLifecycleEvent
會通過 getStateAfter()方法獲取當前應處的狀態並修改mState值,緊接著遍歷所有 ObserverWithState並調用他們的sync方法來同步且通知LifecycleObserver狀態發生變化。
Lifecycle生命周期事件感知由LifecycleDispatcher(ActivityLifecycleCallbacks, FragmentLifecycleCallbacks, Fragment)完成,並通過 LifecycleRegistry傳遞給 LifecycleObserver。
⑹ Android官方架構組件之LiveData + ViewModel + Room 源碼分析
簡單使用案例:
MainActivity:
MessageViewModel:
其中viewModel.getMessageObserver().observe(this, new Observer() )
中的this即SupportActivity :LifecycleOwner
SupportActivity implements LifecycleOwner
SupportActivity
SupportActivity就是通過getLifecycle()獲取 mLifecycleRegistry來標記當前Activity或Fragment的各種狀態,其中ReportFragment.injectIfNeededIn(this)內部源碼也是與mLifecycleRegistry.markState(Lifecycle.State.CREATED) 類似,狀態的信息記錄在mLifecycleRegistry對象內部。Activity的其他類型的事件如onCreate,onPause等都是通過getLifecycle()獲取 mLifecycleRegistry對象調用mLifecycleRegistry內部方法來改變其狀態的。
Fragment的狀態更加容易看到,FragmentActivity即在Activity的生命周期中獲取
FragmentActivity部分源碼:
通過上面的簡單分析,兩個重要的類即 LifecycleRegistry extends Lifecycle:
下面是Lifecycle抽象類:
回到開始的案例:
LiveData.observe(this, new Observer);
這里我們傳入的Observer和 owner.getLifecycle().addObserver()即 Activity中的Lifecycle 是不同的。
我們上面已經知道Activity中的Lifecycle是與生命周期相關的,通過Lifecycle.addObserver()可以監聽到 Activity的生命周期 然後在LifecycleBoundObserver作出
相應的處理,具體的實現在LifecycleRegistry.addObserver中(Lifecycle實現類),最終會根據事件變化調用 mLifecycleObserver.onStateChanged(owner, event),
LifecycleBoundObserver.onStateChanged -> activeStateChanged -> dispatchingValue -> considerNotify(initiator) -> observer.observer.onChanged((T) mData);
最終調用的是我們傳入的observer。
這樣看來 LiveData<T> 就沒有什麼特殊的了,把它看做一個普通的觀察者模式的管理者即可,比如EventBus。
https://developer.android.com/reference/android/arch/lifecycle/Lifecycle
⑺ Okhttp源碼解讀第一篇——整體架構
OkHttp 是適用於 Android 和 Java 應用程序的高效HTTP客戶端。最早的版本是基於 HttpURLConnection 和 HttpClient 的封裝,之後 Android 6.0 版移除了對 Apache HTTP 客戶端的支持 ,OkHttp 也移除了 HttpClient,然後移除 HttpURLConnection 的底層支持,連接底層到應用全部自己實現,成為業界公認最佳方案,HttpURLConnection 的底層實現也改為了 OkHttp 的實現方式。
優勢:
從 call.enqueue 開始,查看方法實現:
這是一個抽象方友斗數法,所以需要回到 Call call = client.newCall(request) ,查看 newCall 的實現,
那麼真正調用 enqueue 的是 RealCall ,查看 RealCall 里 enqueue 的實現:
callStart() 是一個監聽器,監聽請求的開始,重點在這里: client.dispatcher.enqueue(AsyncCall(responseCallback)) 。點進 dispatcher :
通過注釋,可以知道這是一個使用 ExecutorService 的線程調度器。
可以 Set 的同時執行的最大請求數,默認同時執行64個請求。
每個主機能同時執行的最大請求數,默認是5個。
內部使用一個核心線程數為0、容量無限大、銷旅60秒超時的線程池。
查看 enqueue :
readyAsyncCalls.add(call) 把准備執行但未執行的 AsyncCall 放入隊列,然後記錄主機連接數,最後調用 promoteAndExecute() :
遍歷隊列,挑選符合條件可以被執行的 Call ,把他們放在正在好首執行的隊列,然後調用 asyncCall.executeOn(executorService) 執行:
executorService.execute(this) 這里既然傳入了 this ,那麼這個類肯定實現了 Runnable 介面:
我們查看 AsyncCall 的 run 方法,找出怎麼執行的:
val response = () 這里直接返回的是 Response,說明 里會發起請求和返回,核心也就在這里。
下面看下同步請求的執行:
很簡單,直接調用 () 。
整體架構分析到此,下一篇詳細分析 () 。
⑻ react源碼閱讀- fiber架構探索(一)
React 團隊在 React 的v16版本中重寫了 React 的銀脊毀核心演算法 - reconciliation ,稱為fiber reconciler,簡稱為Fiber。
Fiber 給 React 帶來了更加先進的調和器,它允許渲進程分段進行,也可以再執行的過程中返回主進程執行其他任務,非常的靈活,而這是通過diff演算法,計算部分組件樹的變更,並暫停渲染更新,詢問主進程是否有更高需求的繪制或者更新任務需要執行,也就是任務之間是有優先順序的;這一切的實現是通過引入新的數據結構-fiber對象來實現的,一個組件實例對應一個fiber實例,fiber實例負責管理組件實例的更新,渲染任務及與其他fiber實例的聯系。
Fiber 的主要特點是:
增量渲染用來解決掉幀的問題,渲染任務拆分之後,鋒備每次只做一小段,做完一段就把時間控制權交還給主線程,而不像之前長時間佔用。這種策略叫做cooperative scheling(合作式調度),操作系統的3種任務調度策略之一。
Fiber 是如何和組件聯系的呢?並且如何實現效果的呢?
接下來讓看看Fiber的數據結構,數據結構能在一定程度反映其整體工作架構。
一個fiber就是一個javascript對象,已鍵值對存儲一個關聯組件的對象,包括組件的props屬性,維護的state,最後需要渲野棗染出的內容等。
Fiber對象中有個tag屬性,標記fiber類型,而fiber實例是和組件對應的,所以其類型基本上對應於組件類型,源碼見ReactTypeOfWork模塊:
在調度執行任務的時候會根據不同類型fiber,即fiber.tag值進行不同處理。
FiberRoot對象,主要用來管理組件樹組件的更新進程,同時記錄組件樹掛載的DOM容器相關信息,具體定義見ReactFiberRoot模塊:
參考文章:
⑼ 基於Spring+SpringMVC+Mybatis分布式敏捷開發系統架構(附源碼)
前言
zheng項目不僅僅是一個開發架構,而是努力打造一套從 前端模板 - 基礎框架 - 分布式架構 - 開源項目 - 持續集成 - 自動化部署 - 系統監測 - 無縫升級 的全方位J2EE企業級開發解決方案。
項目介紹
基於Spring+SpringMVC+Mybatis分布式敏捷開發系統架構,提供整套公共微服務服務模塊:內容管理、支付中心、用戶管理(包括第三方)、微信平台、存儲系統、配置中心、日誌分析、任務和通知等,支持服務治理、監控和追蹤,努力為中小型企業打造全方位J2EE企業級開發解決方案。
技術
名稱
官網
技術
名稱
官網
架構圖
模塊依賴
Spring+SpringMVC+Mybatis框架集成公共模塊,包括公共配置、MybatisGenerator擴展插件、通用BaseService、工具類等。
基於bootstrap實現的響應式Material Design風格的通用後台管理系統,zheng項目所有後台系統都是使用該模塊界面作為前端展示。
各個子系統前台thymeleaf模板,前端資源模塊,使用nginx代理,實現動靜分離。
本系統是基於RBAC授權和基於用戶授權的細粒度許可權控制通用平台,並提供單點登錄、會話管理和日誌管理。接入的系統可自由定義組織、角色、許可權、資源等。用戶許可權=所擁有角色許可權合集+用戶加許可權-用戶減許可權,優先順序:用戶減許可權>用戶加許可權>角色許可權
文件存儲系統,提供四種方案:
阿里雲OSS
服務網關,對外暴露統一規范的介面和包裝響應結果,包括各個子系統的交互介面、對外開放介面、開發加密介面、介面文檔等服務,可在該模塊支持驗簽、鑒權、路由、限流、監控、容錯、日誌等功能。示例圖:
API網關
內容管理系統:支持多標簽、多類目、強大評論的內容管理,有基本單頁展示,菜單管理,系統設置等功能。
統一掃碼支付
通用用戶管理系統, 實現最常用的用戶注冊、登錄、資料管理、個人中心、第三方登錄等基本需求,支持擴展二次開發。
微信公眾號管理平台,除實現官網後台自動回復、菜單管理、素材管理、用戶管理、消息群發等基礎功能外,還有二維碼推廣、營銷活動、微網站、會員卡、優惠券等。
微信小程序後台
基於Netty實現SocketIO的實時推送系統。支持命名空間、二進制數據、SSL、ACK等功能。
環境搭建
開發指南
maven編譯安裝zheng/pom.xml文件即可
啟動演示
約定優於配置(convention over configuration),此框架約定了很多編程規范,下面一一列舉:
資料庫模型
拓撲圖
⑽ 微服務架構 | *2.5 Nacos 長輪詢定時機制的源碼分析
參考資料 :
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服務原理與實戰》
《B站 尚矽谷 SpringCloud 框架開發教程 周陽》
為方便理解與表達,這里把 Nacos 控制台和 Nacos 注冊中心稱為 Nacos 伺服器(就是 web 界面那個),我們編寫的業務服務稱為 Nacso 客戶端;
由於篇幅有限,這里將源碼分析分為上下兩篇,其中上篇講獲取配置與事件訂閱機制,下篇講長輪詢定時機制;在 《微服務架構 | 2.2 Alibaba Nacos 的統一配置管理》 中提到一張 Nacos 動態監聽的長輪詢機制原理圖,本篇將圍繞這張圖剖析長輪詢定時機制的原理;
上篇 《微服務架構 | *2.4 Nacos 配置中心的源碼分析(獲取配置與事件訂閱機制)》 中的 1.1 提到,ConfigService 是 Nacos 客戶端提供的用於訪問實現配置中心基本操作的類,我們將從 ConfigService 的實例化開始長輪詢定時機制的源碼之旅;