SOA和微服务架构的区别

  • 首先,可以肯定的是SOA和微服务的确是一脉相承的.
  • SOA:面向服务的架构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.
  • 以一个公司为例:有基层员工 有管理层 有老板,最初大家都听老板指挥,谁干什么,根据需要,你可能今天干A事情,明天干B事情,后来人越来越多了,事情也越来越多了,做事情的效率越来越低,管理也很混乱;
  1. 现在开始做部门划分(服务化),不同部门做不同事情,IT部门只做研发,人事部门只做招聘;
  2. 这个时候就无法避免的发生跨部门协作(服务器调用);
  3. 但是你怎么知道有这样一个部门可以做这个事情呢?这就要依赖行政部门(注册中心);
  4. 新成立的部门要在行政那里做一个备案(服务注册);
  5. 然后公布一下,让其他部门知道(服务发布),大家就可以在新的工作秩序里面嗨皮的上班了,这个时候依然是在公司的组织架构中运转;
  6. 上述就是我理解的SOA的概念.
  • 微服务:微服务有一定SOA的概念在里面,只是在粒度中,微服务更加细一点;
  1. 比如说用户业务服务:登录 注册 个人中心 包含3个业务,SOA中都由userService提供的;
  2. 但是在微服务中,登录会被独立出来一个微服务,注册也会被独立出来微服务,他们可能采用不同的语言开发,相对SOA的粒度更细,业务场景耦合更低;
  3. 另外微服务强调一个去中心化,上述的公司的组织架构会被打散,没有老板,没有管理层,每一个人都是一个服务,做着自己的事情;
  • 还是以公司举例:
  1. 工资计算是会计的事情,但我把会计部门独立出来一个公司(微服务),他们不仅能计算自己公司的财务情况,还能帮别的公司计算账务情况;
  2. IT部门只做研发,但我把IT部门独立出来一个公司(微服务),他们不仅能给自己公司开发项目,也能接别的公司的项目;
  3. 同理,HR也能客串一把猎头.

转载但有许多修改,转载地址

一次http请求的过程

  • ##### 用户访问

首先会输入网站URL,例如:http://blog.blianb.com,这个时候DNS( Domain Name System):“域名系统”,会把域名翻译为对应的IP地址。为什么会有这一步呢?你可以先简单的理解为手机里保存的手机号与对应姓名,QQ号与备注的关系,目的是为了辨识和使用。

  1. 输入URL回车后,计算机会先查找浏览器的缓存,如果浏览器没有缓存这个URL对应的IP地址,或者缓存已经过期,那么计算机会接着查找操作系统本地DNS解析器的缓存。

    注:我们怎么查看Chrome自身的缓存?
    > 可以使用 chrome://net-internals/#dns 来进行查看,如下图,标红为过期:
    浏览器缓存

  2. 计算机检查本地hosts文件里是否含有这个映射关系
    Windows的hosts文件一般在C:\Windows\System32\drivers\etc\hosts
    Linux的hosts文件一般在/etc/hosts里

    注:Linux文件路径和内容如下图:
    host文件路径
    host文件内容
    btw,一般做网站开发的都会修改这个文件,配合本地的web server实现虚拟主机,方便在本地测试,127.0.0.1代表请求本地的服务

  3. 查找网络设置里的DNS服务器(区域)

  4. 检查此DNS服务器里是否含有这个IP地址映射关系

  5. 最后转至根DNS服务器查询,以下是DNS服务器的一些相关资料:

