月度归档:2017年12月

The Twelve-Factor App

简介

如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论:

  • 使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目。
  • 和操作系统之间尽可能的划清界限,在各个系统中提供最大的可移植性。
  • 适合部署在现代的云计算平台,从而在服务器和系统管理方面节省资源。
  • 将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发。
  • 可以在工具、架构和开发流程不发生明显变化的前提下实现扩展。

这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。

继续阅读

Advertisements

DevOps的三种方式

前言

这篇博客中提到的“三种方式“源自 《DevOps Handbook》 及《凤凰项目》(The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win.),这三种方式描述了构成 DevOps 的理论框架、流程、实践及价值观和哲学。

感谢《Lean IT》的作者 Mike Orzen 为此文提供宝贵建议。

三种方式

下文将介绍三种模式及在该种模式指导下的 DevOps 实践。

第一种方式: 系统思考

第一种方式强调全局优化,而非局部改进。— 大到部门职能划分(例如研发部和运维部门),小到个人(开发和系统工程师)。

这种方式将关注点放在整个业务价值流上。换句话说,整个团队应该关注在从需求被定义到开发,再到运维这个过程,直到价值被以服务的形式交付给最终用户。

将这种方式带到实践中的产出便是永远不要将已知的缺陷传递到下游工作,永远不要为了局部优化影响了整体价值流交付,总是为了增加价值流动努力,永远追求对架构的深刻理解。

涉及到这种方式的实践有:

  • 所有环境和代码使用同一个仓库,将软件包纳入版本管理
  • 团队共同决定发布流程
  • 保持 DEV、TEST、PRODUCTION 环境的一致性
  • 自动化回归测试
  • 小步提交,每日部署;而不是一次部署大量变更
  • 更快、更频繁发布

第二种方式:经过放大的反馈回路

第二种方式是创建从开发过程下游至上游的反馈环。几乎所有的流程改进都是为了从时间上缩短和从覆盖面上放大反馈循环,从而可以不断地进行必要的改正。

第二种方式的产出是关注到价值流中所有涉及到的用户,包括价值流内部和外部的,缩短和放大反馈回路,并且可以随时定位到需要改进的地方。

涉及到这种方式的实践有:

  • 代码审查及配置变更检查
  • 有纪律的自动化测试,使许多同时的小型敏捷团队能够有效地工作
  • 尽早设置监控预警
  • 修复 bug 为团队最高优先级
  • 团队成员之间高度互相信任
  • 团队之间保持沟通和良好合作

第三种方式:持续做试验和学习的文化

第三种方式提倡持续做试验,承担风险、从失败中学习;通过反复实践来达到精通

我们需要实验和冒着失败的风险,及时不断地尝试将我们置于一个危险的境地,我们要通过反复试错来掌握使我们远离危险的技能。

第三种方式的输出为为改善日常工作分配时间、奖励团队冒险精神,将错误人工引入系统以提高系统健壮性。

最具有代表性的就是 Netfilx 的 Chaos monkey ,Netflix 在他们的生产环境搭建一个服务用于定时随机关闭服务器,用以模拟服务器正常损坏或服务异常,他们的系统长期在这种环境下运行,“服务器故障”成为系统每日都要面临的问题,因此当服务器真的以外故障时不会对系统整体造成任何的影响。

译者后记

全局优化、快速反馈、鼓励失败。我们发现其实敏捷、精益、持续交付、DevOps中间有很多相似的东西。

参考资料: https://es.slideshare.net/SonatypeCorp/devops-connect-josh-corman-and-gene-kim-discuss-devopssec

http://itrevolution.com/the-three-ways-principles-underpinning-devops/

转发自:@duyidong

《那时花开》

作品:《那时花开》   字数:约 35000 字      体裁:中篇小说    关键字:校园青春

背景:小说记录了自己以在高中时期一群小伙伴的学习生活,作者:陈晓雷

