札记(23)▏轻量级微服务架构、反直觉询问、基业长青...
《轻量级微服务架构》
把大的问题分解为容易解决的小问题,找到小问题的解决办法,再来解决大问题,这就是分而治之的哲学。正如万事万物由分子、原子组成一样,软件也可以分解为基本单元,以这样的基本单元进行开发、测试、维护,是解决大规模系统建设的思路。分而治之首先要解决如何分的问题,企业软件的分法应该是以业务驱动的,而不是以技术驱动的,也就是分解为独立的业务逻辑,而这样的不可再分的业务逻辑就是微服务。
微服务是一种分布式系统架构,它建议我们将业务切分为更加细粒度的服务,并使每个服务的责任单一且可独立部署,服务内部高内聚,隐含内部细节,服务之间低耦合,彼此相互隔离。此外,我们根据面向服务的业务领域来建模,对外提供统一的API接口。微服务的思想不只是停留在开发阶段,它贯穿于设计、开发、测试、部署、运维等软件生命周期阶段。
请求会先发送到LB上,通过LB上的路由算法(例如轮询或哈希),将请求转发到后面具体的Web Server上,这类请求转发技术被称为Reverse Proxy(反向代理)。 由于进入LB的请求(流量)被均衡到下方各台Web Server中了,流量得到了分摊,负载得到了均衡,因此该技术也称为Load Balance(负载均衡)。
使用微服务架构开发应用程序,我们实际上是针对一个个微服务进行设计、开发、测试、部署,因为每个服务之间是没有彼此依赖的,大概的交付流程如图1-3所示。 图1-3 微服务交付流程 在设计阶段,架构师将产品功能拆分为若干服务,为每个服务设计API接口(例如REST API),需要给出API文档,包括API的名称、版本、请求参数、响应结果、错误代码等信息。在开发阶段,开发工程师去实现API接口,也包括完成API的单元测试工作。在此期间,前端工程师会并行开发Web UI部分,可根据API文档造出一些假数据(我们称为“mock数据”)。这样一来,前端工程师就不必等待后端API全部开发完毕,才能开始自己的工作。在测试阶段,前后端工程师分别将自己的代码部署到测试环境上,测试工程师将针对测试用例进行手工或自动化测试,随后产品经理将从产品功能上进行验收。在部署阶段,运维工程师将代码部署到预发环境中,测试工程师再次进行一些冒烟测试,当不再发现任何问题时,经技术经理确认,运维工程师将代码部署到生产环境中,这一系列的部署过程都需要做到自动化,才能提高工作效率。
微服务架构的特点 1.微小度颗粒——微服务的粒度是根据业务功能来划分的,对于某些复杂的业务来说,可能粒度较大,对于相对简单的业务而言,可能粒度较小。总之,微服务的粒度可大可小,但往往我们更希望它尽可能的小,但又不希望微服务之间有直接的依赖,因此粒度的划分是一件非常考验架构师水平的事情。 2.责任单一性——我们需要确保每个微服务只做一件事情,也就是我们经常提到的“单一职责原则”,该原则对微服务的划分提供了指导方针。如果我们将一个服务提供多个API,那么就要确保每个API必须做到责任单一性。 3.运行隔离性——每个服务相互隔离,且互不影响。也就是说,每个服务运行在自己的进程中。众所周知,进程之间是隔离的,是安全的,而进程内部或线程之间的资源是共享的。换句话说,一个服务出了问题,不会影响到其他微服务。 4.管理自动化——随着业务功能不断增多,服务的数量也会逐渐增加,我们需要对服务提供自动化部署与监控预警的能力,这样才能更加高效地管理这些服务。需要注意的是,我们必须借助自动化技术,才能确保管理服务变得更加容易。
微服务技术选型 我们可使用Spring Boot作为微服务开发框架,Spring Boot拥有嵌入式Tomcat,可直接运行一个jar包来发布微服务,此外它还提供了一系列“开箱即用”的插件,可大大提高我们的开发效率,我们也可以去扩展更多的插件。 在发布微服务时,可连接ZooKeeper来注册微服务,实现“服务注册”。实际上ZooKeeper中有一个名为ZNode的内存树状模型,树上的节点用于存放微服务的配置信息。使用Node.js处理浏览器发送的请求,在Node.js中连接ZooKeeper,发现服务配置,实现“服务发现” 通过Node.js将请求转发到Tomcat上,实现“反向代理”,同样也有大量的Node.js库可供我们自由选择。Node.js的“单线程模型”且“非阻塞异步式I/O”特性,通过“事件循环”的方式来支撑大量的高并发请求,此外Node.js原生也提供了集群特性,可确保高可用性。 为了实现微服务自动化部署,我们可通过Jenkins搭建自动化部署系统,并使用Docker将服务进行容器化封装。
微服务网关类似于经典设计模式中的Facade模式(门面模式),它将底层的复杂细节进行屏蔽,对外提供简单且统一的调用方式,比如HTTP方式。此时,对于客户端而言,可以是PC端网页,也可以是移动端设备,客户端通过HTTP方式调用微服务网关。 微服务网关也称为服务网关(Service Gateway)或API网关(API Gateway)。
Service Registry(服务注册表),它是整个“微服务架构”中的核心,它不仅提供了Service Registry(服务注册)功能,同时也为Service Discovery(服务发现)功能提供了支持。服务注册很好理解,就是在服务启动后,将服务的相关配置信息(例如,IP与端口)注册到服务注册表中。当客户端调用这些服务时,将通过Service Gateway(服务网关)从服务注册表中获取这些服务配置,然后通过反向代理的方式去调用具体的服务接口,从服务注册表中获取服务配置的过程就是服务发现。 此外,服务注册表会定期检测已经注册的服务,若发现某服务无法访问了,则将其从服务注册表中移除掉,这个定期检测的过程被称为“心跳检测”。由此可见,服务注册表对“分布式数据一致性”的要求是相当高的,换句话说,服务注册表中的服务配置一旦变更了,通知机制必须做到高性能,且服务注册表本身还需要具备高可用。 那么,谁才能担当服务注册表的重任呢?我们认为ZooKeeper是服务注册表的最佳解决方案之一。
ZooKeeper一般都以集群的方式对外提供服务,一个集群包含多个节点,每个节点都对应一台ZooKeeper服务器,所有的节点共同对外提供服务。整个集群环境对分布式数据一致性提供了全面的支持,具体包括以下五大特性。 1.顺序性——从同一个客户端发送的请求,最终将会严格按照其发送顺序进入ZooKeeper中。可见,这就像一个队列,拥有“先进先出”的特性,也就确保了请求的顺序性,一个个地来,大家都别插队。 2.原子性——所有请求的响应结果在整个分布式集群环境中具备原子性,也就是说,要么整个集群中所有机器都成功地处理了某一个请求,要么就都没有处理,绝对不会出现集群中一部分机器处理了某一个请求,而另一部分机器却没有处理的情况,这方面的要求与事务的原子性是一样的。 3.单一性——无论客户端连接到哪个ZooKeeper服务器,每个客户端所看到的服务端数据模型都是一致的,不可能出现两种不同的数据状态。实际上每台ZooKeeper服务器之间是会进行数据同步的,而这个同步过程是相当高效的。 4.可靠性——一旦服务端数据状态发生了变化,就会立即存储起来,除非此时有另一个请求对其进行了变更,否则数据一定是可靠的。 5.实时性——当某个请求被成功处理后,客户端能够立即获取服务端的最新数据状态,整个过程具备实时性。
服务发现(Service Discovery)是一种微服务架构核心模式,它一般与服务注册模式共同使用,在微服务网站上介绍过两种服务发现模式。 (1)客户端发现(2)服务端发现。其中“客户端发现”指的是服务发现机制在客户端中实现,而“服务端发现”指的是服务发现机制通过一个路由中间件来实现。我们目前使用Node.js实现的正是服务端发现这种模式,因为Node.js实际上作为了一个独立的中间件来提供服务发现功能。如果我们将服务发现功能放入前端JS中,则为客户端发现模式。
1.Docker引擎(Docker Engine) Docker引擎可理解为一个运行在服务器上的后台进程,也称为Docker Daemon,还有很多人称它为Docker服务,因为它本质上就是一个服务,只要我们启动该服务,我们就能随时使用它。我们可通过Docker命令客户端发送相关Docker命令,并与Docker引擎进行通信。 2.Docker客户端(Docker Client) 实际上Docker客户端有两种,一种是我们刚提到的Docker命令客户端,只要我们打开命令终端窗口,并输入相关Docker命令,就能操作Docker引擎。另一种Docker客户端是REST API客户端,我们一般会在应用程序中通过REST API与Docker引擎发生交互。本章我们将重点放在Docker命令客户端方式上,请大家自行学习REST API客户端。 3.Docker镜像(Docker Images) Docker镜像有点类似于我们曾经使用的光盘,光盘上刻录了数据,我们只需将光盘放入光驱中,就能读取光盘中的数据。同样,我们只需获取Docker镜像(光盘),就能将其载入到Docker引擎(光驱)中,并运行Docker镜像中的程序。一般情况下,我们首先需要将程序打包到Docker镜像中,随后才能将Docker镜像交给其他人使用。 4.Docker容器(Docker Containers) 当我们获取到Docker镜像以后,可随时运行该Docker镜像,此时便会启动一个Docker容器,该容器中将运行镜像中封装的程序。如果我们将Docker镜像理解为Java类的话,那么Docker容器就相当于Java实例。在同一个Docker镜像上理论上可运行无数个Docker容器,只要机器性能足够好。 5.Docker镜像注册中心(Docker Registry) Docker官方提供了一个叫作Docker Hub的镜像注册中心(Docker Registry),用于存放公开和私有的Docker镜像仓库(Docker Repository)。也就是说,我们可随时通过Docker Hub拉取(下载)Docker镜像,也可自由将自己创建的Docker镜像推送(上传)到 Docker Hub上,只是在上传时需要先注册Docker用户,获取Docker ID,通过用户名与密码登录Docker Hub,进行身份认证。需要注意的是,一个Docker Registry可以包含多个Docker Repository。
Docker的四大特点: 1.快速运行——启动虚拟机需要几分钟,而启动Docker容器却只需几秒钟,开发效率瞬间提升了。 2.节省资源——Docker容器运行在Docker引擎之上,可 3.便于交付——传统的软件交付物是程序,而在Docker时代的交付物却是镜像,镜像不仅封装了程序,还包含了运行程序所需的相关环境。 4.容易管理——可通过Docker客户端直接操作Docker引擎,非常方便地管理Docker镜像与容器。
《Ask: 反直觉询问》
在不清楚自己想要什么的时候,人们就擅长回答这两种基本的问题:“他们不想要什么”和“他们过去做过什么”。
我们回到亨利•福特的话,如果亨利•福特不是问人们“你们想要什么”而是“你们不满意马的哪些特征”呢? 那么,他可能会得到各种有用的信息。这时,可能有人会说:“让我不满的是马跑得不够快,而且需要喂养。”还有人会说:“我不满意每匹马每次只能坐一个人”等。 重点是,作为交通工具的马确实有一些让人感到不满意的地方,但是人们却不知道解决方法是什么,因为这些解决方法超出他们所能想到的范围。
确定一个市场,然后搞清楚在这个市场中销售什么,要比生产一个产品再为这个产品创造一个市场容易得多。
“最后,为了便于了解你的近况,我可能需要追踪调查。在我承诺不去向你销售任何东西的前提下,如果你愿意和我展开一个几分钟的交谈,那么你可以在下面留下你的名字和联系电话。” 写上这句特殊的话是非常有意义的:这个不销售任何东西的承诺是关键。在这一步中,你的目标是了解谁愿意为你提供电话号码,因为我们会把这个数据当作判断标准的一部分,并用它为反馈质量评分。
人们由于面临太多的可能性而变得极度焦,这会让我们感到极大的不确定性和压力。这就是为什么虽然顾客面临众多选择,但最后却什么也没买的原因之一。 太多可能性往往让人崩溃。
《掌控: 开启不疲惫、不焦虑的人生》
那正确的走路方式是什么呢? 我比较推荐在跑步机上进行有坡度的走路,因为跑步机的速度是固定的,所以在跑步机上走坡更容易控制心率区间;走路时腿部没有腾空的动作,膝盖承受的压力也减小了很多。如果你的体重基数比较大,走坡这个运动方法会更适合你。不论是在跑步机上还是在室外走路,都要注意以下几个要点。 第一个要点:走路的时候要加大摆臂的幅度,让手臂前后侧的肌肉都能得到锻炼,让身体更多的肌肉群参与到走路的动作中,增加身体的整体消耗。 第二个要点:走路时要保持肚脐一直向前,有助于髋关节即骨盆周围肌肉的稳定。有些人走路时臀部左右摆动的幅度比较大,时间久了易造成髋关节损伤,而这一点只要在走路时保持肚脐向前就能得到改善。 第三个要点:腹部始终保持收紧状态,有助于保证身体的稳定,也会加强腹部的锻炼效果。第四个要点:始终保持脚尖向前。在走路过程中,人体要重复几千次甚至几万次的迈步动作,如果脚尖方向有问题,比如严重外八字或内八字,也会引起膝关节和踝关节损伤。所以,走路时要时刻注意脚尖向前。 第五个要点:大步走,幅度一定要 第六个要点:走路期间保持足量的水分摄入,最好每10分钟就能补充1次水分。 走路的训练不需要天天做。心肺训练最好是一天运动一天恢复,比如第一天训练,第二天慢走或休息,这样的运动计划比较合理,能够使身体始终保持良好的循环状态。
要保证精力充沛,需要从以下五个方面管理我们的日常饮食: 碳水化合物: 摄入要适量,摄入过多会造成脂肪的囤积,从而引起各种疾病;摄入过少,无法为身体的正常运转提供足够的糖分。尽量摄入优质脂肪,避开劣质脂肪。 蛋白质: 食用富含优质蛋白质的食物,以保证必需氨基酸的供给,比如牛奶、肉、鸡蛋、豆类等,这些才是我们的优质燃料。 脂肪: 尽量摄入优质脂肪,比如三文鱼、金枪鱼、鱼油、核桃、亚麻仁油、芝麻油等;避开劣质脂肪,也就是反式脂肪酸。脂肪酸的摄入标准,不在于优劣,而在于平衡。 维生素: 人体每天必须摄入足量的维生素,各类蔬菜尤其是绿叶蔬菜的平均维生素含量、种类丰富。无法摄入足量的绿叶蔬菜,也可以选择维生素片剂做补充。 水: 每天的饮水量不要少于每千克体重30ml,不要等口渴时再喝,口渴时机体已经处于缺水状态。
为什么深呼吸这么重要? 第一点,也是很多书里都强调过的一点,我们唯一能够调控的一个内脏器官就是肺部,而调节肺部的方式就是深呼吸,浅呼吸对肺部的调节是微乎其微的。 第二点,深呼吸可以调动人体的副交感神经。和交感神经负责应激不同,副交感神经主要负责放松身体和消化吸收,这两者对我们来说特别重要。
冥想:让精力模式从耗散变为生发 那具体怎么做冥想呢?有一种非常简易的 第一步,找到一处安静的不受打扰的地方盘腿坐下。 第二步,闭上眼睛,全身精力专注于呼吸,双手轻松自然地放在两个膝盖上。 第三步,用腹部呼吸,深深吸气,腹部内收。 第四步,吸到最大,屏气。 第五步,缓缓呼气,还是腹式呼吸,腹部外松。 第六步,呼出全部,屏气。 如果在冥想的过程中,大脑中冒出别的想法,不用刻意回避,承认这个想法,然后把它放走,意识始终关注的是呼吸。 可以设置一个闹钟,从每天1分钟开始,逐渐增加时间。很多心率手表都有这项功能,让手表帮助你控制一呼一吸,便捷有效。 不必限制一呼一吸的时长,尽自己的最大可能。长期练习,专注力、意志力都会有明显提升。
使用泡沫轴放松的技巧主要有两种: 静态放松方法:将泡沫轴放置在需要进行放松的肌肉上,慢慢滚动到最敏感的痛点位置,停留30~60秒,直到疼痛程度降低50%以上,再换到另一个痛点。 动态放松方法:将需要进行放松的肌肉置于泡沫轴上,利用自身体重反复在泡沫轴上缓缓滚动10~15次。
首先,大脑在处理压力和焦虑时耗能非常大,这种脑力消耗会让我们食欲大增,在不经意间吃下过量的食物。 成年人的大脑重量为1.37~1.45千克,占体重的2.1%。但是,大脑需要消耗的能量占人体总能量的20%,耗氧量占全身耗氧量的25%,血流量占心脏输出总血量的15%,一天流经大脑的血液约为2000升。 大脑在处理压力和焦虑这种令人紧张的情绪时会高速运转,需要消耗巨大的能量。即便身体躺着不动,总的耗能量依然非常大,人很容易产生饥饿感。 这时候,稍不注意就会吃下过量的食物,增加身体负担,引起精力消耗。 其次,当我们压力大、感到焦虑时,会不自觉地想吃高糖高脂类食物。 无论是身体活动还是大脑运转,只要消耗了能量,产生了饥饿感,身体就会本能地对高脂高糖类食物产生渴望。这是因为糖和脂肪能刺激大脑分泌更多的多巴胺,而多巴胺是一种会让我们愉悦和亢奋的神经递质,能够有效地缓解压力和焦虑感。 如果压力和焦虑一直持续,我们就会对高脂高糖类食物逐渐产生依赖。
耶鲁大学医学院的贾德森•布鲁尔(Judson Brewer)找来了一些烟民做戒烟实验,他教给这些烟民们一种四步戒烟法,缩写为RAIN—— 识别感情(Recognize the feeling)。当你想吸烟的时候,你要意识到,想吸烟是一种感情。 接受这种感情(Accept the feeling)。不要把这种感情推开,不要与之对抗,要承认自己想吸烟,而且承认这是一种合理的感情。 观摩研究这种感情(Investigate the feeling)。从旁观者的角度,对这种感情进行分析:它的力量有多强?是我身体的哪个部分有吸烟的需求?这个感情有“颜色”吗?是什么“材质”的?当你从各个角度去分析它的时候,你就会发现这种感情不再是你的一部分了。你越分析它,它就离你越远。 感情分离(Non-attachment)。你和这种感情分开了,这时候你已经不再想吸烟了。 实验结果是布鲁尔的RAIN戒烟法比美国肺科协会推荐的传统戒烟法更有效。
《下一个倒下的会不会是华为》
思想家与精神病人的相同之处在于思想细胞的高度活跃,区别则在于前者善于管理自己的妄想,而后者永远不能约束自己。
《cctv主持人的超强口才》
正确的呼吸方法应该是“胸腹联合呼吸法”,这是目前为止最为科学的呼吸方法,这种呼吸方法对主持人来说特别重要。所谓“胸腹联合呼吸法”,就是在腹式呼吸的基础上,强化了对呼吸的控制。“胸腹联合呼吸法”的要领是这样的: 要用腹部吸气,吸气时,腹部隆起,口与鼻一起吸,口略微张开。但是要记住,第一次吸的时候不要太满,七到八成就差不多了,吸气的时候注意不要发出声音。闻花香是训练腹部吸气的一种非常有效的方法。可以假想一下,有一朵鲜花放在鼻前,想要体会一下花的芳香,那么自然的呼吸便会使得腰带周围与腹部发生膨胀,吸气的时候要自然、放松,不要收缩腹部,这就是正确的吸气方法。 在进行了一轮吸气之后,便要进行换气。换气也是非常讲究技巧的,要让呼吸形成一个循环的整体,就应该先把余气排出去,就自然而然地把气吸进去了。
北京广播学院的老师在教学生们用气发生的时候,会让他们通过模仿狗喘气的方法来进行联系。练习狗喘气,一定要放松腹部,不然的话难以达到理想的效果。吸气后,要慢慢吐气,发“丝丝”的声音,切记不可振动声带,要用心体会腰带附近的膨胀感。切记不可主动收腹,丹田与腰带周围是互相关联的,腰带附近膨胀了,丹田就会自己内收。虽然练习狗喘气的样子不太雅观,但是这确实是一种十分有效简单的方法。 练习发“哈”音,练习时一定要有力度,要连续,声音可以不大,不响,但一定要记得保持力度。在练习的时候,也要注意体会腰带附近的膨胀感。
呼吸是发音的基础,只有正确掌握了呼吸的方法,才可为以后学习更复杂的发音技巧做一个充分的准备。掌握了胸腹联合呼吸法,便彻底地解放了喉咙和声带,让声音更加圆润、丰满和流畅。 有的人喜欢捏着声音说话,使得声音非常刺耳、尖细,让人听起来感觉像太监一样,非常难受。这是一种常见的发音错误,不管是平常说话,还是主持、唱歌,都必须予以纠正。 有的人在说话的时候喜欢将嘴往两边咧,这样不光看起来十分别扭,而且发出的声音十分扁,没有广度显得很单薄。这样声带的位置太过于靠前,让男生显得女气,女生则显得小气。所以不论什么时候,说话时都要注意将嘴平张,万万不可往两边咧。 有的人为了形成自己独特的说话风格,故意撅起嘴来说话,虽然这样可以找到共鸣,使声音浑厚苍劲,但这样做不仅不雅观,而且会出现吐字不清,发音混浊的现象,所以有这种现象的朋友在平时说话时也要注意改正。 有的人很懒,他们不愿意用力去挺起软腭,这样一来会使鼻音太重,虽然这样做的效果会使声音变得嘹亮,但音色并不好听。
练声时会遵循两个原则,一是从低到高,从弱到强,如果不这样做,很容易破坏声带,要知道声带一旦被破坏,是很难修复的。二是情真意切,以情带声。如果只是呆板地练习发声,那么最终获得的成果可能是微乎其微的。主持人应该以情动人,情是发声的灵魂。 练习声音的时候,一定要多花时间,多动脑筋,这样才能深入地理解,练习效果也就能事半功倍。只有掌握了发声的技巧,改正之前错误的发声方法,才能拥有一副好的声音,而这样动听的声音也是人们口才组成的一部分,有时它甚至能关乎到演讲或主持的成败。
《基业长青》
这些高瞻远瞩公司虽然杰出,纪录却绝非完美无缺。(审视一下你本人列出的高瞻远瞩公司,我们怀疑在其历史中,这些公司中的大多数,甚至所有公司至少经历过一次严重的挫折,有的可能经历过好几次。)迪斯尼在1939年遭遇严重的周转困难,被迫公开上市;后来,在8O年代初期,股市做手看上它低迷的股价,使它几乎无法以独立的实体继续生存。波音公司在3O年代中期、4O年代末期都面临过严重的困难,到7O年代初又遇到严重困境,裁员6万多人。3M诞生之初,是一家失败的矿场,在2O世纪初期几乎倒闭。惠普公司在 1945年面临严重的挫折,1990年眼睁睁地看着股价跌破票面值。索尼创业前5年(1945年一1950年)推出的产品一再失败,到7O年代,在录像机市场争夺战中,自己的贝它小带系统败给VHS大带系统。福特汽车在8O年代初期出现美国企业史上最大的年度亏损,3年内共亏损33亿美元,之后才开始令人称羡地反败为胜和长久所需的企业再造。花旗银行早在1812年,也就是拿破仑进攻莫斯科时创立,但是在19世纪下半叶以及 1930年代大萧条期间,都曾营运不振,到8O年代末期,因为应付全球不良贷款组合的问题,又苦苦挣扎,IBM在1914年几乎破产,1921年时再度濒临破产边缘,到9O年代初期又遭遇困境。 的确,本研究中所有高瞻远瞩公司在某些时候都曾遇到过挫折、犯过错误,有些公司在我们撰写本书时正经历困难;但是——这一点是关键——高瞻远瞩公司展现出可观的弹性,展现出从逆境中恢复的能力。