導航:首頁 > 源碼編譯 > 架構與源碼

架構與源碼

發布時間:2023-05-10 03:51:43

⑴ 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 的實例化開始長輪詢定時機制的源碼之旅;




閱讀全文

與架構與源碼相關的資料

熱點內容
我的世界國際服為什麼登不進伺服器 瀏覽:994
微盟程序員老婆 瀏覽:928
intellij創建java 瀏覽:110
java連接odbc 瀏覽:38
啟動修復無法修復電腦命令提示符 瀏覽:359
手機編程是什麼 瀏覽:97
山東移動程序員 瀏覽:163
蘇州java程序員培訓學校 瀏覽:476
單片機液晶驅動 瀏覽:854
魔拆app里能拆到什麼 瀏覽:130
新預演算法的立法理念 瀏覽:144
wdcpphp的路徑 瀏覽:134
單片機p0口電阻 瀏覽:926
瀏覽器中調簡訊文件夾 瀏覽:594
五菱宏光空調壓縮機 瀏覽:68
為什麼app佔用幾百兆 瀏覽:680
自動解壓失敗叫我聯系客服 瀏覽:485
易語言新手源碼 瀏覽:458
oa伺服器必須有固定ip地址 瀏覽:45
傳奇源碼分析是什麼 瀏覽:270