袁河是高二上学期转到陆可凡他们班的。至于转班的原因却不得而知。不过众所周知的是,陆可凡他们班的语文老师是袁河的爸爸,所以就有人猜测这可能是他爸爸的注意,目的很简单,无非就是为了方便监督和管教儿子学习。那为什么到了高二才转班呢?答案也很简单,因为高二是承上启下的关键学期,既能延续高一时的学习状态,又能为高三做准备,所以这时转班最合适不过了。

转到陆可凡他们班上后,袁河发现了一个奇怪的现象。

比如一般课间休息的时候,同学们都会以固有的方式来放松自己。其中少数同学会走出教室,站在外面的走廊上,抬头仰望天空,认真盘算自己忧伤的心事。或者靠在旁边的栏杆上,低头看着地面,仔细回忆某天的快乐心情。而大多数同学则会三五成群地聚在一起,找一个大家都感兴趣的话题,然后各抒己见,开始谈论。 继续阅读

Taobao SSO 跨域登录过程解析

今年的双十一和双十二已经告一段落,你是否买到了你想要的宝贝呢?我们知道双十一是天猫的主场,双十二是淘宝的主场,你有没有注意到你在登录了淘宝后,访问天猫或者飞猪,你还是处于登录态的,但是我们知道cookie是不能跨域的,那么阿里是如何做到了多域名下的登录态同步呢?接下来我们通过抓包进行请求解析来了解这个过程。

基础知识:

  1. 如果忘了Cookie和Session的区别,那么建议你先回顾一下,可以参考:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/06.1.md
  2. 如果不知道为什么需要鉴权,为什么需要SSO,为什么需要跨域登录,建议你先阅读上一篇文章“系统权限控制”。

继续阅读

系统权限控制体系

在 Web 应用开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。比如我们开放的功能页面需要登录授权之后才能访问,一些功能需要具备特定权限的人才能操作;再比如我们开放了数据API接口,如果不做访问控制,那么任何人都可以调用,当被不法分子操作时将给我们带来巨大的麻烦。那么在Java 整个体系中访问控制是否有一套理论技术支撑呢,我们是否可以做一个通用性的访问控制系统来完成分布式系统架构下的复杂的权限控制?接下来会一一介绍。

访问控制的本质:

系统权限控制 本质上是访问控制(Access Control),那访问控制的本质又是什么呢?其实就是合法的访问受保护的资源,通俗的解释就是“【谁】是否有可以对某个【资源】进行某种【操作】”;可以看出访问控制的三个基本要素:主体(请求实体)、客体(资源实体)、控制策略(属性集合);

访问控制需要完成的两个任务:

  1. 识别和确认访问系统的用户;
  2. 决定该用户可以对某一系统资源进行何种类型的访问;

继续阅读

应用架构设计原则

软件系统架构设计原则就是把我们在各种场景下的架构设计进行抽选化提取公共特征形成过一定的方法论,这些方法论是经过严格推敲并具备移植性的,我们在设计系统时遵从这些设计规则可以为我们的体统提供更高的扩展性、稳定性。

抽象原则

各平台(含基础设施、中间件技术服务、各层业务服务等)需要通过合理地抽象,将内部信息、处理与扩展能力聚合成标准的服务于扩展接口,并通过统一的形式提供给使用者,屏蔽内部的实现与运行细节。

继续阅读

消息收发中的中文乱码

背景:

A发消息给B系统,A、B应用的编码均为UTF-8,但是B收到的消息出现中文乱码。
A发送消息的方式:

new Message(TOPIC, TAG, null, (messageContent.toString()).getBytes())
这里消息接受二进制byte数据,我们把消息string转换为byte的时候,默认使用了getBytes(),未指定编码方式,getBytes()方法的注释如下:Encodes this {@code String} into a sequence of bytes using the platform’s default charset, storing the result into a new byte array.也就是会使用平台默认编码,查看StringCoding.encode方法中的Charset.defaultCharset().name()方法:
继续阅读