0%

本文是结合写于2015年的博客jenkins源码分析获取脉络,结合自己的研究完成,较原文有所拓展和深入。

jenkins框架

architecture_jenkins

jenkins的Model对象

jenkin(实际是传承Hudson的)Model对象jenkin平台的基石,它们hold住了某一个(job、project、executor、user、buildable item、test result)的数据和状态。

每个Model对象可以和多个views绑定,view使用了Jelly来渲染HTML和对象。

Model的可执行性是通过绑定Actions对象到Model。

Model如是描述对象存在时,是通过绑定Descriptor对象到Model。

每个Model对象和一个URL对象绑定。
Stapler通过类似JSF表达式的方式来解决URL和Model Object的绑定问题。Stapler同时处理一个model和URL,然后根据object计算URL,一直重复这个动作,直到命中某个静态资源、可执行方法、视图(jsp、jelly、groovy等)。

阅读全文 »

将之前写过的一个小工具做了一些优化,开源出来。起了个没有任何意义的ppter。

ppter概述

为什么叫ppter

任性,没有意义,听着挺好听,嗯就这样。

项目地址: https://github.com/windanchaos/ppter

可用场景

多地办公,没有固定IP,需办公区对办公区建立VPN,办公区和阿里云建立VPN的场景。

能节省的费用就是两条固定IP的费用。拒我了解的一个固定IP的电信一年30万左右,移动的要10来万。对于小公司来说,一年还是能节约不少钱了。

市面上的其他解决方案,我并不太清楚,如果有更优的免费方案,欢迎告知。

文件说明

  • aliapi.py 阿里云部分产品api的封装
  • ConfigProvider.py 配置相关,读取config.ini转成需要的数据类型
  • Jobs.py 运行的进程
  • Dockerfile docker image镜像构建文件
  • requirement 项目依赖
  • config.ini 配置相关
  • getDnsInfo.py 获取域名解析信息工具
  • ppter_vpn.py vpn相关代码
  • ppter_vps.py vps相关代码
  • ppter_dns.py dns解析相关

    工作原理

    使用独立于办公区内部环境的阿里云(或其他共有云),部署redis作为ip交换媒介。
    clip_image001
阅读全文 »

目的

作为使用第三方(阿里云)的我司来说,我个人觉得很多钱是浪费了。在知乎上有人讨论自建和上云哪个省钱,其实还是要看在公有云上怎么用,公有云很多资源具有召之即来挥之即去的特性,实际上是可以最大限度的去压榨的。做容量规划的目的,很简单,向规划要资源利用率、投入产出比,算的是笔经济账。对个人而言,替公司节约几十甚至上百万的费用,这种贡献自然会得到丰厚的回报。对企业而言,节约了费用和开支,资源可以使用到其他地方,继而可以提高竞争力。所以,容量规划是必须而且重要的。

容量规划步骤

我个人构思的步骤有如下,虽不成熟,但是独立思考所得。容量规划有个前置条件,即系统的性能瓶颈已经或者大部分都被识别,在做规划的时候尽量保守一些。大致步骤和关键点:

  • 确定系统资源消耗类型(计算密集耗cpu、数据密集吃内存、网络或读写密集吃io),掌握系统在某资源配置情况下,能够支持的并发数。建立各系统的并发模型。
  • 掌握系统当前线上环境日常流量特征,并基于该特征制定一个流量模型。
  • 基于流量模型定制一个资源的基准水位,以达到支持日常访问较合理的资源利用率。
  • 核心服务的流量监控报警方案及自动扩容、缩容方案。
阅读全文 »

出发点

最近,在构思一套内部环境服务的监控系统,起码的功能是能识别到业务进程异常(进程级别的),退出后自动拉起。
找到了supervisor,了解基本功能后,觉得它在分布式方面还存在不足之处,所有配置分散在单机上。鉴于它的技术符合目前需要练习python技术栈。所以,准备对其源代码进行解构、分析和学习。

概览

源码研究和学习,起码要对该工具如何使用有个基本的掌握。

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

阅读全文 »

这篇文章是研习supervisor源代码的副产品,主要理解supervisor的驱动原理和操作系统对进程管理的一些基本知识。