名称类型 说明 示例
根域 DNS域名中使用时,规定由尾部句点(.)来指定名称位于根或更高级别的域层次结构 单个句点(.)或句点用于末尾的名称
顶级域 用来指示某个国家/地区或组织使用的名称的类型名称 .com
第二层域 个人或组织在Internet上使用的注册名称 blianb.com
子域 已注册的二级域名派生的域名,通俗的讲就是网站名 www.blianb.com
主机名 通常情况下,DNS的域名的最左侧的标签标识网络上的特定计算机,如h1 blog.blianb.com
DNS域名称 组织类型
com 商业公司
edu 教育机构
net 网络公司
gov 非军事政府机构
Mil 军事政府机构
xx 国家/地区代码(cn代表中国)
  1. DNS工作简图:
    DNS工作简图

  • ##### 发起TCP三次请求
    > 拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的web server(常用的有apache,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达web server(本文就以Nginx为例),最终建立了TCP/IP的连接。
  1. 使用子网掩码判断客户机和服务器是否在一个子网络

  2. 在同一个子网络,则使用以太网进行广播发送数据包

  3. 不在同一个子网络,则通过网关转发

涉及的相关资料:
OSI模型七层协议
tcp的三次握手,建立连接
TCP/IP模型是一系列网络协议的总称,TCP/IP模型一共包括几百种协议,对互联网上交换信息的各个方面都做了规定


  • ##### web server(nginx)
要知道http请求到达web server之后,web server是怎么工作的,就要先知道以下几个概念:
  1. CGI:CGI 是 Web Server 与后台语言交互的协议;

  2. FPM (FastCGI Process Manager),它是 FastCGI 的实现,任何实现了 FastCGI 协议的 Web Server 都能够与之通信;

  3. FPM 是一个 PHP 进程管理器,包含masterworker两种进程:master进程只有一个,负责监听端口,接收来自Web Server的请求,而worker进程则一般有多个 (具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方,下图是我本机上 fpm 的进程情况,1个master进程,多个worker进程(本地有3个,云服务器上有5个worker);
    本机:
    本机

运程服务器:
远程服务器

  1. 关于php-fpm worker进程的配置说明,详见php-fpm里进程管理配置介绍;

  • ##### web server按端口监听到请求后,会分配给worker进程,调用相关PHP脚本进行具体的处理。

  • ##### php-fpm执行php文件
    涉及到解释器的执行过程
    通过socket和数据库或是缓存等交互

  • ##### 返回结果
    也是通过网络协议

  • ##### 浏览器显示

转:或许你也患上了开发瘫痪症

亲爱的开发者们:你们是否因为自己只精通于三大设备平台的八种编程语言而惴惴不安?又发现一个JavaScript框架是否会让你不寒而栗、愁眉苦脸?你是否曾经因为无法确定哪个云平台最适合而把业余项目一再推迟?

或许你也换上了开发瘫痪症(Developaralysis)。颤抖吧,这个病是治不好的。

如今开发者们可选的技术方案多到令人发指,让人眼花缭乱,透不过气来。过去几年里,我拿着别人给我的酬劳,写过Java、Objective-C、C、C++、Python、Ruby、JavaScript、PHP(对不起,这个也算),用过各种各样的SQL/键值/文件数据存储技术(MySQL、PostgreSQL、MongoDB、BigTable、Redis、Memcached等等)。我是否自我感觉良好?上帝啊,一点也没有。我反而感觉到愧疚,因为我还没有用过Erlang、Clojure、Rust、Go、C#、Scala、Haskell、Julia、Scheme、Swift或者是OCaml。

我就是一名开发瘫痪症患者:软件产业发展太快、任何一个人都无法跟上,从而对我的意识造成了毁灭性打击。

上面提到的几乎任何一种语言,你都会找到无数可选的框架、套件和库——看得头都要爆炸了。如今仅仅是把JavaScript的框架和库的所有排列认真评估一遍就要花上几个月的时间。另外,你知道Ruby语言有多少种gem包吗?有多少种iOS框架吗?有多少种NewSQL或NoSQL的数据库技术吗?更不用说从Hadoop、Spark与Google Dataflow中进行选择了,究竟是用Avro,还是Thrift,还是协议缓冲区,等等,等等……

还好,移动领域已经简化到了Android、iOS两大垄断平台——尽管也隐藏着一些交叉代替方案,比如Xarmarin或者PhoneGap、Sencha这样的跨平台HTML技术——但是确定在哪个平台上部署后端、如何部署又会让你头大。我开发过的各个系统部署在Heroku、Amazon Web Services、Google App Engine、Google Compute Engine以及Parse上面……这让我感觉非常糟糕,因为我对OpenStack、Force.com、Azure、Appfog一无所知,好多AWS服务我也从来没有真正用过,说多了都是泪。

I Am Devloper @iamdevloper

2014年编写简单网站的步骤:

  1. 安装Node

  2. 安装Bower

  3. 选择CSS框架

  4. 选择敏捷的方法

……

  1. 写几行HTML代码

如今的开发者面临着太多的选择,以至于使用的许多工具仅仅是用来管理另一堆工具:比如Bundler、Bower、CocoaPods、Pip等等。这些东西太棒了!我完全离不开它们!别高兴得太早。你开始使用另一堆工具后,等用到一半的时候你真正理解了它们的内容,你开始觉得这样的配置还不够用,你有点想要把它们重写一遍了……也许再找另一个工具代替……

可悲的是,如今开发者可用的语言、工具、框架以及平台的多样性和绝对数量庞大到让人畏惧。当然没人会承认这一点。所有人都想装作精通所有语言的编程大师。然而事实却是,我们都已经深陷于开发瘫痪症之中无法自拔。

即便收集了各种信息做出了最明智的选择,结果往往也适得其反。比如说,在项目开始前,你真的花时间分析了所有的可能,克服了由此产生的学习曲线,结果却被一些用着PHP、Swift这样易于上手的语言,写着表情符号变量名的小屁孩抢了市场先机——

——不过另一方面,如果你选择使用Swift和PHP的话,你就会生活在无休止的恐惧之中,担心一些C#/Haskell程序员高手很快就会做出更好的产品几百你,就像保罗·格拉汉姆(Paul Graham)很多年前用Lisp语言编写Viaweb那样。回忆往昔,他这样写道:

当你选择了技术之后,你必须要忽略其他人在做什么,全心全意思考怎样做到最好……事实上我们确实有一个秘密武器……我们开发软件的速度超出了所有人的想象……我们用一种全是括号的语法奇怪的AI语言编写出了我们的软件。

再说回开发瘫痪症。我们应该选择已经掌握的技术吗?这样我们就能立刻动手开发,无需克服学习曲线,但是需要生活在恐惧之中,担心其他人在以更好、更快、更优雅的方式实现同样的产品,担心到了明年我们的技能就跟不上时代、丧失竞争力了。还是应该选择未知的新技术?因为我们热爱学习,更好的工具使用起来不仅更加有趣,而且能够带来巨大的竞争优势……付出的代价则是大量的时间、精力和认知负荷。

这个问题太难回答了!不存在绝对正确的答案。因此每个月都是开发瘫痪症发作月。我马上会做好五颜六色、闪闪发光的丝带给你们佩戴,只要等我选好用哪种3D打印机、哪种微控制器、哪种LED软件、哪种无人机系统就行了。恐怕要麻烦你们期待很久很久了。

翻译:顾秋实

逆波兰表达式

今天在搜索PHP算法的时候,无意间进入了知乎,有人问,PHP需要算法?有人说需要,有人说不需要,这里不说结论,只谈看到的一个回复,里面提到了逆波兰表达式,原谅我搞PHP两年了还是第一次听到这个词(非计算机专业,算法知识也很弱,正在学习中),觉得很新鲜,所以想分享一下!

逆波兰表达式又称后缀表达式,它的解释器一般都是基于堆栈的,操作数入栈,遇到操作符时,操作数出栈,求值,将结果入栈;写法是运算符在数字的后面,表达式中无需使用小括号”()”,运算顺序也清楚明了,如中缀表达式1 + 2用逆波兰表达式则为 1 2 +,中缀表达式1 + 2 * 3用逆波兰表达式则为 1 2 3 * +,PS:在搜索中缀表达式时,看到百度百科的词条里面好像有错误,理解了这个例子能更好的理解逆波兰表达式,如下图(截图时间是2015-08-30 20:40):

它举了一个例子:中缀表达式8 + 4 – 6 * 2(=0)用逆波兰表达式则为6 2 * 8 4 + -(=0),按照这个逆波兰表达式,如果转为中缀表达式其实是(6 * 2) – (8 + 4)(=0),计算结果没有问题,但计算顺序错误。如果把中缀表达式换为8 + 4 – 6 * 3(= 负6),按照图中写法逆波兰表达式则为6 3 * 8 4 + -(= 正6),所以正确写法应是8 4 + 6 2 * – 或是8 4 + 6 3 * -(如果有理解不对的地方,请快速提醒我,以免误导他人)。

逆波兰表达式的优点(摘自维基百科,自由的百科全书):

用于表达式求值,以利用堆栈结构和减少计算机内存访问。

当有操作符时就计算,因此,表达式并不是从右至左整体计算而是每次由中心向外计算一部分,这样在复杂运算中就很少导致操作符错误。

堆栈自动记录中间结果,这就是为什么逆波兰计算器能容易对任意复杂的表达式求值。与普通科学计算器不同,它对表达式的复杂性没有限制。

逆波兰表达式中不需要括号,用户只需按照表达式顺序求值,让堆栈自动记录中间结果;同样的,也不需要指定操作符的优先级。逆波兰计算器中,没有“等号”键用于开始计算。

逆波兰计算器需要“确认”键用于区分两个相邻的操作数。

机器状态永远是一个堆栈状态,堆栈里是需要运算的操作数,栈内不会有操作符。

教育意义上,逆波兰计算器的使用者必须懂得要计算的表达式的含义。