<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nood1es</title>
	<atom:link href="https://yijie.lu/feed/" rel="self" type="application/rss+xml" />
	<link>https://yijie.lu</link>
	<description>Rick&#039;s Blog</description>
	<lastBuildDate>Tue, 18 Dec 2018 08:53:54 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.2.4</generator>

<image>
	<url>https://yijie.lu/wp-content/uploads/2017/05/411.png</url>
	<title>nood1es</title>
	<link>https://yijie.lu</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>日志安全分析方案梳理一二</title>
		<link>https://yijie.lu/a-brief-look-at-the-logs-safety-analysis/</link>
				<comments>https://yijie.lu/a-brief-look-at-the-logs-safety-analysis/#respond</comments>
				<pubDate>Sun, 06 Aug 2017 11:53:10 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[BigData]]></category>
		<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=98</guid>
				<description><![CDATA[<p>业界方向 随着大数据技术的发展和各类依赖性技术的提高，日志分析系统已经由原来的分散存储、事后追查发展到统一收集 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/a-brief-look-at-the-logs-safety-analysis/">日志安全分析方案梳理一二</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<h2 class="md-end-block md-heading">业界方向</h2>
<p><span class="md-line md-end-block">随着大数据技术的发展和各类依赖性技术的提高，日志分析系统已经由原来的分散存储、事后追查发展到统一收集、实时搜索和流式处理。</span></p>
<p><span class="md-line md-end-block">就目前而言，ELK在日志收集和查阅上已经占据了优势地位，其他同类型系统如Splunk等所占份额均在萎缩。又基于高可用和性能的需求，引入了KAFKA集群作为消息队列服务。同类型系统还有Flume，此处不对其原理和实现进行分析。</span></p>
<p><span class="md-line md-end-block">在日志分析上，分布式实时流处理已经是趋势，目前业界流行的有Storm、Spark Streaming、Samza、Flink等，份额及综合实力（包括但不限于背后开发商、文档和资料、语言优势、性能）占优的是Storm和Spark Streaming。以下详细针对这两个框架进行阐述：</span></p>
<p><span id="more-98"></span></p>
<h3 class="md-end-block md-heading">Storm</h3>
<blockquote><p><span class="md-line md-end-block">Apache Storm最开始是由Nathan Marz和他的团队于2010年在数据分析公司BackType开发的，后来BackType公司被Twitter收购，接着Twitter开源Storm并在2014年成为Apache顶级项目。毋庸置疑，Storm成为大规模流数据处理的先锋，并逐渐成为工业标准。Storm是原生的流处理系统，提供low-level的API。Storm使用Thrift来定义topology和支持多语言协议，使得我们可以使用大部分编程语言开发，Scala自然包括在内。</span></p></blockquote>
<h4 class="md-end-block md-heading">模式</h4>
<p><span class="md-line md-end-block">原生流 Native stream process ——所有任务，从到达开始，一个接着一个进行处理。</span></p>
<blockquote><p><span class="md-line md-end-block">首先以原生流处理开始，原生流处理的优势在于它的表达方式。数据一旦到达立即处理，这些系统的延迟性远比其它微批处理要好。除了延迟性外，原生流处理的状态操作也容易实现。</span></p>
<p><span class="md-line md-end-block">一般原生流处理系统为了达到低延迟和容错性会花费比较大的成本，因为它需要考虑每条记录。原生流处理的负载均衡也是个问题。比如，我们处理的数据按key分区，如果分区的某个key是资源密集型，那这个分区很容易成为作业的瓶颈。</span></p></blockquote>
<h4 class="md-end-block md-heading">容错</h4>
<p><span class="md-line md-end-block">通过记录每个源数据的跟踪确认消息来容错，性能好，但是需要开发者重复处理数据，类似于三次握手。也因此，在消息传输保障上，只实现了at least once，会存在消息重复。</span></p>
<h4 class="md-end-block md-heading">性能</h4>
<p><span class="md-line md-end-block">毫秒级，容错、状态管理等均会不同程度降低性能。</span></p>
<h4 class="md-end-block md-heading">总结</h4>
<p><span class="md-line md-end-block">任务量不大，速度要求高的实时性项目适合。</span></p>
<h3 class="md-end-block md-heading">Spark Streaming</h3>
<blockquote><p><span class="md-line md-end-block">Spark是非常受欢迎的批处理框架，包含Spark SQL，MLlib和Spark Streaming。Spark的运行时是建立在批处理之上，因此后续加入的Spark Streaming也依赖于批处理，实现了微批处理。接收器把输入数据流分成短小批处理，并以类似Spark作业的方式处理微批处理。Spark Streaming提供高级声明式API（支持Scala，Java和Python）。</span></p></blockquote>
<h4 class="md-end-block md-heading">模式</h4>
<p><span class="md-line md-end-block">微型批处理 Mini-batch steam process ——所有任务，从到达开始，在T时间内到达的任务作为一个集合，批量进行处理。</span></p>
<blockquote><p><span class="md-line md-end-block">微型批处理。将流式计算分解成一系列短小的批处理作业，也不可避免的减弱系统的表达力。像状态管理或者join等操作的实现会变的困难，因为微批处理系统必须操作整个批量数据。并且，batch interval会连接两个不易连接的事情：基础属性和业务逻辑。</span></p>
<p><span class="md-line md-end-block">相反地，微批处理系统的容错性和负载均衡实现起来非常简单，因为微批处理系统仅发送每批数据到一个worker节点上，如果一些数据出错那就使用其它副本。微批处理系统很容易建立在原生流处理系统之上。</span></p></blockquote>
<h4 class="md-end-block md-heading">容错</h4>
<p><span class="md-line md-end-block">由于源数据均是以batch的形式存在，出现错误重新计算即可，同时batch本身唯一且持久，很容易解决问题。也因此，很容易在消息传递保障上实现exactly once。</span></p>
<h4 class="md-end-block md-heading">性能</h4>
<p><span class="md-line md-end-block">秒级，容错、状态管理等均会不同程度降低性能。</span></p>
<h4 class="md-end-block md-heading">总结</h4>
<p><span class="md-line md-end-block">任务量一般，速度要求不高的项目适合。适合Spark技术栈，且比较新。</span></p>
<h2 class="md-end-block md-heading">初步方案</h2>
<h4 class="md-end-block md-heading">总览</h4>
<p><span class="md-line md-end-block">采用ELK+KAFKA+Spark Streaming来实现</span></p>
<p><span class="md-line md-end-block">目前apache官方提供两个版本的Spark Streaming + KAFKA集成环境。分别是spark-streaming-kafka-0-8和 spark-streaming-kafka-0-10 差异如下：</span></p>
<table class="md-table" contenteditable="false">
<thead>
<tr class="md-end-block">
<th></th>
<th><span class="td-span" contenteditable="true"><span class=""><a spellcheck="false" href="https://spark.apache.org/docs/latest/streaming-kafka-0-8-integration.html">spark-streaming-kafka-0-8</a></span></span></th>
<th><span class="td-span" contenteditable="true"><span class=""><a spellcheck="false" href="https://spark.apache.org/docs/latest/streaming-kafka-0-10-integration.html">spark-streaming-kafka-0-10</a></span></span></th>
</tr>
</thead>
<tbody>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">Broker Version</span></td>
<td><span class="td-span" contenteditable="true">0.8.2.1 or higher</span></td>
<td><span class="td-span" contenteditable="true">0.10.0 or higher</span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">Api Stability</span></td>
<td><span class="td-span" contenteditable="true">Stable</span></td>
<td><span class="td-span" contenteditable="true">Experimental</span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">Language Support</span></td>
<td><span class="td-span" contenteditable="true">Scala, Java, Python</span></td>
<td><span class="td-span" contenteditable="true">Scala, Java</span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">Receiver DStream（被动模式）</span></td>
<td><span class="td-span" contenteditable="true">Yes</span></td>
<td><span class="td-span" contenteditable="true">No</span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">Direct DStream（主动模式）</span></td>
<td><span class="td-span" contenteditable="true">Yes</span></td>
<td><span class="td-span" contenteditable="true">Yes</span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">SSL / TLS Support</span></td>
<td><span class="td-span" contenteditable="true">No</span></td>
<td><span class="td-span" contenteditable="true">Yes</span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">Offset Commit Api</span></td>
<td><span class="td-span" contenteditable="true">No</span></td>
<td><span class="td-span" contenteditable="true">Yes</span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span" contenteditable="true">Dynamic Topic Subscription</span></td>
<td><span class="td-span" contenteditable="true">No</span></td>
<td><span class="td-span" contenteditable="true">Yes</span></td>
</tr>
</tbody>
</table>
<h4 class="md-end-block md-heading">模式</h4>
<h5 class="md-end-block md-heading">被动模式 Receiver-based Approach</h5>
<p><span class="md-line md-end-block">是利用 Kafka 消费者高级 API 在 Spark 的工作节点上创建消费者线程，订阅 Kafka 中的消息，数据会传输到 Spark 工作节点的执行器中，但是默认配置下这种方法在 Spark Job 出错时会导致数据丢失，如果要保证数据可靠性，需要在 Spark Streaming 中开启<span class=""><em>Write Ahead Logs（WAL）</em></span>，也就是上文提到的 Kafka 用来保证数据可靠性和一致性的数据保存方式。可以选择让 Spark 程序把 WAL 保存在分布式文件系统（比如 HDFS）中。</span></p>
<h5 class="md-end-block md-heading">主动模式 Direct Approach</h5>
<p><span class="md-line md-end-block">不需要建立消费者线程，使用 createDirectStream 接口直接去读取 Kafka 的 WAL，将 Kafka 分区与 RDD 分区做一对一映射，相较于第一种方法，不需再维护一份 WAL 数据，提高了性能。读取数据的偏移量由 Spark Streaming 程序通过检查点机制自身处理，避免在程序出错的情况下重现第一种方法重复读取数据的情况，消除了 Spark Streaming 与 ZooKeeper/Kafka 数据不一致的风险。保证每条消息只会被 Spark Streaming 处理一次。</span></p>
<h4 class="md-end-block md-heading">分析</h4>
<p><span class="md-line md-end-block">通过阅读一些教程和报告，并根据现状，采用0-10版本比较好。该版本采用了KAFKA最新的consumer API，可以规避掉KAFKA本身的一些坑。加之我们的业务并不需要追求绝对稳定，保持技术栈的最新有利于解决一些已经暴露出来的坑。不过这个版本也存在一些问题，文档较少、官网原生暂时不支持Python、实验版本API可能修改等。</span></p>
<p><span class="md-line md-end-block">流处理框架选好了，就还有几个问题需要解决。</span></p>
<h4 class="md-end-block md-heading">流程</h4>
<p><span class="md-line md-end-block">源——日志——KAFKA——Spark Streaming——安全策略应用（脚本处理/系统处理）——数据持久化——告警与否——跟进处理</span></p>
<p><span class="md-line md-end-block">（流程图待补）</span></p>
<h2 class="md-end-block md-heading">待处理问题</h2>
<p><span class="md-line md-end-block">针对具体日志的安全策略研究</span></p>
<p><span class="md-line md-end-block">应用策略的Scala程序开发</span></p>
<p><span class="md-line md-end-block">报警消息通知</span></p>
<p><span class="md-line md-end-block">适合具体情景的集群性能指标测试</span></p>
<h2 class="md-end-block md-heading">REFERENCE</h2>
<p>[消息传输保障]: https://kafka.apache.org/documentation/#semantics<br />
[KAFKA和Flume]: https://www.zhihu.com/question/36688175/answers/created<br />
[流处理框架比较]: https://www.zhihu.com/question/29092950/answers/created<br />
[流处理框架比较]: http://www.dataguru.cn/article-9532-1.html<br />
[流处理框架比较]: http://xinhstechblog.blogspot.hk/2014/06/storm-vs-spark-streaming-side-by-side.html<br />
[日志处理平台]: https://www.ibm.com/developerworks/cn/analytics/library/ba-1512-elkstack-logprocessing/index.html<br />
[实时数据处理系统]: https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice2/index.html<br />
[ELK+SS]: https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-elk-spark/index.html<br />
[SS Guide]: http://spark.apache.org/docs/latest/streaming-programming-guide.html<br />
[SS+KAFKA Guide]: https://spark.apache.org/docs/latest/streaming-kafka-0-8-integration.html<br />
[SS+KAFKA+PY]: https://www.rittmanmead.com/blog/2017/01/getting-started-with-spark-streaming-with-python-and-kafka/<br />
[SS+KAFKA+Redis]: http://shiyanjun.cn/archives/1097.html<br />
[性能测试]: https://www.iteblog.com/archives/1561.html</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/a-brief-look-at-the-logs-safety-analysis/">日志安全分析方案梳理一二</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/a-brief-look-at-the-logs-safety-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>ArchSummit深圳站学习笔记 – Part 2</title>
		<link>https://yijie.lu/the-note-of-archsummit-in-shenzhen-p2/</link>
				<comments>https://yijie.lu/the-note-of-archsummit-in-shenzhen-p2/#respond</comments>
				<pubDate>Sun, 09 Jul 2017 15:01:33 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[Note]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=83</guid>
				<description><![CDATA[<p>腾讯海量监控包袱与创新 主讲人及背景 腾讯 社交网络事业群运营总监 聂鑫 从开发到运维，伴随腾讯社交网络运营部 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/the-note-of-archsummit-in-shenzhen-p2/">ArchSummit深圳站学习笔记 – Part 2</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<h2 class="md-end-block md-heading md-focus"><span class="md-expand">腾讯海量监控包袱与创新</span></h2>
<p><img class="alignnone wp-image-114 size-full" src="https://yijie.lu/wp-content/uploads/2017/07/20170707_063447690_iOS-1.jpg" alt="" width="2016" height="1512" /></p>
<h4 class="md-end-block md-heading"><span class="">主讲人及背景</span></h4>
<p><strong><span class="md-line md-end-block"><span class="">腾讯 社交网络事业群运营总监 聂鑫</span></span></strong></p>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">从开发到运维，伴随腾讯社交网络运营部成长的十年，负责过腾讯社交产品所有业务运维工作。</span></span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block">目前主要负责 QQ、空间等产品运维团队管理工作。经历多个业务产品的诞生到蓬勃，伴随着运维团队的成长和成熟，见证着腾讯一代代运营技术的创新和发展。</span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">作为运维界老兵有好多故事想和大家讲，也特别愿意听听各位经历的酸甜苦辣。</span></span></li>
</ul>
<p><span id="more-83"></span></p>
<h4 class="md-end-block md-heading">关键点</h4>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">Root智能分析</span></span></li>
<li><span class="md-line md-end-block">叠加告警</span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">全链路监控</span></span></li>
<li><span class="md-line md-end-block">独一无二生命指标保障业务</span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">通过机器学习来提高报警有效性</span></span></li>
</ul>
<h4 class="md-end-block md-heading">笔记</h4>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li><span class="md-line md-end-block">06年开始，腾讯采用DO分离Dev/Ops。</span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">出现线上故障的很大一个原因就是因为告警泛滥，我们忽略关键告警。</span></span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">对于“历史遗留问题/历史沿用架构”的态度是：坚决优化掉历史进程中不合理的架构。</span></span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">腾讯内部有20+套针对监控的系统，这些系统用来保障公司业务的方方面面。</span></span></li>
<li><span class="md-line md-end-block">所谓“Root智能分析” 即：基于公司业务层面架构（业务/人事），将公司业务网状化。然后，通过网图，针对不同业务梳理出来一条单链路。</span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">所谓“叠加告警” 即：发生告警的时候，通过上述链路，进行分析。倘若告警处于链路中连续环节，这个告警的重要程度和准确程度就越高，反之则反。</span></span></li>
<li><span class="md-line md-end-block">对于多告警情况，采用“故障面积算法”来给故障定性。</span></li>
<li><span class="md-line md-end-block">所谓“故障面积算法” 即：连续告警在多链路构成的矩形中所占面积大小。</span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">DLP-Deadline Point 即：业务生死指标。针对每个业务，不管是从业务架构层面还是系统层面，找到一个可以用来描述整个业务生或死的指标。这个指标有几个特点：</span></span>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li><span class="md-line md-end-block">没有阈值：因为业务数据因太多因素变化，一个推广活动就会增加流量，活动结束，流量自然下降。所以，传统常规阈值实际上没有太大的作用；</span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block">只有一个：指标越多越不好把控；</span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">非业务指标：业务指标波动无规律且易受外界影响。应该使用准确且不易受外界非故障因素改变的指标。</span></span></li>
</ul>
</li>
<li><span class="md-line md-end-block">所谓“全链路监控” 即：通过基础数值/系统日志/业务日志/业务内容/外界舆情等基本数据进行大数据分析，提取公共信息和数据。然后同大盘已有数据（历史数据/宏观安全数据）进行比较，进行判别然后告警。</span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">针对重要指标的曲线，进行诸如3σ准则等法则判定，降低随机误差对数据的影响。同时引入机器图像学习，对曲线进行比较和学习，借助AI的力量合理告警。</span></span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">以上内容均在腾讯内部线上使用，收效非常好。</span></span></li>
</ol>
<h4 class="md-end-block md-heading"><span class="">感悟</span></h4>
<p><span class="md-line md-end-block"><span class="">腾讯毕竟是腾讯。</span></span></p>
<p><span class="md-line md-end-block"><span class="">很多内容和经验都非常深刻，个人认为有几点值得关注：</span></span></p>
<p><span class="md-line md-end-block"><span class="">第一，运维引入机器学习。毫无疑问，未来是人工智能的天下。作为一个DevOps，在OPS方面，我们处理的90%的问题都是雷同的，机器取代人工是早晚的事情。当然，对于我司来说，革命尚未成功，同志仍需努力！</span></span></p>
<p><span class="md-line md-end-block">第二，生命指标的概念很棒。我们几乎都明白，80%的告警都属于持续告警，不重要不紧急。但是也正是这些不重要的告警导致我们忽略掉一些关键告警，人的精力毕竟有限。行话说，能用机器约束的规则，一定不要用人工。</span></p>
<p><span class="md-line md-end-block"><span class="">第三，故障面积算法和小米的集群监控存在共通之处，都是把点集合到面去分析。值得细细品味。</span></span></p>
<h2 class="md-end-block md-heading md-focus"><span class="">REFERENCE</span></h2>
<p>[3σ准则]: <a href="https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule">https://en.wikipedia.org/wiki/3σ_rule</a></p>
<p>The post <a rel="nofollow" href="https://yijie.lu/the-note-of-archsummit-in-shenzhen-p2/">ArchSummit深圳站学习笔记 – Part 2</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/the-note-of-archsummit-in-shenzhen-p2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>ArchSummit深圳站学习笔记 &#8211; Part 1</title>
		<link>https://yijie.lu/the-note-of-archsummit-in-shenzhen-p1/</link>
				<comments>https://yijie.lu/the-note-of-archsummit-in-shenzhen-p1/#respond</comments>
				<pubDate>Sun, 09 Jul 2017 14:56:34 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[Note]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=79</guid>
				<description><![CDATA[<p>小米监控运维之路 主讲人及背景 小米 云平台工程师 陈帅 多年从事于监控系统、部署系统、缓存系统的研发工作，热 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/the-note-of-archsummit-in-shenzhen-p1/">ArchSummit深圳站学习笔记 &#8211; Part 1</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<h2 class="md-end-block md-heading md-focus"><span class="md-expand"><img class="alignnone size-full wp-image-112" src="https://yijie.lu/wp-content/uploads/2017/07/20170707_053330900_iOS-1.jpg" alt="" width="2016" height="1512" />小米监控运维之路</span></h2>
<h4 class="md-end-block md-heading">主讲人及背景</h4>
<p><strong><span class="md-line md-end-block"><span class="">小米 云平台工程师 陈帅</span></span></strong></p>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">多年从事于监控系统、部署系统、缓存系统的研发工作，热衷于自动化运维理念，独立完成公司部署系统的设计和研发，多次参与中国移动等竞标缓存系统的设计工作。</span></span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block">加入小米后，专注于小米监控的设计和研发工作，对于监控系统的应用场景和实践有较深入的理解。</span></li>
</ul>
<p><span id="more-79"></span></p>
<h4 class="md-end-block md-heading"><span class="">关键点</span></h4>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">如何应对业务规模及数量快速增长</span></span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">自主开发实现监控系统</span></span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li style="list-style-type: none;">
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">提供可集成到业务代码监控SDK</span></span></li>
</ul>
</li>
</ul>
<ul class="ul-list" data-mark="-">
<li class=""><span class="md-line md-end-block"><span class="">针对集群而非单个主机进行监控</span></span></li>
</ul>
<h4 class="md-end-block md-heading">笔记</h4>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li><span class="md-line md-end-block">11年到14年，管控主机从200台增长到5000台。和我们情况类似，发展迅速，人力不足。</span></li>
<li><span class="md-line md-end-block">早期，同样全面采用Zabbix进行监控。</span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">中后期（12年开始）开始自主研发监控系统。流程和Zabbix几乎一模一样。</span></span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">提出针对主机采用“全生命周期自动化”管理。即：在机器建立、启动、交付、运行、停止、回收到销毁的过程中，都通过整个监控系统管理。去掉人工直接处理的步骤。</span></span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class="" style="text-align: center;">
<p style="text-align: left;"><span class="md-line md-end-block"><span class="">Agent直接采用主动PUSH的模式（类似Zabbix主动模式）。</span></span></p>
<p><img class="size-full wp-image-80 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/2017-07-09-2.png" alt="" width="1285" height="723" /><span class="md-line md-end-block">系统架构</span></li>
<li><span class="md-line md-end-block">自行开发能够嵌套进业务代码的监控代码SDK，类似于NewRelic的模式。</span></li>
<li><span class="md-line md-end-block"><span class=""><strong>机器体系设计采用打Tag方式</strong></span>，八个字段即：公司-部门-产品-集群-服务组-服务-任务组-任务。</span></li>
<li><span class="md-line md-end-block">策略模板除了可以继承外，还可以重载，即继承后复写。</span></li>
<li><span class="md-line md-end-block"><span class=""><strong>针对集群而非单个主机进行监控</strong></span>，即：同一集群内机器，存在性能冗余。无需100%保证全可用，可用性通过简单四则运算即可完成计算。从实际上看，效果显著。</span></li>
<li><span class="md-line md-end-block">监控系统集成自动缩扩容，通过上述监控来自动动态管理。</span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li style="list-style-type: none;">
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class=""><strong>大力推行Docker容器技术</strong></span><span class="">，容器编排框架使用的Marathon。自动缩扩容也通过其实现。</span></span></li>
<li><span class="md-line md-end-block">网络监控（包含网络硬件及流量监控）是很重要的项目。</span></li>
</ol>
</li>
</ol>
<ol class="ol-list">
<li class=""><span class="md-line md-end-block"><span class="">自动运维基于StackStorm实现。</span></span></li>
</ol>
<h4 class="md-end-block md-heading"><span class="">感悟</span></h4>
<p><span class="md-line md-end-block"><span class="">从小米的分享来看，比较适合我司现状。其技术选型虽无太多新意，却很容易落地。不管是容器技术的大量运用还是通过Tag方式直观地管理机器，都是我们正在努力的方向。</span></span></p>
<p><span class="md-line md-end-block"><span class="">个人认为值得注意的有两点：</span></span></p>
<p><span class="md-line md-end-block"><span class="">第一，小米初期采用第三方开源监控系统，但后期却选择自研。这个选择不一定适合现阶段的我司。理由很简单，系统雷同又耗时。其自研系统Open-Falcon与Zabbix大同小异。虽然提供了可以嵌入业务代码的SDK等功能，但是我觉得还不足以让我们付出比较大的成本也去开发一套类似的系统。现有业务环境下，我们还是可以采用多套开源/商业方案来实现需求。当然，后期做大做强，自研势在必行。</span></span></p>
<p><span class="md-line md-end-block"><span class="">第二，小米提到的针对集群而非单个主机进行监控的想法非常好——就类似于AWS的ELB——我们在CloudWatch里面可以直接查看针对ELB的监控数据，但是目前看来第三方监控系统都是采用以Single Host为粒度的监控方式。显然，一般集群都采用冗余且主机间低耦合模式设计，无需保证全集群100%健康度。这样可以大大降低我们的工作强度——只要在能保证生产环境安全运行的前提下，分清故障优先级，有的放矢。</span></span></p>
<h2 class="md-end-block md-heading md-focus"><span class="md-expand">REFERENCE</span></h2>
<p>[Marathon]: <a href="http://mesosphere.github.io/marathon/">http://mesosphere.github.io/marathon/</a></p>
<p>[StackStorm]:<a href="https://stackstorm.com/"> https://stackstorm.com/ </a></p>
<p>[Open-Falcon]: <a href="http://open-falcon.org/">http://open-falcon.org/</a></p>
<h2>写在后面</h2>
<p>周五周六InfoQ主办的ArchSummit深圳站在洲际召开。</p>
<p>含金量确实高，来了很多大佬，</p>
<p>票价也确实高。入门票5k起。Orz。</p>
<p>我司是几个人的小公司吗？？？：）</p>
<p>于是靠胜哥刷脸去听了两场监控相关的分享会。</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/the-note-of-archsummit-in-shenzhen-p1/">ArchSummit深圳站学习笔记 &#8211; Part 1</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/the-note-of-archsummit-in-shenzhen-p1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>上上下下左右左右BABA</title>
		<link>https://yijie.lu/life-is-a-struggle/</link>
				<comments>https://yijie.lu/life-is-a-struggle/#comments</comments>
				<pubDate>Sat, 08 Jul 2017 09:07:44 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[Game]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=53</guid>
				<description><![CDATA[<p>头 这篇，酝酿了很久，题目想了半个小时。提笔。 记事之初 在我很小的时候就开始接触游戏。应该是在01年小二，某 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/life-is-a-struggle/">上上下下左右左右BABA</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<h4>头</h4>
<p>这篇，酝酿了很久，题目想了半个小时。提笔。</p>
<h4>记事之初</h4>
<p>在我很小的时候就开始接触游戏。应该是在01年小二，某日下午，父亲带着一个键盘类似的东西回家。拆开包装，那会还不会意识到，这个东西，会陪伴我度过此后如此漫长的岁月。</p>
<p>小霸王其乐无穷。因为一些原因，我们这个年代接触到的并不是原生红白机。当然，这是后话。也并不妨碍FC游戏成为我们的回忆。第一个接触的游戏就是超级玛丽。其实那会儿记忆并不深刻，只是依稀记得并不能很好控制手柄。慢慢的，周围小伙伴都开始玩起了游戏机，我们会相约放学的下午，一起去某个大人不在的同学家，开开心心打上一下午，这些是我游戏最初始的记忆。</p>
<p><img class="alignnone wp-image-117 size-full" src="https://yijie.lu/wp-content/uploads/2017/07/2016121515427608-1.jpg" alt="" width="786" height="731" /></p>
<p style="text-align: center;">FC游戏</p>
<p>有很多东西，就像曾经被不良少年在校门出去左手边第一个巷子抢了你准备用来买冰棍的五毛钱一样深刻。一如，超级玛丽1-3的隐藏通道到4-1，魂斗罗的上上下下左右左右BABA，赤色要塞抢了小伙伴的人质，松鼠大战故意摔晕同伴等等等等。</p>
<p>而回忆特别像一串脑海中久未出现的队列，一旦你想起了第一个，接踵而至的，就是剩下的所有，恶魔城、冒险岛、坦克大战、1942、热血系列。。。。</p>
<p><span id="more-53"></span></p>
<h4>真正的童年</h4>
<p>03年底，家里有了电脑，那个时候网络很不发达，父亲用Modem上网，我的第一个QQ号码也是在那个时候申请的，10开头的9位号码。一度成为我夸耀的资本。</p>
<p>从那个时候开始，我正式接触PC游戏。父亲算是很开明的了，在游戏上，并没有管过我太多。我的几个启蒙游戏，都是他带给我的。仙剑奇侠传一，是我玩过的第一个ARPG游戏，印象深刻到以至于当时做梦都在打水魔兽。不得不说，就算时至今日，仙剑系列都算一款很棒的游戏。不过，地图和迷宫的复杂程度对于当时的我来说太困难了一点。寻找灵珠的每个迷宫，我几乎都需要花一天时间。</p>
<p><img class="aligncenter wp-image-58" src="https://yijie.lu/wp-content/uploads/2017/07/277-130F4154551227.jpg" alt="" width="435" height="272" /></p>
<p style="text-align: center;">仙剑奇侠传</p>
<p style="text-align: left;">网络不通的年代，几乎没有攻略。不像现在，游戏中但凡遇到困难，就去网上找。我记得，在玩另外一款ARPG游戏——剑侠情缘的时候，有一个环岛需要轻功才能飞上去，否则无法触发剧情。我在那卡了快一个月，因为我怎么都飞不过去。后来才知道，第一次按键起飞后，需要在中途A地板取消后摇然后继续释放轻功来完成二段飞。Emmmmm，心态爆炸。又如另一个，真·倚天屠龙记，直到现在，我才知道，我当时在万寿寺经历的一切，全TM是游戏本身的Bug（大概从小被Bug坑，如今成了程序员，手动滑稽）。</p>
<p><img class="wp-image-60 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/20080719_4f6dc529c0ea1d18b356kp2EQuGjz6xb.jpg" alt="" width="435" height="326" /></p>
<p style="text-align: center;">剑侠情缘</p>
<p><img class="wp-image-61 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/201161310230764860.jpg" alt="" width="435" height="326" /></p>
<p style="text-align: center;">真·倚天屠龙记</p>
<p>值得说道的还有另外两款RTS游戏——红色警戒和帝国时代。直到现在，我都会偶尔开上一把。我RTS玩得并不好，共和国之辉不开超武只能够打两个冷酷，而帝国最多能打四个中等电脑。究其原因，是因为我并不喜欢打打杀杀。我喜欢建立一个军队的感觉，那种从无到有发展的过程，比起对抗，我更享受在城堡里指挥农民收集资源发展科技。也正因此，我慢慢发现自己的一些特点，算是另一个角度了解自己了吧。</p>
<p><img class="wp-image-62 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/445502.jpg" alt="" width="435" height="326" /></p>
<p style="text-align: center;">红色警戒</p>
<p>除了上面说的，玩过的RPG和RTS不胜枚举。魔兽也是在当时入坑，可是由于画风上个人观点先入为主，我并不喜欢3D画面，所以直到现在，我仍旧不喜欢暴雪的大部分作品。当然，暗黑除外。</p>
<p>突然想起来好多东西啊，刀剑封魔录、月影传说、三国赵云传，整蛊邻居。。。。很多画面幻灯片般在脑海里面过。</p>
<p>说起三国赵云传，不得不展开说说了。这款游戏是第三波做的，综合质量非常高。特别是它的背景音乐，邀请了当时小有名气的白勺操刀——也是剑侠情缘的音乐操刀。而后面网易大火的大话西游2的整体背景音乐也是他做的，所以你还能从大话的背景音乐中听到一些赵云传的影子。现在，很久没有他的消息了。</p>
<p><img class="wp-image-63 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/20108310393.jpg" alt="" width="435" height="326" /></p>
<p style="text-align: center;">三国赵云传</p>
<p>其实回过头来仔细想想，当时寰宇、西山居、第三波等国产单机游戏厂商发展非常好，原创精品倍出。可我始终没有明白，为什么后面就突然销声匿迹了呢，真的是因为接下来爆红的各种网游吗？当然，西山居后面能够顺应时代发展推出剑网3，我有尝试过，可是有些东西，似乎真的不一样了。</p>
<h4>中二岁月</h4>
<p>初中从小镇到了县城，网络也慢慢发展起来，各种端游也是在这个时候兴起。丁三石同学，天桥同学，也在这个时候发家。也对啊，毕竟当时穷逼如我，都贡献了一大波毛爷爷。网易盛大圈粉无数，中二年纪的我，毫无疑问也随着音乐（误）跟着节奏浪起来（大误）。初一在一个封闭式寄宿学校读书，几乎没办法玩游戏。初二转校了，有机会玩游戏了，我甚至一度认为，我是游戏天才，初一太耽误我了！</p>
<p>面对世纪难题，大话还是梦幻，我选择了大话，原因很简单，有人带（你看，有人带节奏的重要性）。第一个区貌似叫波月洞？这个真忘记了，大话别的没有做好，就是服务器开得多，而且喜欢合，而且还喜欢改名字。。。一个周不去，原来服务器就不见了。当时的我，新潮的我，第一次居然玩了一个人妖号（惊）而且还是小蛮妖（大惊），从渔村出来到扫塔到扫北冥，大话二我玩了快两年，可最高等级仅仅止步于一转30级（当然，一转我转了男仙，但是是很Gay的男仙）。</p>
<p><img class="wp-image-64 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/2011-02-17_94250.jpg" alt="" width="435" height="311" /></p>
<p style="text-align: center;">大话西游2</p>
<p>也是这个时候，我发现我并不适合玩游戏，因为我发现游戏也很复杂。大话是当之无愧的国产精品，其中涉及到的数值计算确实很复杂。比如，人物转世时，会针对前后世人物独立修正值，一点之差，天壤之别。又如属性相克，某些PK，大到带的召唤兽，小到BB带的饰品对应打的宝石，都有很多的讲究。既然这样，就算了吧。于是，我就带着我的狗熊坐骑，游遍了神州大地。。。Emmmmm美术做得真好。何厚铧何厚铧何厚铧！</p>
<p>除了大话，冒险岛、魔域、梦幻、诛仙、天下都有接触。当然啦，除了这些硬RPG，还有劲舞团、跑跑卡丁车、泡泡堂、QQ全家桶、几乎市面上有名的游戏，都玩过。佩服当年的自己。</p>
<p>劲舞团197 8K 反向连爆房。233333</p>
<h4>网吧五连坐</h4>
<p>高中没有玩过任何游戏。</p>
<p>上大学了，伟光正如我，天天忙着学习社团泡妹子。怎么能和宅寝室打游戏的死肥宅相提并论了？本着体察民情的心态玩了玩下LOL。。。。Emmmm真好玩啊！</p>
<p>前面说过，我不太喜欢暴雪的画风，所以，我从来没有点冰封王座-WoW-DotA的发展树，加之拳头的风格很对胃，毫无疑问踏入召唤师峡谷！</p>
<p>算起来，我S3入坑，基友们基本都是S2入坑。落后一个赛季的我，一开始很不适应。当时一区不开放注册，就跑去郊区练手，好死不死，Timo恰好周免，万万没想到，这个英雄会是我LOL生涯最重要的一个英雄啊。算上现在，前前后后几乎打了500+把Timo。好了，说我变态的人让一让，要杀我的人排个队啊别插队。。。。。</p>
<p><img class="aligncenter wp-image-66" src="https://yijie.lu/wp-content/uploads/2017/07/7207504e9258d10919a1d96dd358ccbf6d814d06.jpg" alt="" width="435" height="113" /></p>
<p style="text-align: center;">提莫</p>
<p>大一到大三，确实很少玩游戏。直到大四，我才真的体会到了，一群朋友开黑打游戏的乐趣。真正的乐趣并不是来自于最后的一声Victory，开黑的童鞋都明白我的意思，一群人各种逗逼各种搞笑，五个人都抱着拿五杀的心态。</p>
<p>把把一级团，全员带点燃，插眼的是猪，必出杀人书。</p>
<p>直到现在，我们每个周都会开黑。而且更多地是打大乱斗，节奏轻松，一群人说说笑笑。工作一周了，放松放松，感觉贼棒！</p>
<p>说回游戏，LOL质量之高，真的算得上极品游戏。当然，它在各方面都不是最棒的，但是从画风、美术、特效、音乐、动画、游戏性、社交性、可玩性等等方面综合来说，当之无愧算得上极品（估计有同学拿着跳刀准备等我了）（不可否认，LOL借鉴甚至疑似抄袭了部分DotA的内容）</p>
<p>LOL到现在出了772款皮肤（截至本文发布）。精品数不胜数，源计划系列、电玩系列、合金系列、魔法少女系列，还有大部分年限。LOL的皮肤不仅仅做到了好看这一最基础的要求，还有很多根据英雄特性设计的彩蛋以及根据英雄背景增加的故事。比如Timo（又是Timo）的系列皮肤的R技能，都会根据皮肤改变——超人的伞，兔宝宝的蛋、万圣节限定的南瓜、宇航员的天线，无一不是增加可玩性和趣味性的点。又如电玩系列，全系列像素化特效，真的让人眼前一亮！总之，大到人物立意（如最新的亚索瑞文的黎明黑暗对立），小到皮肤动画（如T1级别DJ琴女的音浪跟着背景音乐的节奏变化）等等。无一不体现拳头的用心，和腾讯有钱就是爹的第一要义（小马哥：爹，说得好！）</p>
<p><img class="wp-image-67 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/819_160716140645_1.jpg" alt="" width="435" height="326" /></p>
<p style="text-align: center;">源计划系列</p>
<p><img class="wp-image-68 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/11111.jpg" alt="" width="435" height="272" /></p>
<p style="text-align: center;">魔法少女系列</p>
<p>对于音乐及动画，这个就放到正在写的另外一片博文里面吧（此处一只大鸽子）。</p>
<p>无奈，英雄联盟在走下坡路了。哎，总是这样，时代不断向前的，就好像，我们能够回忆的，都是被时代的车轮碾过的，正在经历的，也终究会成为回忆。</p>
<h4>从来没赢过</h4>
<p>工作以后，因为时间和精力实在有限，很少玩游戏了。但是去年还是在基友的召唤下，左脚正式入了主机坑，购入了PS4（斜眼看看Xbox党，辣鸡），成为一名光荣的索大好党党员；右脚正式入了Steam坑，成了一名光荣的G胖一生推党党员。</p>
<p>Steam上，买了整蛊邻居、帝国时代等等，也算是为自己的童年充值了一波信仰，玩了这么多年盗版了。。。现在只是偶尔打一把帝国，看看新游戏。</p>
<p>PS4上，除了会免，买了一堆休闲游戏。当然，GTA5、DriverClub、自然元素、Broforce、小小大星球、基友那里搞来的美末、神海、巫师、血源一系列硬核也都是有的。</p>
<p><img class="wp-image-69 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/222.jpg" alt="" width="435" height="272" /></p>
<p style="text-align: center;">GTA 5</p>
<p>不过我想说的是，一些与游戏本身无关，而与其透露的信息有关的东西。</p>
<p>Journey，中文译风之旅人，PS独占。游戏的内容就是一个无名的旅人历经千辛万苦到达圣山朝拜的过程。中途有一些特殊的设定，通过获取经文一样的条带，让你可以飞起来。中途，你也许会遇到别的玩家，但是无法沟通，你们可以一起相伴到达目的地，牺牲了可以彼此相救，一开始，我并不懂这样设定的意义，直到最后通关，突然发现，好像人生就是如此啊，一路走来，也许会有很多人和你相伴，但是最后，终究是你自己。</p>
<p>我们生而孤独，茕茕孑立。</p>
<p><img class="wp-image-70 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/0169e055d2a99a6ac725a166f48455.jpg" alt="" width="435" height="218" /> <img class="wp-image-71 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/01888f55d2aa8432f8759203c978c8.jpg" alt="" width="435" height="203" /></p>
<p style="text-align: center;">风之旅人</p>
<p>This War of Mine，中文译这是我的战争，全平台。游戏内容是你控制平民在战火纷飞的时期生存，你需要面对食物药品短缺、生病、死亡、战争、抢劫、帮助他人、偷窃、杀人。这些都是由你自己决定的，而你的决定会直接影响到角色的心态和情绪，有的玩家，不做任何坏事也能通关，有的，杀人无数。游戏的最后，会根据你的游戏表现，给出你操控的所有平民的最后结局。我花了两天几乎通宵通关了游戏，但是我无法再玩一次，因为会很不知所措很慌，我无法预估自己接下来的行为是否会造成角色内心的改变，更无法想象，如果真的为了吃的杀人了该怎么面对自己。它会很有代入感。因为你面对的就是你自己，你每做出的一个决定，都会直接影响你的人生进程。</p>
<p><img class="wp-image-75 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/07/193-161121140G1.jpg" alt="" width="435" height="245" /></p>
<p style="text-align: center;">这是我的战争</p>
<h4>尾</h4>
<p>人生就是最后的RPG。</p>
<p>Life&#8217;s a Struggle.</p>
<h4 style="text-align: right;">ReferENCE（Part of them）</h4>
<p style="text-align: right;">赵云传原声大碟：<a href="http://music.163.com/#/album?id=2759018">http://music.163.com/#/album?id=2759018</a></p>
<p style="text-align: right;">三国赵云传：<a href="https://www.douban.com/game/10752611/">https://www.douban.com/game/10752611/</a></p>
<p style="text-align: right;">仙剑奇侠传：<a href="https://www.douban.com/game/10734111/">https://www.douban.com/game/10734111/</a></p>
<p style="text-align: right;">大话西游2：<a href="https://www.douban.com/game/21355201/">https://www.douban.com/game/21355201/</a></p>
<p style="text-align: right;">Broforce：<a href="https://www.douban.com/game/25923526/">https://www.douban.com/game/25923526/</a></p>
<p style="text-align: right;">Journey：<a href="https://www.douban.com/game/11620741/">https://www.douban.com/game/11620741/</a></p>
<p style="text-align: right;">TWoM：<a href="https://www.douban.com/game/26269051/">https://www.douban.com/game/26269051/</a></p>
<h4 style="text-align: right;">P.S.</h4>
<p style="text-align: right;">接下来会出一篇覆盖全平台的游戏推荐（这也许又是一只大鸽子）敬请期待～</p>
<p style="text-align: right;">以上。</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/life-is-a-struggle/">上上下下左右左右BABA</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/life-is-a-struggle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
							</item>
		<item>
		<title>优雅地部署Zabbix &#8211; Part 1</title>
		<link>https://yijie.lu/the-elegant-way-to-install-zabbix-p1/</link>
				<comments>https://yijie.lu/the-elegant-way-to-install-zabbix-p1/#respond</comments>
				<pubDate>Tue, 04 Jul 2017 03:34:32 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[Zabbix]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=37</guid>
				<description><![CDATA[<p>前言 进入新公司接手了监控项目，由于历史遗留问题（笑）内部有大量的坑，无奈推倒重来，后面会针对整个项目再做一个 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/the-elegant-way-to-install-zabbix-p1/">优雅地部署Zabbix &#8211; Part 1</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<h3>前言</h3>
<p>进入新公司接手了监控项目，由于历史遗留问题（笑）内部有大量的坑，无奈推倒重来，后面会针对整个项目再做一个总结，这里不再赘述。</p>
<p>Zabbix作为老牌企业级开源监控，虽然有诸如监控图表鸡肋、配置麻烦等缺点，但同时也有监控协议灵活，部署轻量级等足以让你忽略掉各种缺点的优点。毫无疑问，是绝大多数公司的最佳选项。</p>
<p>Zabbix后端是C写的，前端是用The Best Language in The World 写的。由Zabbix Company负责维护，同大多数大型开源软件差不多，提供了各种各样的安装方式，Source／Package／repo应有尽有。</p>
<p>可能是由于早期国内第一批接触Zabbix的人都有源代码编译癖，几乎所有的教程全部都是教你通过编译源代码进行安装和部署，加之官方只会放出世代release版本的rpm／deb包。所以大家也都欣然接受通过编译安装Server端。</p>
<p><span id="more-37"></span></p>
<h3>分析过程</h3>
<p>前面提到，公司的监控项目需要打破重建，我司是几个人的小公司吗？由于涉及到数以千计的物理机和同等数量级的AP／AC／Router，所以我理所应当地采用了Server-Proxy-Agent的模式构建整个监控平台。</p>
<p><img class="size-medium aligncenter" src="http://s3.51cto.com/wyfs02/M01/78/2C/wKiom1Z3XMTzobggAACByDrtjQw883.png" width="564" height="480" /></p>
<p style="text-align: center;">图一：架构简略图</p>
<p>接着，本着面向GitHub／StackOverflow编程的原则，遍历项目无果。遂调整思路自己打包。由于初次涉及相关业务，新手上路踩坑无数。起初，思路清晰，在官方repo里面拿到最新源码，寻找官网文档进行rebuild。发现官方发布的源码阉割掉了打包rules，rebulid文档也是基于2.x版本写的。通过apt source下来的源码也是2.x版本的，通过官网文档添加source.list莫名失败。总之怎么弄怎么不行。</p>
<p>后来左思右想，社区应该不会这么脑残没有解决这问题。</p>
<p>最后发现了端倪，实际上，他们封装了source.list到deb包，直接安装即可获取最新源码。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.2-1+xenial_all.deb
dpkg -i zabbix-release_3.2-1+xenial_all.deb</pre>
<p>接着就引刃而解。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">apt update

mkdir ~/temp &amp;&amp; cd ~/temp

apt source zabbix
</pre>
<p>这个时候，debian文件夹就出现了</p>
<p><img class="size-full wp-image-42 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/06/屏幕快照-2017-06-29-上午11.40.54.png" alt="" width="535" height="101" /></p>
<p style="text-align: center;">图二：文件目录</p>
<p>&nbsp;</p>
<h3>打包的规则</h3>
<p>接着，就开始编译打包吗？那你就错了。为什么要这么折腾，不仅仅是为了最后的安装包，关键在这：debian/rules，也是整个编译过程中的控制脚本，以下是zabbix3.2.6的rules，下篇博文会就打包规则及debian helper（dh）的使用进行阐述。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">#!/usr/bin/make -f

 PACKAGES        = PGSQL MYSQL SQLITE3
 MYSQL_NAME      = mysql
 PGSQL_NAME      = postgresql
 SQLITE3_NAME    = sqlite3

 COMMON_CONFIG = --host=$(DEB_HOST_GNU_TYPE) \
                 --build=$(DEB_BUILD_GNU_TYPE) \
                 --prefix=/usr \
                 --sysconfdir=/etc/zabbix \
                 --libdir=/usr/lib/zabbix \
                 --enable-server \
                 --enable-agent \
                 --enable-ipv6 \
                 --enable-proxy \
                 --enable-java \
                 --with-jabber \
                 --with-ldap \
                 --with-net-snmp \
                 --with-openipmi \
                 --with-ssh2 \
                 --with-libcurl \
                 --with-unixodbc \
                 --with-libxml2 \
                 --with-openssl

 %:
     dh $@  --with autotools-dev

 override_dh_clean:
     dh_clean
     rm -f debian/conf/zabbix_agentd.conf
     rm -f debian/conf/zabbix_server.conf
     rm -f debian/conf/zabbix_proxy.conf
     rm -f debian/conf/zabbix_java_gateway.conf
     rm -f debian/conf/zabbix_java_gateway_logback.xml
     rm -f database/*/create.sql

 override_dh_auto_configure:
     $(foreach pkg, $(PACKAGES), \
         mkdir -p $(CURDIR)/debian/tmp.build-$(pkg) ; \
         tar -cSf - --exclude=./bin --exclude=./build --exclude=./frontends --          exclude=./debian . \
         | tar -xSpf - -C $(CURDIR)/debian/tmp.build-$(pkg) ; \
         cat $(CURDIR)/database/$($(pkg)_NAME)/schema.sql &gt; $(CURDIR)/database/         $($(pkg)_NAME)/create.sql ; \
         cat $(CURDIR)/database/$($(pkg)_NAME)/images.sql &gt;&gt; $(CURDIR)/database/        $($(pkg)_NAME)/create.sql ; \
         cat $(CURDIR)/database/$($(pkg)_NAME)/data.sql &gt;&gt; $(CURDIR)/database/          $($(pkg)_NAME)/create.sql ; \
         dh_auto_configure --sourcedirectory=$(CURDIR)/debian/tmp.build-$(pkg) --       $(COMMON_CONFIG) --with-$($(pkg)_NAME) ; \
     )


 override_dh_auto_build:
     $(foreach pkg, $(PACKAGES), \
         dh_auto_build --sourcedirectory=$(CURDIR)/debian/tmp.build-$(pkg) ; \
     )
     )
     cat conf/zabbix_agentd.conf | sed \
         -e '/^# PidFile=/a \\nPidFile=/var/run/zabbix/zabbix_agentd.pid' \
         -e 's|^LogFile=.*|LogFile=/var/log/zabbix/zabbix_agentd.log|g' \
         -e '/^# LogFileSize=.*/a \\nLogFileSize=0' \
         -e '/^# Include=$$/a \\nInclude=/etc/zabbix/zabbix_agentd.d/*.conf' \
         &gt; debian/conf/zabbix_agentd.conf
     cat conf/zabbix_server.conf |sed \
         -e '/^# PidFile=/a \\nPidFile=/var/run/zabbix/zabbix_server.pid' \
         -e 's|^LogFile=.*|LogFile=/var/log/zabbix/zabbix_server.log|g' \
         -e '/^# LogFileSize=/a \\nLogFileSize=0' \
         -e '/^# AlertScriptsPath=/a \\nAlertScriptsPath=/usr/lib/zabbix/alertscripts'  \
         -e '/^# ExternalScripts=/a \\nExternalScripts=/usr/lib/zabbix/                 externalscripts' \
         -e '/^# FpingLocation=/a \\nFpingLocation=/usr/bin/fping' \
         -e '/^# Fping6Location=/a \\nFping6Location=/usr/bin/fping6' \
         &gt; debian/conf/zabbix_server.conf
     cat conf/zabbix_proxy.conf | sed \
         -e '/^# PidFile=/a \\nPidFile=/var/run/zabbix/zabbix_proxy.pid' \
         -e 's|^LogFile=.*|LogFile=/var/log/zabbix/zabbix_proxy.log|g' \
         -e '/^# LogFileSize=/a \\nLogFileSize=0' \
         -e '/^# ExternalScripts=/a \\nExternalScripts=/usr/lib/zabbix/                 externalscripts' \
         -e '/^# FpingLocation=/a \\nFpingLocation=/usr/bin/fping' \
         -e '/^# Fping6Location=/a \\nFping6Location=/usr/bin/fping6' \
         &gt; debian/conf/zabbix_proxy.conf
     cat src/zabbix_java/settings.sh | sed \
         -e 's|^PID_FILE=.*|PID_FILE="/var/run/zabbix/zabbix_java_gateway.pid"|g' \
         -e '/^# TIMEOUT=/a \\nTIMEOUT=3' \
         &gt; debian/conf/zabbix_java_gateway.conf
     cat src/zabbix_java/lib/logback.xml | sed \
         -e 's|/tmp/zabbix_java.log|/var/log/zabbix/zabbix_java_gateway.log|g' \
         &gt; debian/conf/zabbix_java_gateway_logback.xml

 override_dh_install:
     dh_install
     rm debian/zabbix-java-gateway/usr/share/zabbix-java-gateway/lib/logback.xml
     rm debian/zabbix-java-gateway/usr/share/zabbix-java-gateway/lib/logback-console.   xml
     chmod 755 debian/zabbix-java-gateway/usr/sbin/zabbix_java_gateway
     find debian/zabbix-frontend-php/usr/share/zabbix -name .htaccess | xargs rm -f
     find debian/zabbix-frontend-php/usr/share/zabbix/locale -name '*.po' | xargs rm -f
     find debian/zabbix-frontend-php/usr/share/zabbix/locale -name '*.sh' | xargs rm -f
     rm debian/zabbix-frontend-php/usr/share/zabbix/fonts/DejaVuSans.ttf

 override_dh_installinit:
     dh_installinit -p zabbix-agent
     dh_installinit -p zabbix-java-gateway
     dh_installinit --no-start -p zabbix-server-mysql --name=zabbix-server
     dh_installinit --no-start -p zabbix-server-pgsql --name=zabbix-server
     dh_installinit --no-start -p zabbix-proxy-mysql --name=zabbix-proxy
     dh_installinit --no-start -p zabbix-proxy-pgsql --name=zabbix-proxy
     dh_installinit --no-start -p zabbix-proxy-sqlite3 --name=zabbix-proxy</pre>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/the-elegant-way-to-install-zabbix-p1/">优雅地部署Zabbix &#8211; Part 1</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/the-elegant-way-to-install-zabbix-p1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>关于SSH的若干</title>
		<link>https://yijie.lu/something-about-ssh/</link>
				<comments>https://yijie.lu/something-about-ssh/#respond</comments>
				<pubDate>Wed, 03 May 2017 02:59:37 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=20</guid>
				<description><![CDATA[<p>很早就想总结一篇关于SSH的文章。 SSH、SSH Key、SFTP、SCP等等一直都在用，但是很少总结和体会 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/something-about-ssh/">关于SSH的若干</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<p>很早就想总结一篇关于SSH的文章。</p>
<p>SSH、SSH Key、SFTP、SCP等等一直都在用，但是很少总结和体会。本着烂笔头法则，总结一下。</p>
<p>SSH即Secure Shell，实际上就是在应用层的网络服务上的一种加密协议。起初应用于Unix/Linux的系统上。SSH主要采用公钥-密钥模式进行验证。目前最新版本是发布于2006年的2.x。</p>
<p>此处以SSH协议的三个应用来展开，大家可以根据协议在这三个应用中的具体实现来体会SSH本身。</p>
<p><span id="more-20"></span></p>
<h4>SFTP／SCP：</h4>
<p>这两个应用都是在日常工作中非常常用的工具。其原理就是通过SSH构建一条加密隧道，进行网络传输。它们本身仍然基于SSHD进程，没有属于自己的守护进程。共用22端口。需要注意的是，由于存在加解密，其传输效率低于FTP／CP</p>
<p>Win平台下，有很多软件集成了SFTP，诸如FileZilla，WinSCP，Xftp。而Unix类平台下，几乎没有好用的GUI工具（存疑？）SCP就是大杀器了。配合下文中所提到的登陆验证，日常传输个config什么的都很方便。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2</pre>
<h4>SSH AUTHENTICATION：</h4>
<p>自从转到macOS后，XShell这个神器就没法用了。我还专门发邮件给netsarang，但是无奈macOS的逼格之高（误）和人家的市场定位（大误）。还是只能安心用terminal了。但是真的很蛋疼啊，每次ssh root@。。。特别麻烦。更甚的是我带着问题问几个macOS专业户，人家都表示，ssh就很好了呀。。。</p>
<p>不过最后也算找到了办法：</p>
<p>-首先配制一套用来登陆的SSH公钥密钥，这里不推荐全部地方都用一套密钥。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">ssh-keygen -t rsa -C “youremail@email.com”</pre>
<p>-得到公钥和私钥后，scp到目标服务器</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">scp ~/.ssh/id_rsa_auth.pub root@x.x.x.x:~/.ssh/</pre>
<p>#在目标服务器里</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">cat id_rsa_auth.pub &gt;&gt; ~/.ssh/authorized_keys</pre>
<p>-在本机.ssh/下新建config如下</p>
<p>&nbsp;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">#Host别名

Host nickname

#Host IP

hostname x.x.x.x

#Host User

user root

#验证密钥

IdentityFile ~/.ssh/id_rsa_auth</pre>
<p>-大功告成。</p>
<p>下次登陆的时候直接ssh nickname 你就会发现，无比爽快！</p>
<p><img class="alignnone size-full wp-image-23" src="https://yijie.lu/wp-content/uploads/2017/05/WX20170518-150343.png" alt="" width="580" height="240" /></p>
<p>Enjoy ：）</p>
<h4>REFER：</h4>
<p>https://www.ibm.com/developerworks/cn/aix/library/au-sshsecurity/</p>
<p>https://en.wikipedia.org/wiki/Secure_Shell</p>
<p>https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/something-about-ssh/">关于SSH的若干</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/something-about-ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>找回GitHub消失的contributions</title>
		<link>https://yijie.lu/retrieve-the-github-contributions/</link>
				<comments>https://yijie.lu/retrieve-the-github-contributions/#respond</comments>
				<pubDate>Thu, 20 Apr 2017 06:46:34 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[GitHub]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=13</guid>
				<description><![CDATA[<p>作为世界上最大同性交友网站——GitHub 😂 自从入了坑，天天想着push代码。之前Yumeer的项目本来在 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/retrieve-the-github-contributions/">找回GitHub消失的contributions</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<p>作为世界上最大同性交友网站——GitHub <img src="https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f602.png" alt="😂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>自从入了坑，天天想着push代码。之前Yumeer的项目本来在Coding上，后来嫌弃它不够洋气，就换到GitHub上来了，搭建好仓库，配置好ssh，开始安心写代码。commit一两次后，我发现我的contributions并没有被点亮啊，一开始以为是私有仓库的原因，没去管。直到最近突然发现我一直设置的是展现所有项目。几番寻找，后来发现了问题——为了方便pull/push。我使用了SSH，在公司里面，我配置成Rick@Work，家里配置成了Rick@Home。push代码的时候，GitHub无法匹配账户信息，默认判断为新用户提交，这也就造成了最后无法count进自己的contributions。</p>
<p><span id="more-13"></span></p>
<p>根据GitHub官方的解决方案如下：</p>
<p>0.确定你错误的和正确的username/email信息（正确信息直接在GitHub profile里面找，错误的如果不知道，先执行下一步）</p>
<p>1.Clone一个临时仓库</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git clone --bare https://github.com/your-account/your-repo.git
cd your-repo.git</pre>
<p>如果不知道错误信息可以在完成第一步后通过git log命令获取</p>
<p>2.运行以下脚本</p>
<p><em>注意：替换脚本中的your-old-email@example.com/Your Correct Name/your-correct-email@example.com</em></p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags</pre>
<p>这里，就是一个简单的fliter——通过判定旧的git.config.email来更改每次commit的作者信息。同理，可以使用git.config.name来实现目的（更推荐，因为邮箱可能重复）</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">#!/bin/sh

git filter-branch --env-filter '
OLD_NAME="your-old-name"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_NAME" = "$OLD_NAME" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_NAME" = "$OLD_NAME" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
</pre>
<p>3.运行后，会提示多少commit被修改，然后直接push</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git push --force --tags origin 'refs/heads/*'</pre>
<p>到此为止搞定，去check一下。最后记得rm刚刚的临时仓库。</p>
<p><img class="size-full wp-image-15 aligncenter" src="https://yijie.lu/wp-content/uploads/2017/05/屏幕快照-2017-05-18-下午2.47.59.png" alt="" width="754" height="208" /></p>
<p>Enjoy！：P</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/retrieve-the-github-contributions/">找回GitHub消失的contributions</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/retrieve-the-github-contributions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>基于CodeIgniter的Service层构建</title>
		<link>https://yijie.lu/service-layer-4-codeigniter/</link>
				<comments>https://yijie.lu/service-layer-4-codeigniter/#respond</comments>
				<pubDate>Tue, 18 Apr 2017 04:07:46 +0000</pubDate>
		<dc:creator><![CDATA[Rick Lu]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CodeIgniter]]></category>

		<guid isPermaLink="false">https://yijie.lu/?p=8</guid>
				<description><![CDATA[<p>最近做了一些事情，其中一件就是分离出之前基于CI写的Service层并打包发布到GitHub。 想着还是应该留 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/service-layer-4-codeigniter/">基于CodeIgniter的Service层构建</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></description>
								<content:encoded><![CDATA[<p>最近做了一些事情，其中一件就是分离出之前基于CI写的Service层并打包发布到GitHub。<br />
想着还是应该留下一点什么，便是来由。<br />
这是还在Yumeer的时候，那会儿江哥刚来，梳理了整个业务逻辑，发现杂乱无章，遂推倒了重来。还是我一人负责后端，囿于经验，之前完全是hard-coding，代码复用性基本为0，加之CI的特性：</p>
<blockquote><p>-The Model represents your data structures. Typically your model classes will contain functions that help you retrieve, insert, and update information in your database.<br />
-The View is the information that is being presented to a user. A View will normally be a web page, but in CodeIgniter, a view can also be a page fragment like a header or footer. It can also be an RSS page, or any other type of “page”.<br />
-The Controller serves as an intermediary between the Model, the View, and any other resources needed to process the HTTP request and generate a web page.</p></blockquote>
<p><span id="more-8"></span></p>
<p>导致大量business logic堆积到Controller层甚至Model层，着实难看。后面江哥提出一个想法，做Microservice，了解过后，准备开做。<br />
CI的简洁易用性出于此，麻烦也同出于此。由于Controller层无法互相调用，在设计模式上，只能通过新构建一层架于C-M之间。本着面向Google/Stackoverflow编程的原则（手动滑稽），先找了找，发现了一些思路和代码片段。遂开始仔细分析。<br />
CI提供了极其灵活的扩展接口，分析过后，找到一条路，简而言之就是通过对core的扩展，增加一层类似于library层的独立层，同样使用原生load进行加载。</p>
<p>核心代码：</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">// The service layer core
public function service($service = '', $params = NULL, $object_name = NULL)
{
    if (is_array($service)) {
        foreach ($service as $class) {
            $this-&gt;service($class, $params);
        }
        return $this;
    }
    if ($service == '' or isset($this-&gt;_ci_services[$service])) {
        return FALSE;
    }
    if (!is_null($params) &amp;&amp; !is_array($params)) {
        $params = NULL;
    }
    $subdir = '';

// Is the service in a sub-folder? If so, parse out the filename and path.
    if (($last_slash = strrpos($service, '/')) !== FALSE) {
// The path is in front of the last slash
        $subdir = substr($service, 0, $last_slash + 1);
// And the service name behind it
        $service = substr($service, $last_slash + 1);
    }
    foreach ($this-&gt;_ci_service_paths as $path) {
        $filepath = $path . 'services/' . $subdir . $service . '.php';
        if (!file_exists($filepath)) {
            continue;
        }
        include_once($filepath);
        $service = strtolower($service);
        if (empty($object_name)) {
            $object_name = $service;
        }
        $service = ucfirst($service);
        $CI =&amp; get_instance();
        if ($params !== NULL) {
            $CI-&gt;$object_name = new $service($params);
        } else {
            $CI-&gt;$object_name = new $service();
        }
        $this-&gt;_ci_services[] = $object_name;
        return $this;
    }
}</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="null">// Extend load
class MY_Service
{
    public function __construct()
    {
        log_message('debug', "Service Class Initialized");
    }
    function __get($key)
    {
        $CI =&amp; get_instance();
        return $CI-&gt;$key;
    }
}</pre>
<p>&nbsp;</p>
<p>Flowchart：<br />
待补<br />
GitHub：<br />
<a href="https://github.com/acerest/ServiceLayer4CodeIgniter">acerest/ServiceLayer4CodeIgniter</a><br />
欢迎Star ：）</p>
<p>The post <a rel="nofollow" href="https://yijie.lu/service-layer-4-codeigniter/">基于CodeIgniter的Service层构建</a> appeared first on <a rel="nofollow" href="https://yijie.lu">nood1es</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://yijie.lu/service-layer-4-codeigniter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
	</channel>
</rss>
