⑴ 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 的实例化开始长轮询定时机制的源码之旅;