理解什么是进程

百度百科定义如下:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

进程是操作系统对资源的一个抽象。
操作系统是计算机的管家,掌控着计算机内部的一切资源的分配、调度、回收。
而进程可以理解为计算机资源调度的一个基本单元。用播放电影来举个形象的例子,进程就是电影一针一针的画面,而程序就是播放这部电影的一个统称,电影没开始播放前,得准备放映机(cpu),电影胶片(内存)。放音机齿轮转动就好比cpu的时钟脉冲,每秒扫过N个胶片(进程被调度),图像被光打到幕布上(计算机的输出设备)。

阅读全文 »

最近在刷leetcode算法的入门题,刷到二叉树,一开始浑浑噩噩,后来掌握了套路,自己搞定一个,而且很优雅,比留言中的大部分都优雅,嗯,写个日志自嗨一把。
所有刷题都提交到我的github上了,具体位置:windanchaos的github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
题目要求:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

0
/ \
-3 9
/ /
-10 5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
阅读全文 »

最近在看一本讲数据库架构的英文书,书中很多次提及到一个叫缓存的词语,在我们商城的业务系统中也经常听到缓存这个词语。于是百度找到这篇文章。内心觉得总结很到位。转自:缓存技术原理

一、前言

应用中使用缓存技术,往往可以大大减少计算量,有效提升响应速度,让有限的资源服务更多的用户。但是,似乎还没有一种缓存方案可以满足所有的业务场景,我们需要根据自身的特殊场景和背景,选择最适合的缓存方案,尽量以最小的成本最快的效率达到最优的目的。本文将从多个方面对缓存进行分析,以便作为选择缓存方案的考量。
二、文章要点

三、缓存的理解 3.1 狭义的理解

缓存指的是 CPU 缓存,当 CPU 要读取一个数据时,首先从 CPU 缓存中查找,找到就立即读取并送给 CPU 处理;没有找到,就从速率相对较慢的内存中读取并送给 CPU 处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。

阅读全文 »

问题描述:
我们的tomcat启动了apr启动https端口,我设置了systemd的tomcat.service的文件,使用systemctl start tomcat,始终无法识别apr的环境变量。研究了一会后解决。
先贴tomcat.service最终设置,只需加一行配置即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=java tomcat project
After=syslog.target network.target

[Service]
Type=forking
User=user
Group=user
EnvironmentFile=/opt/apache-tomcat/bin/config
ExecStart=/opt/apache-tomcat/bin/startup.sh
ExecReload=
ExecStop=/arthas/servers/apache-tomcat-8.5.4-80/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target
阅读全文 »

git在维护版本库的时候统一使用的是LF,这样就可以保证文件跨平台的时候保持一致。
在Linux下默认的换行符也是LF,那也就不存在什么问题。
在Windows下默认的换行符是CRLF,那么我们需要保证在文件提交到版本库的时候文件的换行符是LF,通常来说有两种方法:

1
2
3
4
5
6
# 在工作区使用CRLF,使用git commit提交的时候git帮你把所有的CRLF转换为LF。
git config --global core.autocrlf true
# 在工作区使用LF
git config --global core.autocrlf input
# 避免文件中有混用换行符
git config --global core.safecrlf true
阅读全文 »

最近在践行代码,先把尚学堂的习题做完,遇到有点代表的就发个日志。
以下算法时间复杂度为N,还可以。这个好像是用了某种算法,具体叫动态规划法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
103. 【上机】编程求:∑1+∑2+……+∑100
这里输入最大数100作为参数
*/
public void sigma(int num){
//利用数组记录∑n的值,数组的index=n,特征:∑n=∑(n-1)+n
//数组下标等于数字,数组index为0的丢弃
int[] array_tmp=new int[num+1];
int sum=0;
for(int i=1;i<num+1;i++){
//数组index为0时,默认值0,可直接迭代
array_tmp[i]=array_tmp[i-1]+i;
sum=sum+array_tmp[i];
}
System.out.println("∑1+∑2+……+∑"+num+"的和为:"+sum);
}
阅读全文 »