Recent Posts

Open-Falcon的两个分享

之前对Open-Falcon做的两个分享,懒得摘过来了,把链接放在这里备忘

Read more...

IaaS之后

引子

云服务的热度越来越高,IaaS、PaaS、SaaS开始逐渐为大家所知,论坛时期的那些草根站长也开始不自己购买服务器转而使用云主机了,大环境在慢慢变好,特别是对创业人员来说。

不过所谓的云服务三个层次发展并不均衡,IaaS是真正做起来了,特别是aws,早就是一个很重要的收入源了,国内来讲,比较有名的就是阿里云了,应该也开始盈利了,可喜可贺。但是PaaS并没有做起来,GAE、SAE、BAE、JAE应该没有一个称得上成功。至于SaaS,在笔者的认知里,无非就是提供给大众用的一个网站,有账号体系,不同账号有自己的数据,不做评价。

本文的标题是《IaaS之后》,主要是想聊一下在当前大环境下,我们应该如何做开发,行业应该如何发展。哇,话题好大,口气不小,每个人都有自己的理解,仁者见仁智者见智,笔者也只是碎碎念,可能观点一无是处,错得离谱,读者一笑置之,不要扔砖头,砸到花花草草也是不好~

IaaS服务概述

首先,我们回顾一下现在IaaS厂商提供了什么

*云主机和基础网络 这是必须的,否则就不是IaaS厂商了,至于用的Xen还是KVM,那咱们不关心,总之对用户来讲,拿到手的是一个指定CPU核数、指定内存大小、指定磁盘大小和类型、指定网络带宽的机器。

如此一来,开发者无需去花费几千甚至几万块购买物理服务器了,初期买个配置低的云主机还是比较省钱,而且不用关心操作系统、yum源、机架、网络、交换机、网线、机房租赁费用等等问题,着实省心不少。

*周边服务 一个服务要想跑起来,光有服务器和操作系统是不够的,我们通常还要依赖一些周边服务,比如数据库、Cache、Redis、MQ、存储、LB等等,如果只有云主机,那我们需要自己在云主机上搭建并维护这些服务。对于一些资深栈溢出工程师那肯定是没问题的,但是大部分人都是各有所长,一个好的开发并不一定是个好的DBA。

这些IaaS厂商也意识到这个问题,他们会把这些周边服务统一管理、运维,然后卖给开发者,其实这是个好事,IaaS厂商雇用专业的人士来打磨这些服务,通常都要比我们在云主机上手工搭建的要稳定、高效、安全、可用。而IaaS厂商统一处理这些周边服务之后很容易形成规模效应,成本可以做得更低,稳定性也更好,双赢。

通常的IaaS厂商就是提供这些服务了,当然,像AWS走在行业前面的巨头,会提供更多其他的服务,我们姑且不谈。

Read more...

说说HttpOnly Cookie的作用

做WEB开发,经常要跟cookie打交道,经常会遭受黑客的XSS,说一下HttpOnly Cookie的作用

要理解HttpOnly的作用,要先弄懂XSS攻击,即跨站脚本攻击,大伙可以Google一下看看XSS到底是什么,来自wikipedia的解释:

跨网站脚本(Cross-site scripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意使用者将代码注入到网页上,其他使用者在观看网页时就会受到影响。这类攻击通常包含了HTML以及使用者端脚本语言。

举个简单栗子:某网站提供了一个留言页面,留言内容是个富文本编辑器(也就意味着可以提交html代码给server),小黑同学深情款款得提交了一个振聋发聩的意见,但是内容中包含了一段恶意javascript脚本:

<script>evil_script()</script>
Read more...

Git中设置多个服务器地址

问题场景是这样的:公司有个私有git服务(使用公司邮箱登陆),但是我还需要操作github(使用自己的普通邮箱登陆)

显然,我们要为这两个邮箱账号分别生成公钥,通常,公私钥都是放到~/.ssh下面的,so:

mkdir -p ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -C "qinxiaohui@mi.com" # 把这个文件命名为id_rsa_mi,然后一路回车
ssh-keygen -t rsa -C "qinxiaohui@163.com" # 把这个文件命名为id_rsa_github,然后一路回车

此时在~/.ssh下面生成了两对公私钥,把id_rsa_mi.pub的内容贴到公司git服务的ssh keys中,把id_rsa_github.pub的内容贴到github的ssh keys中。然后touch一个配置文件:

touch ~/.ssh/config
chmod 600 ~/.ssh/*
Read more...

Java中volatile变量的用法

volatile是Java并发编程中控制变量可见性的一个关键字。

*要理解volatile,我们要从锁说起
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。

*Volatile 变量具有 synchronized 的可见性特性
要解释可见性,需要从变量修改过程来看。假设我们的程序中有8个线程,跑在8个核心的机器上,并且每个线程恰好交由一个核心来跑(只是个假设哈)。其中一个线程负责写volatile修饰的共享变量,其他7个线程负责读。我们知道,为了提高系统的处理速度,cpu是有缓存的,很多读写操作都是直接跟cpu缓存交互,而不是和主内存交互。假设这7个读线程都已经在cpu缓存中缓存了这个共享变量,写线程要修改这个数据,咋办?写线程也是把这个数据从主内存读到cpu缓存,然后修改,再然后写回主内存,如果没有volatile修饰的话,此时读线程读到的还是cpu缓存中的数据,是脏数据。用volatile修饰之后呢,数据从cpu缓存写回到主内存的这个操作,会引起其他cpu里缓存了该内存地址的数据失效,既然失效了,读线程再使用这个变量的时候就只能从主内存再次获取了,就可以读取到写线程写入的最新值了。

Read more...

该Blog源码获取

写在前面

Open-Falcon推到社区之后,受到众多业界同仁关注,深感荣幸。Open-Falcon的大部分模块都是用Go写的,要想做二次开发,就要掌握Go语言的基本用法。而学习一个语言最快的方法是什么呢?手把手学写一个入门小项目。于是,这个Blog应运而生,它麻雀虽小五脏俱全,正是学习Go语言的必备佳品。

技术点

  • web项目嘛,需要有好的路由,使用gorilla的mux
  • AOP编码支持,使用codegangsta的negroni
  • 如何在一个http request生命周期中保持住数据,在后面的handler中获取到
  • 如何做全局错误处理,代码逻辑即使有问题,进程也不会挂,不会影响其他请求
  • 如何设计更完善的error类型
  • 加密Cookie,使用gorilla的securecookie,如何正确写Cookie
  • 如何处理配置文件,Blog使用JSON做配置,无需引入第三方库
  • 如何处理参数,如何写一个通用的param处理模块
  • log模块的简单应用,access log、error log、标准输出分文件存放
  • 如何做html、json、text等的渲染
  • 如何使用模块函数,如何在模板中调用对象的方法
  • 四种http方法GET/POST/PUT/DELETE的应用
  • 如何处理静态资源文件
  • 上传文件到本地,也可以上传到七牛
  • 如何使用memory cache,使用redis做cache
  • 如何存取数据到MySQL,应用ORM
  • 如何设计DAO层,防止命名冲突
  • 如何对markdown原始内容做转换变成html代码片段
  • 展示博文的时候如何做代码高亮处理
  • 如何合理设计Tag机制
  • 如何设计分页
  • 如何做文章摘要,才不至于把样式搞乱
Read more...