构建器模式Builder
分步骤创建复杂对象(有众多复杂参数,基本让人看不懂的构造函数)。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 构造者模式最核心的思想就是将创建复杂对象的过程与复杂对象本身进行拆分。通俗来讲,构造者模式是将复杂对象的创建过程分解成了多个简单步骤,在创建复杂对象的时候,只需要了解复杂对象的基本属性即可,而不需要关心复杂对象的内部构造过程。这样的话,使用方只需要关心这个复杂对象要什么数据,而不再关心内部细节。 每个属性有自己的build方法。 作用1:其他对象不能访问正在创建的产品 作用2:可以实现链式编程(返回自己的ElementBuiler对象) 作用3:不需要调用所有的步骤 最后build 的时候返回真正Element的结果,可以实现链式编程 构造者模式的四个核心组件: Product 接口:复杂对象的接口,定义了要创建的目标对象的行为。 ProductImpl 类:Product 接口的实现,它真正要创建的复杂对象,其中实现了我们需要的复杂业务逻辑。 Builder 接口:定义了构造 Product 对象的每一步行为。 BuilderImpl 类:Bu...
本地新建分支推送后再次拉取的错误
本地新建分支推送后再次拉取的错误本地新建一个分支后,必须要做远程分支关联。如果没有关联,git会在下面的操作中提示你显式的添加关联。关联目的是如果在本地分支下操作: git pull, git push ,不需要指定在命令行指定远程的分支. git在本地新建分支, push到remote服务器上之后,你只要没有显示指定, git pull 的时候,就会提示你。 git push --set-upstream origin dev 等价于 <font style="color:#4D4D4D;">git push -u origin my_branch</font> origin 是默认的远程版本库名称 在你第一次提交你的分支的时候使用。它会像<font style="color:#4D4D4D;">git branch --set-upstream</font>一样在本地分支与远程分去建立联系。 我在 Git 中创建了一个新分支: 1git branch my_branch 推它: 1...
桥接Bridge
分离抽象与具体实现,让他们可以独自发展 用聚合代替继承的方式连接抽象和具体 https://refactoringguru.cn/design-patterns/bridge 应用1Gift -> WarmGift ColdGift WildGift GiftImpl -> Flower Ring Car 最终抽象类(Gift)的精确抽象(WarmGift) 里面组合了 实现类(GiftImpl)的 具体实现(Flower) 应用2还有一个遥控和播放器的例子。两个都是接口,遥控是抽象类,播放器是实现类,播放器不包含遥控,但是遥控要控制播放器就要组合播放器。电视遥控组合电视,广播遥控组合广播 代码实现: https://refactoringguru.cn/design-patterns/bridge/java/example#example-0--remotes-Remote-java
接口幂等方案
对于一个接口而言,无论调用了多少次,最终得到的结果都是一样的。 幂等性的实现与判断需要消耗一定的资源,因此不应该给每个接口都增加幂等性判断,要根据实际的业务情况和操作类型来进行区分。 在进行查询操作和删除操作时就无须进行幂等性判断。查询操作查一次和查多次的结果都是一致的,因此我们无须进行幂等性判断。删除操作也是一样,删除一次和删除多次都是把相关的数据进行删除(这里的删除指的是条件删除而不是删除所有数据),因此也无须进行幂等性判断。 关键步骤 每个请求操作必须有唯一的 ID,而这个 ID 就是用来表示此业务是否被执行过的关键凭证 每次执行业务之前必须要先判断此业务是否已经被处理过 第一次业务处理完成之后,要把此业务处理的状态进行保存,比如存储到 Redis 中或者是数据库中,这样才能防止业务被重复处理。 前端拦截用户点击完“提交”按钮后,我们可以把按钮设置为不可用或者隐藏状态,避免用户重复点击。 数据库实现数据库实现幂等性的方案有三个: 通过悲观锁来实现幂等性 开启事务实现原子操作 id 字段一定要是主键或者是唯一索引,不然会锁表,影响其他业务执行。 通过唯一索引来实现...
案例分析-DNS+tcpdump+wireshark
网络优化,实际上包含了整 个网络协议栈的所有层的优化。 DNS解析速度不稳定 DNS(Domain Name System) 域名系统,提供 域名和 IP 地址之间映射关系的查询服务。动态服务发现和全局 负载均衡(Global Server Load Balance,GSLB)的机制。这样,DNS 就可以选择离用户 最近的 IP 来提供服务。即使后端服务的 IP 地址发生变化,用户依然可以用相同域名来访 问。 域名。位置越靠后,层级越高。 com 是顶级域名, yuque 是二级域名 域名解析服务 (DNS),而对应的服务器就是域名服务器,网络协议则是 DNS 协议。DNS 协议在 TCP/IP 栈中属于应用层,不过实际传输还是基于 UDP 或者 TCP 协议(UDP 居多) ,并且域名服务器一般监听在端口 53 上。 在配置 Linux 系统的网络时,需要给它配置 DNS 服务器,这样它才可以通过域名来访问外部服务。 另外,DNS 服务**通过资源记录的方式,来管理所有数据,它支持 A、CNAME、MX、 NS、PTR 等多种类型的记录**。比如: A 记录,...
格式化输出与文本处理
——–\:\:s/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/$ i\:End Of Report 12345678910111213141516171819202122232425262728这个脚本现在加入了 nl 的逻辑页面标记并且在报告的最后加了一个 footer。记得我们在我们的标记中必须两次使用反斜杠, 因为他们通常被 sed 解释成一个转义字符。下一步,我们将结合 sort, sed, nl 来生成我们改进的报告:```bash$ sort -k 1,1 -k 2n distros.txt | sed -f distros-nl.sed | nl Linux Distributions Report Name Ver. Released ---- ---- -------- 1 Fedora 5 2006-03-20 2 Fedora 6 2006-10-24 3 Fe...
模板方法TemplateMethod
就是钩子函数 模板已经写好了 重写方法,系统自动调用,都是模板方法 使用的时候面向接口编程,这就是模板方法 在我们开发业务逻辑的时候,可能会遇到流程复杂的逻辑,而这个复杂逻辑本身是可以拆解成多个小的行为,这些小的行为本身可能根据业务场景的不同而有所变化。 这里我们以转账流程为例,如下图所示,整个转账流程是固定的,但是“验证密码”“验证余额”和“扣除金额”这三步针对不同的银行卡,要调用不同银行的接口去完成。为了让整个复杂流程的代码具有更好的扩展性,我们一般会使用模板方法模式来处理。 在模板方法模式中,我们可以将复杂流程中每个步骤的边界确定下来,然后由一个“模板方法”定义每个步骤的执行流程,每个步骤对应着一个方法,这些方法也被称为“基本方法”。模板方法按照业务逻辑依次调用上述基本方法,来实现完整的复杂流程。 模板方法模式会将模板方法以及**不需要随业务场景变化的基本方法放到父类中实现,随业务场景变化的基本方法会被定义为抽象方法,由子类提供真正的实现。** 下图展示了模板方法模式的核心类,其中 template() 方法是我们上面描述的模板方法,part1() 方法和 part3()...
服务器丢包分析-iptables规则-MTU大小设置错误-perf-火焰图分析处理请求时内核线程调用
服务器丢包分析–iptables规则以及MTU大小设置错误容器利用 Linux 内核提供的命名空间技术,将不同应用程序的运行隔离起来,并用统一的 镜像,来管理应用程序的依赖环境。这为应用程序的管理和维护,带来了极大的便捷性,并 进一步催生了微服务、云原生等新一代技术架构。 容易发生启动过慢、运行一段时间后 OOM 退出等问题。容器化后,应用程序会通过命名空间进行隔离。所以,你在分析时,不要忘了**结合命名空间、cgroups、iptables **等来综合分析: cgroups 会影响容器应用的运行; iptables 中的 NAT,会影响容器的网络性能; 叠加文件系统,会影响应用的 I/O 性能等。 数据包还没传输到应用程序中, 就被丢弃了。这些被丢弃包的数量,除以总的传输包数,也就是我们常说的丢包率。丢包通常会带来严重的性能下降,特别是对 TCP 来说,丢包通常意味着网络拥塞和重传, 进而还会导致网络延迟增大、吞吐降低。 丢包模拟1docker run --name nginx --hostname nginx --privileged -p 80:80 -it...
布隆过滤器
布隆过滤器布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。当我们在写入数据库数据时,在布隆过滤器里做个标记,这样下次查询数据是否在数据库时,只需要查询布隆过滤器,如果查询到数据没有被标记,说明不在数据库中。 第一步,使用 N 个哈希函数分别对数据做哈希计算,得到 N 个哈希值; 第二步,将第一步得到的 N 个哈希值对位图数组的长度取模,得到每个哈希值在位图数组的对应位置。 第三步,将每个哈希值在位图数组的对应位置的值设置为 1; 查询的时****候只要有一个为 0,就认为数据 x 不在数据库中。 没有的一定没有,有的也可能没有 黑名单,爬虫去重 只有加入和查询,不要求删除, 极大减少内存, 但是必须允许一定程度的失误率,会误杀好人,但是不会漏杀坏人 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你** “某样东西****一定不存在或者可能存在****”。** 如果存在那就是可能存在(hash的碰撞) 如果不存在那就一定不存在 相比于传统的...
用例图+用例描述表
描述 用户、需求、系统功能单元 之间的关系。它展示了一个外部用户能够观察到的系统功能模型图。 帮助开发团队以一种可视化的方式理解系统的功能需求。 参与者,Actor,一般一个小人 用例,Use Case , 外部用户可见的系统功能,对系统的功能进行描述,椭圆表示 子系统, (模块)展示系统的一部分功能,内部功能紧密联系 关系(具体参见UML,基本一致) 依赖:指向被依赖项 关联:指向消息接收方 泛化:指向父用例 包含:指向分解出来的功能用例 扩展:指向基础用例(附加功能) 项目Artifact,用例关联的具体说明 注释 用例描述表: 参考:https://blog.csdn.net/suxinpingtao51/article/details/8011335?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-ta...
