首页 文章 精选 留言 我的

精选列表

搜索[编写],共10000篇文章
优秀的个人博客,低调大师

iOS-《编写高质量代码》笔记-第七章 设计模式与Cocoa编程

建议45:设计模式是特定环境下的特定问题的解决方案 设计模式是某种特定设计的模板或指导原则。 建议46:MVC模式是一种复合或聚合模式 MVC 是一种高级别的模式,关注的是应用程序的全局架构,并根据各种对象在程序中发挥的作用对其进行分类。 建议47:对象建模在数据库中也广泛使用 看不懂 建议48:类簇可简化框架的公开架构而又不减少功能的丰富性 1.类簇(class cluster)基于抽象工厂设计模式。 2.类簇,可以用于隐藏实现的具体细节,为调用者提供一个简单的接口。 3.类簇也可以有多个基类,如NSArray、NSMutableArray,后者就是继承的前者。对一些“大同小异”的问题,往往会有不错的结果。 这个架构的用户只看到一个公共类,即NSNumber。

优秀的个人博客,低调大师

iOS-《编写高质量代码》笔记-第八章 定制init...和dealloc

建议50:了解对象的alloc 和 init... alloc 分配过程不仅进行对象的内存分配,还初始化对象的两个小而非常重要的属性,即它的isa实例变量和保持数。 建议51:直接访问实例变量的init...方法 父类可能无法正确初始化对象,并返回nil,故要经常检查,确保self不为nil,然后再执行自己的初始化。 建议52:初始化方法必须以init字母开头 如果一个对象没有实现自己的初始化方法,Cocoa就会调用其最近的祖先对象的方法。 建议53:从init...方法得到的对象可能是不想要的 在创建对象时,通常应该在对象使用前检查初始化返回的对象是否为nil。 一旦对象被初始化了,就不应该再进行初始化了,否则,容易产生抛出。 建议54:实现init...方法的唯一性或者指定性并非“不可能” 调用super的初始化方法可以确保继承链上方的类定义的实例变量都率先得到初始化。 建议55:init... 方法有“轻重级别”之分 进行对象的初始化,要注意轻重之分。

优秀的个人博客,低调大师

iOS-《编写高质量代码》笔记-第六章 继承与面向对象设计

建议41:明确isa在继承上的作用 图片发自简书App 我们发现 Class 本身也有一个isa指针,指向的是它的MetaClass。 当我们对一个实例发送消息时(-开头的方法),会在该 instance 对应的类的 methodLists 里查找。 当我们对一个类发送消息时(+开头的方法),会在该类的 MetaClass 的 methodLists 里查找。 参考地址: http://ios.jobbole.com/81657/ http://www.jianshu.com/p/8036f15c91c6 建议42:利用类别和协议实现类似多重继承的机制 OC 可以通过类别(Category)和协议(Protocol)实现类似多重继承的机制,可以很好地实现代码复用和扩展。 1.虽然类别可以访问基类的实例变量,但不能添加变量,如果想要添加变量,可以考虑通过继承创建子类。 2.类别可以重载原始类的方法,但不推荐这么做,这么做的后果是再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类。 3.和普通接口有所区别的是,在类别中实现文件中可以不必实现所有声明的方法,只要你不去调用它。 协议并不是真正的类,它只是声明方法,不能添加数据。协议就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现。这种模式一般称为代理模式。 建议43:类别和类扩展是类继承的延续性拓展 类扩展可以给原有的类增加新的属性和方法。类扩展常用来定义类的私有变量和方法。如果类别是为类增加外部方法的话,那么类扩展就是用做类的内部拓展。 类别关注的重心是代码设计,把不同功能的方法分离开。 类别具有替换特性,也就是说,如果类别方法与类内某个方法具有同样的方法签名,那么类别里的方法将会替换类的原有方法。zs-可以利用这个实现热更新修复bug. 建议44:继承基类的实现行为勿忘调用super 如果打算补充基类实现的行为,请调用super. 如果打算替换基类实现的行为,就不要调用super.

优秀的个人博客,低调大师

从零开始编写一个类nginx工具, 主动式健康检查源码实现

wmproxy wmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感兴趣的可以一起造个轮子法 项目地址 gite: https://gitee.com/tickbh/wmproxy github: https://github.com/tickbh/wmproxy 为什么我们需要主动 主动可以让我们掌握好系统的稳定性,假设我们有一条连接不可达,连接超时的判定是5秒,需要检测失败3次才认定为失败,那么此时从我们开始检测,到判定失败需要耗时15秒。 如果此时我们是个高并发的系统,每秒的QPS是1000,我们有三个地址判定,那么此时我们有1/3的失败概率。那么在15秒内,我们会收到15000个请求,会造成5000个请求失败,如果是重要的数据,我们会丢失很多重要数据。 如果此时客户端拥有重试机制,那么客户端在失败的时候会发起重试,而且系统可能会反复的分配到那台不可达的系统,将会造成短时间内请求数激增,可能引发系统的雪崩。 所以此时我们主动知道目标端的系统稳定性极其重要。 网络访问示意图 以下是没有主动健康检查 如果出错的时候,一个请求的平均时长可能会达到(1.4s + 5s) / 2 = (3.2s),比正常访问多了(3.2 - 1.4) = 1.8s,节点的宕机会对系统的稳定性产生较大的影响 以下是主动健康检查,它保证了访问后端服务器组均是正常的状态 服务器2出错的时候,主动检查已经检查出服务器2不可用,负载均衡的时候选择已经把服务器2摘除,所以系统的平均耗时1.4s,系统依然保持稳定 健康检查的种类 在目前的系统中有以下两分类: HTTP 请求特定的方法及路径,判断返回是否得到预期的status或者body TCP 仅只能测试连通性,如果能连接表示正常,会出现能连接但无服务的情况 健康检查的准备 我们需要从配置中读出所有的需要健康检查的类型,即需要去重,把同一个指向的地址过滤掉 配置有可能被重新加载,所以我们需要预留发送配置的方式(或者后续类似nginx用新开进程的方式则不需要),此处做一个预留。 如何去重 像这种简单级别的去重通常用HashSet复杂度为O(1)或者用简单的Vec复杂度为O(n),以SocketAddr的为键值,判断是否有重复的数据。 如何保证不影响主线程 把健康请求的方法移到异步函数,用tokio::spawn中处理,在健康检查的情况下保证不影响其它数据处理 如果同时处理多个地址的健康检查 每一次健康检查都会在一个异步函数中执行,在我们调用完请求后,我们会对当前该异步进行tokio::time::sleep以让出当前CPU。 如何按指定间隔时间请求 因为每一次健康请求都是在异步函数中,我们不确认之前的异步是否完成,所以我们在每次请求前都记录last_request,我们在请求前调用HealthCheck::check_can_request判断当前是否可以发送请求来保证间隔时间内不多次请求造成服务器的压力。 超时连接判定处理 利用tokio::time::timeout和future做组合,等超时的时候直接按错误处理 部分实现源码 主要源码定义在check/active.rs中,主要的定义两个类 /// 单项健康检查 #[derive(Debug, Clone)] pub struct OneHealth { /// 主动检查地址 pub addr: SocketAddr, /// 主动检查方法, 有http/https/tcp等 pub method: String, /// 每次检查间隔 pub interval: Duration, /// 最后一次记录时间 pub last_record: Instant, } /// 主动式健康检查 pub struct ActiveHealth { /// 所有的健康列表 pub healths: Vec<OneHealth>, /// 接收健康列表,当配置变更时重新载入 pub receiver: Receiver<Vec<OneHealth>>, } 我们在配置的时候获取所有需要主动检查的数据 /// 获取所有待健康检查的列表 pub fn get_health_check(&self) -> Vec<OneHealth> { let mut result = vec![]; let mut already: HashSet<SocketAddr> = HashSet::new(); if let Some(proxy) = &self.proxy { // ... } if let Some(http) = &self.http { // ... } result } 主要的检查源码,所有的最终信息都落在HealthCheck中的静态变量里: pub async fn do_check(&self) -> ProxyResult<()> { // 防止短时间内健康检查的连接过多, 做一定的超时处理, 或者等上一条消息处理完毕 if !HealthCheck::check_can_request(&self.addr, self.interval) { return Ok(()) } if self.method.eq_ignore_ascii_case("http") { match tokio::time::timeout(self.interval + Duration::from_secs(1), self.connect_http()).await { Ok(r) => match r { Ok(r) => { if r.status().is_server_error() { log::trace!("主动健康检查:HTTP:{}, 返回失败:{}", self.addr, r.status()); HealthCheck::add_fall_down(self.addr); } else { HealthCheck::add_rise_up(self.addr); } } Err(e) => { log::trace!("主动健康检查:HTTP:{}, 发生错误:{:?}", self.addr, e); HealthCheck::add_fall_down(self.addr); } }, Err(e) => { log::trace!("主动健康检查:HTTP:{}, 发生超时:{:?}", self.addr, e); HealthCheck::add_fall_down(self.addr); }, } } else { match tokio::time::timeout(Duration::from_secs(3), self.connect_http()).await { Ok(r) => { match r { Ok(_) => { HealthCheck::add_rise_up(self.addr); } Err(e) => { log::trace!("主动健康检查:TCP:{}, 发生错误:{:?}", self.addr, e); HealthCheck::add_fall_down(self.addr); } } } Err(e) => { log::trace!("主动健康检查:TCP:{}, 发生超时:{:?}", self.addr, e); HealthCheck::add_fall_down(self.addr); } } } Ok(()) } 结语 主动检查可以及时的更早的发现系统中不稳定的因素,是系统稳定性的基石,也可以通过更早的发现因素来通知运维介入,我们的目的是使系统更稳定,更健壮,处理延时更少。 点击 <font color=green>[关注]</font>,<font color=green>[在看]</font>,<font color=green>[点赞]</font> 是对作者最大的支持

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle

Oracle

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。