2、使用 API 网关

本书的七个章节是关于如何设计、构建和部署微服务。第一章介绍了微服务架构模式。它阐述了使用微服务的优点与缺点,以及尽管如此,微服务通常是复杂应用的理想选择。该系列的第二章将探讨使用 API 网关构建微服务。

当您选择将应用程序构建成为一组微服务时,您需要决定应用程序客户端将如何与微服务进行交互。单体应用程序只有一组端点(endpoint),通常使用复制(replicated)结合负载均衡来分配流量。

然而,在微服务架构中,每个微服务都暴露一组通常比较细颗粒的端点。在本文中,我们将研究如何改进客户端通信,并提出一个使用 API 网关的方案。

2.1、简介

我们假设您正在为一个购物应用开发一个原生移动客户端。您可能需要实现一个产品详细信息页面,用于展示给定商品的信息。

例如,图 2-1 展示了在 Amazon 的 Android 移动应用中滚动产品信息时所看到的内容。

图 2-1、一个简单的购物应用

这是一个智能手机应用,产品详细信息页面展示了许多信息。不仅有基本的产品信息,如名称、描述和价格,页面还展示了:

  1. 购物车中的物品数量
  2. 订单历史
  3. 客户评价
  4. 低库存警告
  5. 配送选项
  6. 各种推荐,包括了购买此产品的客户购买的其他产品
  7. 选择性购买选项

在使用单体应用架构的情况下,移动客户端通过对应用程序进行单个 REST 调用来检索此数据,例如:

1
GET api.company.com/productdetails/productId

负载均衡器将请求路由到几个相同应用程序实例中的其中一个。之后,应用程序查询各个数据库表并返回响应给客户端。相比之下,当使用微服务架构时,产品详细页面上展示的数据来自多个微服务。以下是一些微服务,可能拥有给定产品页面展示的数据:

  • 订单服务 — 订单历史
  • 目录(catalog)服务 — 基本的产品信息,如产品名称、图片和价格
  • 评价服务 — 客户评价
  • 库存服务 — 低库存警告
  • 配送服务 — 配送选项、期限和费用,由配送方的 API 单独提供
  • 推荐服务 — 推荐类目

图 2-2、将移动客户端的需求映射到相关微服务

我们需要决定移动客户端如何访问这些服务。让我们来看看有哪些方法。

2.2、客户端与微服务直接通信

理论上,客户端可以直接向每个微服务发送请求。每个微服务都有一个公开的端点:

1
https://serviceName.api.company.name

该 URL 将映射到用于跨可用实例分发请求的微服务负载均衡器。为了检索特定的产品页面信息,移动客户端将向上述的每个微服务发送请求。

不幸的是,这种方式存在着挑战与限制。第一个问题是客户端的需求与每个微服务暴露的细粒度的 API 不匹配。在此示例中,客户端需要进行七次单独请求。如果在更加复杂的应用中,它可能需要做更多的工作。例如,Amazon 展示了在产品页面渲染中如何牵涉到数百个微服务。虽然客户端可以通过 LAN 发送许多请求,但在公共互联网下效率低下,在移动网络必然是不切实际。

客户端直接调用微服务存在的另一个问题是有些可能使用了非 web 友好协议。一个服务可能使用了 Thrift 二进制 RPC,而另一个则可能使用 AMQP 消息协议。这两个协议无论是对浏览器还是防火墙都是不友好的,最好是在内部使用。应用程序在防火墙之外应该使用 HTTP 或者 WebSocket 之类的协议。

这种方法的另一个缺点是它难以重构微服务。随着时间推移,我们可能会想改变系统划分服务。例如,我们可能会合并两个服务或者将服务拆分为两个或者多个。然而,如果客户端直接与服务进行通信,实施这类的重构将变得非常困难。

由于存在这些问题,很少有客户端直接与微服务进行通信。

2.3、使用 API 网关

通常更好的方法是使用 API 网关。API 网关是一个服务器,是系统的单入口点。它类似于面向对象设计模式中的门面(Facade)模式。API 网关封装了内部系统架构,并针对每个客户端提供一个定制 API。它还可用于认证、监控、负载均衡、缓存和静态响应处理。

图 2-3 展示了 API 通常如何整合架构

使用 API 网关的微服务

API 网关负责请求路由、组合和协议转换。所有的客户端请求首先要通过 API 网关,之后请求被路由到适当的服务。API 网关通常会通过调用多个微服务和聚合结果来处理一个请求。它可以在 Web 协议(如 HTTP 和 WebSocket)和用于内部的非 Web 友好协议之间进行转换。

API 网关还可以为每个客户端提供一个定制 API。它通常会为移动客户端暴露一个粗粒度的 API。例如,考虑一下产品详细信息场景。API 网关可以提供一个端点 /productdetails?productid=xxx,如图 2-3 所示,一个使用了 API 网关的微服务。允许移动客户端通过一个单独的请求来检索所有产品详细信息。API 网关通过调用各种服务(产品信息、推荐、评价等)并组合结果。

一个很好的 API 网关案例是 Netflix API 网关。Netflix 流媒体服务可用于数百种不同类型的设备,包括电视机、机顶盒、智能手机、游戏机和平板电脑等。起初,Netflix 尝试为他们的流媒体服务提供一个通用的 API。后来,他们发现由于设备种类繁多,并且他们各自有着不同需求,所以并不是能很好地运作。如今,他们使用了 API 网关,通过运行特定设备适配代码来为每个设备提供一个定制 API。

2.4、API 网关的优点与缺点

正如您所料,使用 API 网关同样存在好处与坏处。使用 API 网关的主要好处是它封装了应用程序的内部结构。客户端只需要与网关通信,而不必调用特定的服务。API 网关为每种类型的客户端提供了特定的 API,减少了客户端与应用程序之间的往返次数。同时,它还简化了客户端的代码。

API 网关也存在一些缺点,它是另一个高度可用的组件,需要开发、部署和管理。另外,还有一个风险是 API 网关可能会成为开发瓶颈。开发人员必须更新 API 网关以暴露每个微服务的端点。

重要的是更新 API 网关的过程应尽可能地放缓一些。否则,开发人员将被迫排队等待网关更新。尽管 API 网关存在这些缺点,但对于大多数的真实应用来说,使用 API 是合理的。

2.5、实现 API 网关

我们已经了解了使用 API 网关的动机和利弊,接下来让我们看看您需要考虑的各种设计问题。

2.5.1、性能与可扩展性

只有少数公司能达到 Netflix 的运营规模,每天需要处理数十亿的请求。不管怎样,对于大多数应用来说,API 网关的性能和可扩展性是相当重要的。因此,在一个支持异步、非阻塞 I/O 平台上构建 API 网关是很有必要的。实现一个可扩展的 API 网关的技术多种多样。在 JVM 上,您可以使用基于 NIO 的框架,如 Netty、Vertx、Spring Reactor 或者 JBoss Undertow。一个流行的非 JVM 选择是使用 Node.js,它是一个建立在 Chrome 的 JavaScript 引擎之上的平台。此外,您还可以选择使用 NGINX Plus。

NGINX Plus 提供了一个成熟、可扩展和高性能的 Web 服务器和反向代理,它易于部署、配置和编程。NGINX Plus 可以管理身份验证、访问控制、负载均衡请求、缓存响应,并且提供了应用程序健康检查和监控功能。

2.5.2、使用响应式编程模型

API 网关处理大部分请求只是简单的把它们路由到与之对应的后端服务。它通过调用多个后端服务并聚合结果来处理其他请求。对于某些请求,如产品详细信息请求,对后端服务请求而言是彼此独立的。为了把响应时间缩短到最小,API 网关应该并发执行独立请求。

然而,有时候,请求是相互依赖的。首先,API 网关可能需要在将请求路由到后端服务之前,通过调用验证服务来验证该请求。同样,为了从客户的愿望清单中获取产品信息,API 网关首先必须检索包含该信息的客户资料,然后检索每个产品的信息。另一个有趣的 API 组合案例是 Netflix 视频网格

使用传统的异步回调方式来编写 API 组合代码会很快使你陷入回调地狱。代码将会变得杂乱、难以理解并且容易出错。一个更好的方式是使用响应式方法以声明式编写 API 网关代码。响应式抽象的例子包括 Scala 的 Future、Java 8 中的 CompletableFuture 和 JavaScript 中的 Promise。还有 Reactive Extensions(也称为 Rx 或 ReactiveX),最初由 Microsoft 为 .NET 平台开发。Netflix 为 JVM 创建了 RxJava,专门应用于其 API 网关。还有用于 JavaScript 的 RxJS,它可以在浏览器和 Node.js 中运行。使用响应式方式可让您能够编写出简单而高效的 API 网关代码。

2.5.3、服务调用

一个基于微服务的应用程序是一个分布式系统,必须使用一个进程间(inter-process)通信机制。有两种进程间通信方案。一是使用基于消息的异步机制。某些实现采用了消息代理,如 JMS 和 AMQP。其他采用无代理的方式直接与服务通信,如 Zeromq。

另一种类型的进程间通信采用了同步机制,如 HTTP 和 Thrift。系统通常会同时使用异步和同步方式。甚至可以为每种方式应用多个实现。因此,API 网关需要支持各种通信机制。

2.5.4、服务发现

API 网关需要知道与其通信的每个微服务的位置(IP 地址和端口)。在传统应用程序中,您可以将这些位置硬编码,但在现代基于云的微服务应用程序中,找到所需的位置不是一件简单的事情。

基础设施服务(比如消息代理)通常都有一个可以通过系统环境变量来指定的静态位置。但是,要确定应用程序服务的位置并不是那么容易。

应用服务可以动态分配位置。此外,由于自动扩缩和升级,一个服务的整组实例可以动态变更。因此,API 网关与系统中的任何其他服务客户端一样,需要使用系统的服务发现机制:服务端发现客户端发现第四章中更详细地描述了服务发现。现在需要注意的是,如果系统使用客户端发现,API 网关必须能够查询服务注册中心,该注册中心是所有微服务实例及其位置的数据库。

2.5.5、处理局部故障

实现 API 网关时必须解决的另一个问题是局部故障问题。当一个服务调用另一个响应缓慢或者不可用的服务时,所有分布式系统都会出现此问题。API 网关不应该无期限地等待下游服务。但是,如何处理故障问题取决于特定的方案和哪些服务发生故障。例如,如果推荐服务在获取产品详细信息时没有响应,API 网关应将其余的产品详细信息返回给客户端,因为它们对用户仍然有用。建议可以是空的,也可以用其他代替,例如硬编码的十强名单。然而,如果产品信息服务没有响应,那么 API 网关应该向客户端返回错误。

如果可以,API 网关还可以返回缓存数据。例如,由于产品价格变化不大,当价格服务不可用时,API 网关可以返回被缓存的价格数据。数据可以由 API 网关缓存或存储在外部缓存中,如 Redis 或 Memcached。API 网关通过返回默认数据或缓存数据,确保系统发生故障时最小程度上影响到用户体验。

Netflix Hystrix 是一个非常有用的库,用于编写调用远程服务代码。Hystrix 可以使超出指定阈值的调用超时。它实现了断路器模式,防止客户端不必要地等待无响应的服务。如果服务的错误率超过指定阈值,Hystrix 将会跳闸,所有请求将在指定的时间内立即失败。Hystrix 允许您在请求失败时定义回退操作,例如从缓存读取或返回默认值。如果您正在使用 JVM,那么您一定要考虑使用 Hystrix。如果您是在非 JVM 环境中运行,则应使用同等作用的库。

2.6、总结

对于大多数基于微服务的应用程序来说,实现一个 API 网关是很有意义的,API 网关充当着系统的单入口点,并且负责请求路由,组合和协议转换。它为每个应用程序客户端提供了一个自定义 API。API 网关还可以通过返回缓存或默认数据来掩盖后端服务故障。在下一章中,我们将介绍服务间的通信。

微服务实战:NGINX Plus 作为 API 网关

by Floyd Smith

本章讨论了如何将 API 网关作为系统的单入口点。它可以处理诸如负载均衡、缓存、监控和协议转换等其他功能 — 当 NGINX 充当反向代理服务器时,其可以作为系统的单入口点,并且支持所有提到的一个 API 网关具有的附加功能。因此使用 NGINX 作为 API 网关的主机可以很好地工作。

将 NGINX 作为 API 网关并不是本书最开始的想法。NGINX Plus 是一个用于管理和保护基于 HTTP 的 API 流量的领先平台。您可以实现自己的 API 网关或使用现有的 API 管理平台,其中许多使用了 NGINX。

使用 NGINX Plus 作为 API 网关的理由包括:

  • 访问管理

    上至典型的 Web 应用级别,下至每个个体微服务级别,您都可以使用各种访问控制列表(ACL)方法,并且可以轻松实现 SSL/TLS。

  • 可管理性与弹性

    您可以使用 NGINX 的动态重新配置 API、Lua 模块、Perl 来更新基于 NGINX Plus 的 API 服务器,也可以通过 Chef、Puppet、ZooKeeper 或 DNS 来改变。

  • 与第三方工具集成

    NGINX Plus 已经可以与某些先进的工具集成在一起,如 3scaleKongMuleSoft 集成平台(仅列举在 NGINX 网站上提及的工具)。

NGINX Plus 被广泛用作 NGINX 微服务参考架构中的 API 网关。您可以利用在这里收集的文章以及 MRA(微服务参考架构)来了解如何在您自己的应用程序中实现这一点。

转:《微服务:从设计到部署》中文版

1、微服务简介

如今微服务倍受关注:文章、博客、社交媒体讨论和会议演讲。微服务正在迅速朝着加德纳技术成熟度曲线(Gartner Hype cycle)的高峰前进。与此同时,也有持怀疑态度的软件社区人员认为微服务没什么新鲜可言。反对者声称它的思想只是面向服务架构(SOA)的重塑。然而,无论是炒作还是怀疑,不可否认,微服务架构模式具有非常明显的优势 — 特别是在实施敏捷开发和复杂的企业应用交付方面。

本书的七个章节主要介绍如何设计、构建和部署微服务,这是本书的第一章。在此章节中,您将了解到微服务的由来和与传统单体应用模式的对比。这本电子书描述了许多关于微服务架构方面的内容。无论是在项目意义还是实施方面,您都能了解到微服务架构模式的优点与缺点。

我们先来看看为什么要考虑使用微服务。

1.1、构建单体应用

我们假设,您开始开发一个打车应用,打算与 Uber 和 Hailo 竞争。经过初步交流和需求收集,您开始手动或者使用类似 Rails、Spring Boot、Play 或者 Maven 等平台来生成一个新项目。

该新应用有一个模块化的六边形架构,如图 1-1 所示:

图 1-1、一个简单的打车应用

该应用的核心是由模块实现的业务逻辑,它定义了服务、领域对象和事件。围绕核心的是与外部世界接口对接的适配器。适配器示例包括数据库访问组件、生产和消费消息的消息组件和暴露了 API 或实现了一个 UI 的 web 组件。

尽管有一个逻辑模块化架构,但应用程序被作为一个单体进行打包和部署。实际格式取决于应用程序的语言和框架。例如,许多 Java 应用程序被打包成 WAR 文件部署在如 Tomcat 或者 Jetty 之类的应用服务器上。其他 Java 应用程序被打包成自包含(self-contained)的可执行 JAR。类似地,Rails 和 Node.js 应用程序被打包为有目录层次的结构。

以这种风格编写的应用是很常见的。他们很容易开发,因为我们的 IDE 和其他工具就是专注于构建单体应用。这些应用程序也很容易测试,您可以通过简单地启动并使用如 Selenium 测试包来测试 UI 以轻松地实现端到端(end-to-end)测试。单体应用同样易于部署,你只需拷贝打包好的应用程序到服务器上。您还可以通过运行多个副本和结合负载均衡器来扩展应用。在项目的早期阶段,它可以良好运作。

1.2、走向单体地狱

不幸的是,这种简单的方法有很大的局限性。成功的应用有一个趋势,随着时间推移而变得越来越臃肿。您的开发团队在每个冲刺阶段都要实现更多的用户需求,这意味着需要添加许多行代码。几年之后,小而简单的应用将会逐渐成长成一个庞大的单体。为了给出一个极端示例,我最近和一位开发者做了交谈,他正在编写一个工具,该工具用于从他们的数百万行代码(lines of code,LOC)应用中分析出数千个 JAR 之间的依赖。我相信这是大量开发者在多年齐心协力下创造出了这样的野兽。

一旦您的应用程序成为了一个庞大、复杂的单体,您的开发组织可能会陷入了一个痛苦的境地,敏捷开发和交付的任何一次尝试都将原地徘徊。一个主要问题是应用程序实在非常复杂,其对于任何一个开发人员来说显得过于庞大,这是可以理解的。最终,正确修复 bug 和实现新功能变得非常困难而耗时。此外,这种趋势就像是往下的螺旋。如果基本代码都令人难以理解,那么改变也不会变得正确,您最终得到的将是一个巨大且不可思议的大泥球

应用程序的规模也将减缓发展。应用程序越大,启动时间越长。我调查过开发者们的单体应用的大小和性能,一些报告的启动时间为 12 分钟。我也听说过应用程序启动需要 40 分钟以上的怪事。如果开发人员经常要重启应用服务器,那么很大一部分时间都是在等待中度过,他们的生产力将受到限制。

另一个大问题是,复杂的单体应用本身就是持续部署的障碍。如今,SaaS 应用发展到了可以每天多次将变更推送到生产环境。这对于复杂的单体来说非常困难,因为您需要重新部署整个应用程序才能更新其中任何一部分。联想到我之前提到的漫长启动时间,这也不会是什么好事。此外,因变更所产生的影响通常不是很明确,您很可能需要做大量的手工测试。因此,持续部署是不可能做到的。

当不同模块存在资源需求冲突时,单体应用可能难以扩展。例如,一个模块可能会执行 CPU 密集型图像处理逻辑,理想情况下是部署在 Amazon EC2 Compute Optimized 实例中。另一个模块可能是一个内存数据库,最适合部署到 EC2 Memory-optimized 实例。然而,由于这些模块被部署在一起,您必须在硬件选择上做出妥协。

单体应用的另一个问题是可靠性。因为所有模块都运行在同一进程中。任何模块的一个 bug,比如内存泄漏,可能会拖垮整个进程。此外,由于应用程序的所有实例都是相同的,该错误将影响到整个应用的可用性。

最后但同样重要,单体应用使得采用新框架和语言变得非常困难。例如,我们假设您有 200 万行代码使用了 XYZ 框架编写。如果使用较新的 ABC 框架来重写整个应用,这将非常昂贵(在时间和成本方面),即使框架非常好。因此,这对于采用新技术是一个非常大的障碍。在项目开始时,您无论选择何种新技术都会感到困扰。

总结一下:您有一个成功的关键业务应用程序,它已经发展成为一个只有少数开发人员(如果有的话)能够理解的巨大单体。它使用了过时、非生产性技术编写,这使得招聘优秀开发人员变得非常困难。应用程序变得难以扩展,不可靠。因此敏捷开发和应用交付是不可能的。

那么您能做些什么呢?

1.3、微服务 — 解决复杂问题

许多如 Amazon、eBay 和 Netflix 这样的组织,已经采用现在所谓的微服务架构模式解决了这个问题,而不是构建一个臃肿的单体应用。它的思路是将应用程序分解成一套较小的互连服务。

一个服务通常实现了一组不同的特性或功能,例如订单管理、客户管理等。每一个微服务都是一个迷你应用,它自己的六边形架构包括了业务逻辑以及多个适配器。

一些微服务会暴露一个供其他微服务或应用客户端消费的 API。其他微服务可能实现了一个 web UI。在运行时,每个实例通常是一个云虚拟机(virtual machine,VM)或者一个 Docker 容器。

例如,前面描述的系统可能分解成如图 1-2 所示:

图 1-2、一个单体应用分解成微服务

应用程序的每个功能区域现在都由自己的微服务实现。此外,Web 应用程序被划分为一组更简单的应用。例如,以我们的出租车为例,一个是乘客的应用,一个是司机的应用。这使得它更容易地为特定的用户、司机、设备或者专门的用例部署不同的场景。每个后端服务暴露一个 REST API,大部分服务消费的 API 由其他服务提供。例如,Driver Management 使用了 Notification 服务器来通知可用司机一个可选路程。UI 服务调用了其他服务来渲染页面。服务也可以使用异步、基于消息的通信。本电子书后面将会更加详细介绍服务间通信。

一些 REST API 也暴露给移动端应用以供司机和乘客使用。然而,应用不能直接访问后端服务。相反,他们之间的通信是由一个称为 API 网关(API Gateway)的中介负责。API 网关负责负载均衡、缓存、访问控制、API 计量和监控,可以通过使用 NGINX 来实现第二章将详细讨论 API 网关。

图 1-3、开发和交付中的伸缩立方(Scale Cube)

微服务架构模式相当于此伸缩立方的 Y 轴坐标,此立方是一个来自《架构即未来》的三维伸缩模型。另外两个坐标轴是由运行多个相同应用程序副本的负载均衡器组成的 X 轴坐标和 Z 轴坐标(或数据分区),其中请求的属性(例如,一行记录的主键或者客户标识)用于将请求路由到特定的服务器。

应用程序通常将这三种类型的坐标方式结合一起使用。Y 轴坐标将应用分解成微服务,如图 1-2 所示。

在运行时,X 坐标轴上运行着服务的多个实例,每个服务配合负载均衡器以满足吞吐量和可用性。某些应用程序也有可能使用 Z 坐标轴来进行分区服务。图 1-4 展示了如何用 Docker 将 Trip Management 服务部署到 Amazon EC2 上运行。

图 1-4、使用 Docker 部署 Trip Management 服务

在运行时,Trip Management 服务由多个服务实例组成,每个服务实例是一个 Docker 容器。为了实现高可用,容器是在多个云虚拟机上运行的。服务实例之前是一个类似 NGINX 的负载均衡器,用于跨实例分发请求。负载均衡器也可以处理其他问题,如缓存访问控制API 度量监控

微服务架构模式明显影响到了应用程序与数据库之间的关系,与其他共享单个数据库模式(schema)服务有所不同,其每一个服务都有自己的数据库模式。一方面,这种做法与企业级数据库数据模型的想法相背,此外,它经常导致部分数据冗余。然而,如果您想从微服务中受益,每一个服务都应该有自己的数据库模式,因为它能实现松耦合。图 1-5 展示了数据库架构示例应用程序。

每个服务都拥有各自的数据库。而且,服务可以使用一种最适合其需求、号称多语言持久架构(polyglot persistence architecture)的数据库。例如,Driver Management,要找到与潜在乘客接近的司机,就必须使用支持高效地理查询的数据库。

图 1-5、打车应用的数据库架构

从表面上看,微服务架构模式类似于 SOA。微服务是由一组服务组成。然而,换另一种方式去思考微服务架构模式,它是没有商业化的 SOA,没有集成 Web 服务规范(WS-*)和企业服务总线(Enterprise Service Bus,ESB)。基于微服务的应用支持更简单、轻量级的协议,例如,REST,而不是 WS-*。他们也尽量避免使用 ESB,而是实现微服务本身具有类似 ESB 的功能。微服务架构也拒绝了 SOA 的其他部分,例如,数据访问规范模式概念。

1.4、微服务的优点

微服务架构模式有许多非常好的地方。第一,它解决了复杂问题。它把可能会变得庞大的单体应用程序分解成一套服务。虽然功能数量不变,但是应用程序已经被分解成可管理的块或者服务。每个服务都有一个明确定义边界的方式,如远程过程调用(RPC)驱动或消息驱动 API。微服务架构模式强制一定程度的模块化,实际上,使用单体代码来实现是极其困难的。因此,使用微服务架构模式,个体服务能被更快地开发,并更容易理解与维护。

第二,这种架构使得每个服务都可以由一个团队独立专注开发。开发者可以自由选择任何符合服务 API 契约的技术。当然,更多的组织是希望通过技术选型限制来避免完全混乱的状态。然而,这种自由意味着开发人员不再有可能在这种自由的新项目开始时使用过时的技术。当编写一个新服务时,他们可以选择当前的技术。此外,由于服务较小,使用当前技术重写旧服务将变得更加可行。

第三,微服务架构模式可以实现每个微服务独立部署。开发人员根本不需要去协调部署本地变更到服务。这些变更一经测试即可立即部署。比如,UI 团队可以执行 A|B 测试,并快速迭代 UI 变更。微服务架构模式使得持续部署成为可能。

最后,微服务架构模式使得每个服务能够独立扩展。您可以仅部署满足每个服务的容量和可用性约束的实例数目。此外,您可以使用与服务资源要求最匹配的硬件。例如,您可以在 EC2 Compute Optimized 实例上部署一个 CPU 密集型图像处理服务,并且在 EC2 Memory-optimized 实例上部署一个内存数据库服务。

1.5、微服务的缺点

就像 Fred Brooks 大约在 30 年前写的《人月神话》中说的,没有银弹。与其他技术一样,微服务架构模式也存在着缺点。其中一个缺点就是名称本身。微服务这个术语的重点过多偏向于服务的规模。事实上,有些开发者主张构建极细粒度的 10 至 100 LOC(代码行) 服务,虽然这对于小型服务可能比较好,但重要的是要记住,小型服务只是一种手段,而不是主要目标。微服务的目标在于充分分解应用程序以方便应用敏捷开发和部署。

微服务另一个主要缺点是由于微服务是一个分布式系统,其使得整体变得复杂。开发者需要选择和实现基于消息或者 RPC 的进程间通信机制。此外,由于目标请求可能很慢或者不可用,他们必须要编写代码来处理局部故障。虽然这些并不是很复杂、高深,但模块间通过语言级方法/过程调用相互调用,这比单体应用要复杂得多。

微服务的另一个挑战是分区数据库架构。更新多个业务实体的业务事务是相当普遍的。这些事务在单体应用中的实现显得微不足道,因为单体只存在一个单独的数据库。在基于微服务的应用程序中,您需要更新不同服务所用的数据库。通常不会选择分布式事务,不仅仅是因为 CAP 定理。他们根本不支持如今高度可扩展的 NoSQL 数据库和消息代理。您最后不得不使用基于最终一致性的方法,这对于开发人员来说更具挑战性。

测试微服务应用程序也很复杂。例如,使用现代框架如 Spring Boot,只需要编写一个测试类来启动一个单体 web 应用程序并测试其 REST API。相比之下,一个类似的测试类对于微服务来说需要启动该服务及其所依赖的所有服务,或者至少为这些服务配置存根。再次声明,虽然这不是一件高深的事情,但不要低估了这样做的复杂性。

微服务架构模式的另一个主要挑战是实现了跨越多服务变更。例如,我们假设您正在实现一个变更服务 A、服务 B 和 服务 C 的需求,其中 A 依赖于 B,且 B 依赖于 C。在单体应用程序中,您可以简单地修改相应的模块、整合变更并一次性部署他们。相反,在微服务中您需要仔细规划和协调出现的变更至每个服务。例如,您需要更新服务 C,然后更新服务 B,最后更新服务 A。幸运的是,大多数变更只会影响一个服务,需要协调的多服务变更相对较少。

部署基于微服务的应用程序也是相当复杂的。一个单体应用可以很容易地部署到基于传统负载均衡器的一组相同服务器上。每个应用程序实例都配置有基础设施服务的位置(主机和端口),比如数据库和消息代理。相比之下,微服务应用程序通常由大量的服务组成。例如,据 Adrian Cockcroft 了解到,Hailo 拥有 160 个不同的服务,Netflix 拥有的服务超过 600 个。

每个服务都有多个运行时实例。还有更多的移动部件需要配置、部署、扩展和监控。此外,您还需要实现服务发现机制,使得服务能够发现需要与之通信的任何其他服务的位置(主机和端口)。比较传统麻烦的基于票据(ticket-based)和手动的操作方式无法扩展到如此复杂程度。因此,要成功部署微服务应用程序,需要求开发人员能高度控制部署方式和高度自动化。

一种自动化方式是使用现成的平台即服务(PaaS),如 Cloud Foundry。PaaS 为开发人员提供了一种简单的方式来部署和管理他们的微服务。它让开发人员避开了诸如采购和配置 IT 资源等烦恼。同时,配置 PaaS 的系统人员和网络专业人员可以确保达到最佳实践以落实公司策略。

自动化微服务部署的另一个方式是开发自己的 PaaS。一个普遍的起点是使用集群方案,如 Kubernetes,与 Docker 等容器技术相结合。在本书最后我们将看到如 NGINX 的基于软件的应用交付方式是如何在微服务级别处理缓存、访问控制、API 计量和监控,这些可以帮助解决此问题。

1.6、总结

构建复杂的微服务应用程序本质上是困难的。单体架构模式只适用于简单、轻量级的应用程序,如果您使用它来构建复杂应用,您最终会陷入痛苦的境地。微服务架构模式是复杂、持续发展应用的一个更好的选择。尽管它存在着缺点和实现挑战。

在后面的章节中,我将介绍微服务架构的方方面面并探讨诸如服务发现、服务部署方案以及将单体应用重构为服务的策略。

微服务实战:NGINX Plus 作为反向代理服务器

By Floyd Smith

10000 个网站中有超过 50% 使用 NGINX,这主要是因为它具有作为反向代理服务器的能力。您可以把 NGINX 放在当前应用程序甚至是数据库服务器之前以获取各种功能 — 更高的性能、更高的安全性、可扩展性、灵活性等。你现有的应用程序只需要配置代码和作出很少或无需改变。然而,对于存在性能压力的站点,或者预计未来存在高负荷,使用 NGINX 的效果看起来可能没那么神奇。

那么这与微服务有什么关系呢?实现一个反向代理服务器,并使用 NGINX 的其他功能来为您提供架构灵活性,反向代理服务器、静态和应用文件缓存、SSL/TLS 和 HTTP/2 都将从您的应用程序剔除。让应用程序只做它该做的事,NGINX 还可作为负载均衡器,这是微服务实施过程中的一个关键角色。先进的 NGINX Plus 的功能包含了复杂的负载均衡算法、多种方式的会话持久和管理监控,这些对微服务尤其有用(NGINX 最近还增加了使用 DNS SRV 记录的服务发现支持,这是一个顶尖的功能)。而且,如本章所述,NGINX 可以自动化部署微服务。

此外,NGINX 还提供了必要的功能来支撑 NGINX 微服务参考架构中的三大模型。代理模型使用 NGINX 作为 API 网关;网格路由模型使用一个额外的 NGINX 作为进程间通信中枢;Fabric 模型中的每个微服务使用一个 NGINX 来控制 HTTP 流量,在微服务之间实现 SSL/TLS,这非常具有突破性。

转:《微服务:从设计到部署》中文版

前言

Floyd Smith

近年来,微服务在应用开发和部署方面取得了显著的进步。将应用开发或者重构成微服务以分离服务,通过 API 以明确的方式来相互“对话”。例如,每个微服务都是自包含(self-contained),各自维护自己的数据存储(这非常有意义),可以独立更新其他服务。

使用基于微服务的方式使得应用程序开发变得更快更容易管理,它只需要较少的人力就能实现更多的功能,可以更快更容易地部署。把应用程序设计成一套微服务,更加容易在多台具有负载均衡的服务器上运行,使其能够轻松应对需求高峰、由于时间推移而平稳增长的需求和由于硬件或者软件问题导致的宕机事故。

微服务的最大进步在于改变了我们的工作方式。敏捷软件开发技术、应用迁移云端、DevOps 文化、持续集成与持续部署(CI/CD)和容器应用都使用了微服务来革新应用开发与交付。

无论是作为反向代理还是高性能的 web 服务器,NGINX 软件都与微服务和上述列出的所有技术有着紧密联系。NGINX 使得基于微服务的应用更加易于开发,确保了微服务解决方案能顺利运行。

随着 NGINX 与微服务之间的关系日渐紧密,我们已经在 NGINX 网站上运行了一个由 Chris Richardson 所编写的七部分系列微服务。他很早就参与了设计与实现,他的博文主要涵盖了微服务应用设计与开发方面的内容,包括了如何从单体应用迁移至微服务。博文提供了关于微服务问题的全面概述,非常受欢迎。

在本书中,我们已经将全篇博文转换成章节,并在每一章节添加了尾栏以展示 NGINX 实现微服务的相关内容。如果您认真听取建议,您将解决许多潜在的开发时甚至是在编写代码之前可能会遇到的问题。此书在关于 NGINX 微服务参考架构 方面也是一本非常不错的书籍,其实现了以下提出的大部分理论。

本书章节:

  1. 微服务简介

    从被夸大的微服务概念到如何在创建和维护应用时部署微服务进行简单介绍。

  2. 使用 API 网关

    API 网关是整个微服务应用的单入口,它为每一个微服务提供了 API。NGINX Plus 可以很好地应用于 API 网关,提供了负载均衡和静态文件缓存等功能。

  3. 微服务架构中的进程间通信

    当把一个单体应用分解成几部分(微服务),他们就需要相互通信。事实上有许多进程间通信的方案可供您选择,包括表述性状态转义(REST)。本章将给出详细介绍。

  4. 微服务架构中的服务发现

    当服务运行在一个动态环境中,想要找到他们并不是一件简单的事情。

  5. 微服务事件驱动数据管理

    每个微服务维护着自己特有的数据展示与存储,而不是共享一个统一、跨越一个(或两个)单体应用的数据存储。虽然这能给予您很大的灵活性,但也可能导致变得复杂。本章可以帮助您理清这些问题。

  6. 选择微服务部署策略

    在 DevOps 世界中,您怎样做与您最初要做的事一样重要。Chris 讲解了微服务部署的主要模式,以便您可以为您的应用作出合理的选择,

  7. 重构单体应用为微服务

    在理想世界里,我们不会缺少时间与金钱,因此可以将核心软件转化为最新最好的技术、工具和方法。然而您可能会发现自己正在将一个单体应用转化为微服务,而且进展非常缓慢……。Chris 将在本章中为您讲解明智的做法。

我们认为您将会发现本书的每一章都是值得阅读的,我们希望当您在开发自己的微服务应用时,能应用到本书的内容。

Floyd Smith,NGINX 公司

转:《微服务:从设计到部署》中文版

  OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 。完成中继功能的节点通常称为中继系统。一个设备工作在哪一层,关键看它工作时利用哪一层的数据头部信息。网桥工作时,是以MAC头部来决定转发端口的,因此显然它是数据链路层的设备。具体说:

  • 物理层:网卡,网线,集线器,中继器,调制解调器

  • 数据链路层:网桥,交换机

  • 网络层:路由器

  • 网关工作在第四层传输层及其以上

  集线器是物理层设备,采用广播的形式来传输信息。

  交换机就是用来进行报文交换的机器。多为链路层设备(二层交换机),能够进行地址学习,采用存储转发的形式来交换报文.。

  路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。选择通畅快捷的近路,能大大提高通信速度,减轻网络系统通信负荷,节约网络系统资源,提高网络系统畅通率。

交换机的工作原理

  交换机拥有一条很高带宽的内部总线和内部交换矩阵。交换机的所有的端口都挂接在这条总线上,控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口,目的MAC若不存在则广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部MAC地址表中。 使用交换机也可以把网络“分段”,通过对照MAC地址表,交换机只允许必要的网络流量通过交换机。通过交换机的过滤和转发,可以有效的隔离广播风暴,减少误包和错包的出现,避免共享冲突。 交换机在同一时刻可进行多个端口对之间的数据传输。每一端口都可视为独立的网段,连接在其上的网络设备独自享有全部的带宽,无须同其他设备竞争使用。当节点A向节点D发送数据时,节点B可同时向节点C发送数据,而且这两个传输都享有网络的全部带宽,都有着自己的虚拟连接。总之,交换机是一种基于MAC地址识别,能完成封装转发数据包功能的网络设备。交换机可以”学习”MAC地址,并把其存放在内部地址表中,通过在数据帧的始发者和目标接收者之间建立临时的交换路径,使数据帧直接由源地址到达目的地址。

集线器

   集线器的英文称为“Hub”。集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它 工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理层”。集线器与网卡、网线等传输介质一样,属于局域网中的基础设备,采用 CSMA/CD(即带冲突检测的载波监听多路访问技术)介质访问控制机制。集线器每个接口简单的收发比特,收到1就转发1,收到0就转发0,不进行碰撞检 测。集线器属于纯硬件网络底层设备,基本上不具有类似于交换机的”智能记忆”能力和”学习”能力。它也不具备交换机所具有的MAC地址表,所以它发送数据 时都是没有针对性的,而是采用广播方式发送。也就是说当它要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节 点。HUB是一个多端口的转发器,当以HUB为中心设备时,网络中某条线路产生了故障,并不影响其它线路的工作。所以HUB在局域网中得到了广泛的应用。 大多数的时候它用在星型与树型网络拓扑结构中。

集线器的交换机的区别
  首先说HUB,也就是集线器。它的作用可以简单的理解为将一些机器连接起来组成一个局域网。而交换机(又名交换式集线器)作用与集线器大体相同。但是两者在性能上有区别:集线器采用的式共享带宽的工作方式,而交换机是独享带宽。这样在机器很多或数据量很大时,两者将会有比较明显的。

  • 工作位置不同。集线器工作在物理层,而交换机工作在数据链路层。

  • 工作方式不同。集线器是一种广播方式,当集线器的某个端口工作时其他端口都能收听到信息。交换机工作时端口互不影响。

  • 带宽不同。集线器是所有端口共享一条带宽,在同一时刻只能有两个端口传输数据;而交换机每个端口独占一条带宽。

  • 性能不同。交换机以MAC地址进行寻址,有一定额外的寻址开销;集线器以广播方式传输数据,流量小时性能下降不明显,适用于共享总线的局域网。

路由器与交换机的区别:
  总的来说,路由器与交换机的主要区别体现在以下几个方面:
  (1)工作层次不同。最初的的交换机是工作在数据链路层,而路由器一开始就设计工作在网络层。由于交换机工作在数据链路层,所以它的工作原理比较简单,而路由器工作在网络层,可以得到更多的协议信息,路由器可以做出更加智能的转发决策。
  (2)数据转发所依据的对象不同。交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。而路由器则是利用IP地址来确定数据转发的地址。IP地址是在软件中实现的,描述的是设备所在的网络。MAC地址通常是硬件自带的,由网卡生产商来分配的,而且已经固化到了网卡中去,一般来说是不可更改的。而IP地址则通常由网络管理员或系统自动分配。

  (3)传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域。由交换机连接的网段仍属于同一个广播域,广播数据包会在交换机连接的所有网段上传播,在某些情况下会导致通信拥挤和安全漏洞。连接到路由器上的网段会被分配成不同的广播域,广播数据不会穿过路由器。虽然第三层以上交换机具有VLAN功能,也可以分割广播域,但是各子广播域之间是不能通信交流的,它们之间的交流仍然需要路由器。
  (4)交换机负责同一个网段的通信,而路由器负责不同网段的通信。路由器提供了防火墙的服务。路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包传送和未知目标网络数据包的传送,从而可以防止广播风暴。

物理层   在OSI参考模型中,物理层(Physical Layer)是参考模型的最低层。物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

数据链路层   数据链路层(Data Link Layer)是OSI模型的第二层,负责建立和管理节点间的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。数据链路层的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。

网络层   网络层(Network Layer)是OSI模型的第三层,它是OSI参考模型中最复杂的一层。它在下两层的基础上向资源子网提供服务。其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺 序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题。

传输层
  传输层(Transport Layer)是OSI模型的第4层。因此该层是通信子网和资源子网的接口和桥梁,起到承上启下的作用。该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。该层常见的协议:TCP/IP中的TCP协议和UDP协议。传输层提供会话层和网络层之间的传输服务,这种服务从会话层获得数据,并在必要时,对数据进行分割。然后,传输层将数据传递到网络层,并确保数据能正确无误地传送到网络层。因此,传输层负责提供两节点之间数据的可靠传送,当两节点的联系确定之后,传输层则负责监督工作。综上,传输层的主要功能如下:监控服务质量。
会话层
  会话层(Session Layer)是OSI模型的第5层,是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层 的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。 用户可以按照半双工、单工和全双工的方式建立会话。当建立会话时,用户必须提供他们想要连接的远程地址。而这些地址与MAC(介质访问控制子层)地址或网络层的逻辑地址不同,它们是为用户专门设计的,更便于用户记忆。

表示层
  表示层(Presentation Layer)是OSI模型的第六层,它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。

应用层
  应用层(Application Layer)是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及 应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。
  

路由表
  路由表是指路由器或者其他互联网网络设备上存储的一张路由信息表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。路由表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以由主机控制。

  • 静态路由表:由系统管理员事先设置好固定的路由表称之为静态(static)路由表,一般是在系统安装时就根据网络的配置情况预先设定的,它不会随未来网络结构的改变而改变。

  • 动态路由表:动态(Dynamic)路由表是路由器根据网络系统的运行情况而自动调整的路由表。路由器根据路由选择协议(Routing Protocol)提供的功能,自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径。

  路由器通常依靠所建立及维护的路由表来决定如何转发。路由表能力是指路由表内所容纳路由表项数量的极限。路由表中的表项内容包括:

  • destination mask pre costdestination:目的地址,用来标识IP包的目的地址或者目的网络。

  • mask:网络掩码,与目的地址一起标识目的主机或者路由器所在的网段的地址。

  • pre:标识路由加入IP路由表的优先级。可能到达一个目的地有多条路由,但是优先级的存在让他们先选择优先级高的路由进行利用。

  • cost:路由开销,当到达一个目的地的多个路由优先级相同时,路由开销最小的将成为最优路由。

  • interface:输出接口,说明IP包将从该路由器哪个接口转发。 nexthop:下一跳IP地址,说明IP包所经过的下一个路由器。[1]

转:七层协议和四层协议

72法则:

72小时法则:当你决定做一件事的时候,你必须在72小时内完成它,否则,你很可能就永远不会再做了。

金融里面还有个”72法则“,如果你投资收益率在12%,你想知道多少年你的钱翻一番呢,那么 72/12=6年。

另外还有个“70法则”,比如 如果通胀率为3.5%,应用“70法则”,货币贬值一般的时间约为70/3.5=20年

鳄鱼法则:

这是经济学交易技术法则之一,也叫“鳄鱼效应”,它的意思是:假定一只鳄鱼咬住你的脚,如果你用手去试图挣脱你的脚,鳄鱼便会同时咬住你的脚与手。你愈挣扎,就被咬住得越多。所以,万一鳄鱼咬住你的脚,你唯一的办法就是牺牲一只脚,有点类似虎怒决蹯。

由于人性天生的弱点,时时不自觉地影响我们的操作,一次大亏,足以输掉前面99次的利润,所以严格遵守止损纪律便成为确保投资者在风险市场中生存的唯一法则。

止损是证券投资的一项基本功。也是美国投资界有一个有用而简单的交易法则,就是“鳄鱼法则”(Alligator Principle)。

手表定律:

手表定理是指一个人有一只表时,可以知道现在是几点钟,当他同时拥有两只表时,却无法确定。两只手表并不能告诉一个人更准确的时间,反而会让看表的人失去对准确时间的信心。

“手表定律”带给我们一种非常直观的启发:

对于任何一件事情,不能同时设置两个不同的目标,否则将使这件事情无法完成;

对于一个人,也不能同时选择两种不同的价值观,否则,他的行为将陷于混乱。一个人不能由两个以上的人来同时指挥,否则将使这个人无所适从;

而对于一个企业,更是不能同时采用两种不同的管理方法,否则将使这个企业无法发展。

当面临多块手表时,果断扔掉多余的手表,只留下一块,只选择一个导向。

21天效应:

在行为心理学中,人们把一个人的新习惯或新理念的形成并得以巩固至少需要21天的现象,称之为21天效应。也就是说,一个人的动作或想法,如果重复21天就会变成一个习惯性的动作或想法。

根据我国成功学专家易发久研究,习惯的形成大致分为三个阶段:

第一阶段:1-7天左右。此阶段表现为“刻意,不自然”,需要十分刻意地提醒自己。

第二阶段:7-21天左右。此阶段表现为“刻意,自然”,但还需要意识控制。

第三阶段:21-90天左右。此阶段表现为“不经意,自然”,无需意识控制

破窗理论:

一个房子如果窗户破了,没有人去修补,隔不久,其它的窗户也会莫名其妙地被人打破;一面墙,如果出现一些涂鸦没有被清洗掉,很快的,墙上就布满了乱七八糟、不堪入目的东西;一个很干净的地方,人们不好意思丢垃圾,但是一旦地上有垃圾出现之后,人就会毫不犹疑地抛,丝毫不觉羞愧。

木桶理论:

组成木桶的木板如果长短不齐,那么木桶的盛水量不是取决于最长的那一块木板,而是取决于最短的那一块木板。

蝴蝶效应:

“蝴蝶效应”是连锁效应的其中一种,其意思即一件表面上看来毫无关系、非常微小的事情,可能带来巨大的改变。此效应说明事物发展的结果,对初始条件具有极为敏感的依赖性,初始条件的极小偏差,将会引起结果的极大差异。

鲶鱼效应:

指通过引入强者,激发弱者变强的一种效应。在挪威,鲜活的沙丁鱼比急冻的要贵好几倍。有说,在当地长期以来只有一艘渔船能做到将鲜活的沙丁鱼带上岸。而个中秘诀,只有船长一人知道,而且始终没透露半句。船长离世后,渔民在他的渔获盛器中发现一条鲶鱼东游西窜,沙丁鱼为闪避它而改变其一贯的惰性,不停游动,以求保命,终得以存活下来。

刺猬法则:

两只困倦的刺猬,由于寒冷而拥在一起。可因为各自身上都长着刺,于是它们离开了一段距离,但又冷得受不了,于是凑到一起。几经折腾,两只刺猬终于找到一个合适的距离:既能互相获得对方的温暖而又不至于被扎。

刺猬法则主要是指人际交往中的“心理距离效应”。 运用到管理实践中,就是领导者如要搞好工作,应该与下属保持亲密关系,但这是“亲密有间”的关系,是一种不远不近的恰当合作关系。与下属保持心理距离,可以避免下属的防备和紧张,可以减少下属对自己的恭维、奉承、送礼、行贿等行为,可以防止与下属称兄道弟、吃喝不分。这样做既可以获得下属的尊重,又能保证在工作中不丧失原则。一个优秀的领导者和管理者,要做到“疏者密之,密者疏之”,这才是成功之道。

羊群效应:

“羊群效应”是指管理学上一些企业的市场行为的一种常见现象。经济学里经常用“羊群效应”来描述经济个体的从众跟风心理。羊群是一种很散乱的组织,平时在一起也是盲目地左冲右撞,但一旦有一只头羊动起来,其他的羊也会不假思索地一哄而上,全然不顾前面可能有狼或者不远处有更好的草。因此,“羊群效应”就是比喻人都有一种从众心理,从众心理很容易导致盲从,而盲从往往会陷入骗局或遭到失败。

生活中,很多时候我们不得不放弃自己的个性去“随大流”,因为我们每个人不可能对任何事情都了解得一清二楚,对于那些不太了解,没把握的事情,往往“随大流”。持某种意见人数多少是影响从众的最重要的一个因素,很少有人能够在众口一词的情况下,还坚持自己的不同意见。压力是另一个决定因素。在一个团体内,谁做出与众不同的行为,往往招致“背叛”的嫌疑,会被孤立,甚至受到惩罚,因而团体内成员的行为往往高度一致。

“羊群效应”告诉我们,许多时候,并不是谚语说的那样——“群众的眼睛是雪亮的”。在市场中的普通大众,往往容易丧失基本判断力。人们喜欢凑热闹、人云亦云。群众的目光还投向资讯媒体,希望从中得到判断的依据。但是,媒体人也是普通群众,不是你的眼睛,你不会辨别垃圾信息就会失去方向。所以,收集信息并敏锐地加以判断,是让人们减少盲从行为,更多地运用自己理性的最好方法。

青蛙效应:

青蛙效应(frog effect)是指把一只青蛙扔进开水里,它因感受到巨大的痛苦便会用力一蹬,跃出水面,从而获得生存的机会。当把一只青蛙放在一盆温水里并逐渐加热时,由于青蛙已慢慢适应了那惬意的水温,所以当温度已升高到一定程度时,青蛙便再也没有力量跃出水面了。于是,青蛙便在舒适之中被烫死了。

比尔·盖茨有一句名言:“微软离破产永远只有18个月。”企业要避免“温水煮蛙”现象,首先要求其最高管理层具备危机意识,企业才不致在战略上迷失方向,不经意之间滑入危机的泥潭之中

马太效应:

马太效应(Matthew Effect),是指好的愈好,坏的愈坏,多的愈多,少的愈少的一种现象。即两极分化现象。来自于圣经《新约•马太福音》中的一则寓言。

此术语后为经济学界所借用,反映贫者愈贫,富者愈富,赢家通吃的经济学中收入分配不公的现象。

帕金森定律:

帕金森定律是指企业在发展过程中往往会因业务的扩展或其他原因而出现的一种现象,这一效应使得企业的机构迅速膨胀资源浪费员工积极性下降。

帕金森定律告诉我们这样一个道理:不称职的行政首长一旦占据领导岗位,庞杂的机构和过多的冗员便不可避免,庸人占据着高位的现象也不可避免,整个行政管理系统就会形成恶性膨胀,陷入难以自拔的泥潭。这样就会在官场中形成类似的“鲜花”插在“牛粪”上的现象,鲜花就好比是那些公司中的领导职位,牛粪就是那些公司中平庸的领导者,而这种“鲜花”插在“牛粪”上的危害是极其大的。

晕轮效应:

晕轮效应最早是由美国著名心理学家爱德华·桑戴克于20世纪20年代提出的。他认为,人们对人的认知和判断往往只从局部出发,扩散而得出整体印象,也即常常以偏概全。一个人如果被标明是好的,他就会被一种积极肯定的光环笼罩,并被赋予一切都好的品质;如果一个人被标明是坏的,他就被一种消极否定的光环所笼罩,并被认为具有各种坏品质。

霍桑效应:

是心理学上的一种实验者效应,是指当被观察者知道自己成为被观察对象而改变行为倾向的反应。

罗森塔尔效应:

罗森塔尔效应,亦称“皮格马利翁效应”、“人际期望效应”,是一种社会心理效应,指的是教师对学生的殷切希望能戏剧性地收到预期效果的现象。

实验者认为,教师应收到实验者的暗示,不仅对名单上的学生抱有更高期望,而且有意无意地通过态度、表情、体谅和给予更多提问、辅导、赞许等行为方式,将隐含的期望传递给这些学生,学生则给老师以积极的反馈;这种反馈又激起老师更大的教育热情,维持其原有期望,并对这些学生给予更多关照。如此循环往复,以致这些学生的智力、学业成绩以及社会行为朝着教师期望的方向靠拢,使期望成为现实。

虚假同感偏差:

虚假同感偏差(false consensus bias),又叫虚假一致性偏差,指的是人们常常高估或夸大自己的信念、判断及行为的普遍性,它是人们坚信自己信念、判断正确性的一种方式。当遇到与此相冲突的信息时,这种偏差使人坚持自己的社会知觉。人们在认知他人时总好把自己的特性赋予他人身上,假定自己与他人是相同的,例如自己疑心重重,也认为他人疑心重重;自己好交际也认为别人好交际。

坏苹果法则:

如果把一个坏苹果留在一筐好苹果里,结果你将得到一筐烂苹果,这就是坏苹果法则。一个人的态度将影响到一个团队,如果想使你的企业成功,那么你就必须有一个积极进取的团队。坏苹果法则可以帮助你达到这样的目的。扔掉坏苹果,换上好苹果吧!因为一个人的恶劣态度会毁掉整个团队。

结局定律:

指有一个可怕的结局,也比不上没有任何结局可怕。

承诺定律:承诺未必能保证成功,但没有承诺也就没有成功.

混乱定律:遇到麻烦的时候,如果你还是那样谨小慎微,那麻烦就会变成混乱.

价值定律:

价值定律:R=P/SC

在供求系数S不变的情况下,价值R跟价格P成正比,跟成本C成反比;在成本C不变的情况下,价值R跟价格P成正比,跟供求系数S成反比;在价格P与成本C不变的情况下,(社会实际经济)价值R跟投资量i成正比,跟消费量b成反比。

酝酿效应:

不管是科学家还是一般人,在解决问题的过程中,我们都可以发现“把难题放在一边,放上一段时间,才能得到满意的答案”这一现象。心理学家将其称为“酝酿效应”。阿基米德发现浮力定律就是酝酿效应的经典故事。

日常生活中,我们常常会对一个难题束手无策,不知从何入手,这时思维就进入了“酝酿阶段”。直到有一天,当我们抛开面前的问题去做其他的事情时,百思不得其解的答案却突然出现在我们面前,令我们忍不住发出类似阿基米德的惊叹,这时,“酝酿效应”就绽开了“思维之花”,结出了“答案之果”。古代诗词说“山重水复疑无路,柳暗花明又一村”正是这一心理的写照。

心理学家认为,酝酿过程中,存在潜在的意识层面推理,储存在记忆里的相关信息在潜意识里组合,人们之所以在休息的时候突然找到答案,是因为个体消除了前期的心理紧张,忘记了个体前面不正确的、导致僵局的思路,具有了创造性的思维状态。因此,如果你面临一个难题,不妨先把它放在一边,去和朋友散步、喝茶,或许答案真的会“踏破铁鞋无觅处,得来全不费功夫”。

阿伦森效应:

阿伦森效应是指人们最喜欢那些对自己的喜欢、奖励、赞扬不断增加的人或物,最不喜欢那些显得不断减少的人或物。

巴纳姆效应:

巴纳姆效应(Barnum effect)是1948年由心理学家伯特伦·福勒通过试验证明的一种心理学现象,以杂技师巴纳姆的名字命名,认为每个人都会很容易相信一个笼统的、一般性的人格描述特别适合他。即使这种描述十分空洞,仍然认为反映了自己的人格面貌,哪怕自己根本不是这种人。

半途效应:

半途效应是指在激励过程中达到半途时,由于心理因素及环境因素的交互作用而导致的对于目标行为的一种负面影响。大量的事实表明,人的目标行为的中止期多发生在”半途”附近,在人的目标行为过程的中点附近是一个极其敏感和极其脆弱的活跃区域。

比马龙效应:

是指人(通常是指孩童或学生)在被赋予更高期望以后,他们会表现的更好的一种现象

边际效应:

是指每新增(或减少)一个单位的商品或服务,它对商品或服务的收益增加(或减少)的效用,也即是“效用──商品或服务量”图的斜率。经济学通常认为,随着商品或服务的量增加,边际效用将会逐步减少,称为边际效应递减定律。

超限效应:

超限效应是指剌激过多、过强或作用时间过久,从而引起心理极不耐烦或逆反的心理现象。

拆屋效应:

鲁迅先生曾于1927 年在《无声的中国》一文中写道:“中国人的性情总是喜欢调和、折中的,譬如你说,这屋子太暗,说在这里开一个天窗,大家一定是不允许的。但如果你主张拆掉屋顶,他们就会来调和,愿意开天窗了。”这种先提出很大的要求来,接着提出较小、较少的要求,在心理学上被称为“ 拆屋效应”。

拆屋效应也是在谈判中常用的和有效的技巧,有时候我们需要在谈判一开始就抛出一个看似无理而令对方难以接受的条件,但这却并不意味着我们不想继续谈判下去,而只代表着一种谈判的策略罢了。这是个非常有效的策略,它能让你在谈判一开始就占据着比较主动的地位,但记住这只是“拆屋”,如果想让谈判真正有所进展,不要忘记“开天窗”。所以,如果你的一个要求别人很难接受时,在此前你不妨试试提出个他更不可能接受的要求,或许你会有意外的收获。

淬火效应:

物理学上有一种现象:金属工件加热到一定温度后,浸入冷却剂中,经过冷却处理,工件的性能更好、更稳定。心理学把这定义为“淬火效应”。教育上也会有类似的现象,被称之为“冷处理”,也叫挫折教育。

得寸进尺效应:

一个人如果接受了别人的一个小要求,那么别人在此基础上再提一个更高点的要求,这个人也会倾向于接受。我们把这叫做“得寸进尺效应”。

定势效应:

定势效应是指有准备的心理状态能影响后继活动的趋向、程度以及方式。随着定势理论的发展,我们不仅可以用定势这个概念来解释人们在感觉、知觉、记忆、思维等方面的倾向,也可用这一概念解释人们在社会态度方面的倾向。仪表、相貌的定势效应主要表现为刻板效应和晕轮效应。

多看效应:

这种对越熟悉的东西越喜欢的现象,心理学上称为“多看效应”。多看效应不仅仅是在心理学实验中才出现,在生活中,我们也常常能发现这种现象。如果你细心观察就会发现,那些人缘好的人,往往将这种“多看效应”发挥得淋漓尽致:他们善于制造双方接触的机会,从而提高彼此间的熟悉度,互相产生更强的吸引力。在我们新认识的人中,有时会有相貌不佳的人,最初,我们可能会觉得这个人难看,可是在多次见到此人之后,逐渐就不觉得他难看了,有时甚至会觉得他在某些方面很有魅力。

首因效应:

指人们倾向于对首先见到的事物和最后见到的事物有更好的印象。分为首因效应和近因效应。

首因效应又称优先效应,是对“第一印象”或“先入为主”所产生的心理学现象,指在行为过程中,最先接触的事物会给人留下深刻的认知或感知,影响人对事物的感知和判断。

近因效应指在行为过程中,对事物的最近一次接触给人留下深刻的感知或认知,能对优先效应所形成的心理作用起到巩固、维持、否定、修改或调整等作用,在时间上与下一次购买决策最为接近,因此正或负的近因效应能促进或阻滞购买行为。

近因效应:

所谓“近因”,是指个体最近获得的信息。

所谓近因效应:与首因效应相反,是指在多种刺激一次出现的时候,印象的形成主要取决于后来出现的刺激,即交往过程中,我们对他人最近、最新的认识占了主体地位,掩盖了以往形成的对他人的评价,因此,也称为“新颖效应”。多年不见的朋友,在自己的脑海中的印象最深的,其实就是临别时的情景;一个朋友总是让你生气,可是谈起生气的原因,大概只能说上两、三条,这也是一种近因效应的表现。在学习和人际交往中,这两种现象很常见。

受近因效应的影响,有的思想政治工作者往往改变原有看法,作出错误判断,如有的企业组织一直软弱痪散最近因某职工见义勇为受到媒体和上级的表扬,就被认为一贯重视思想政治教育,用近期一时一事来肯定或否定一个企业的全面工作,很容易片面、失误。

凡勃伦效应:

美国经济学家凡勃伦提出凡勃伦效应:商品价格定得越高越能畅销。它是指消费者对一种商品需求的程度因其标价较高而不是较低而增加。它反映了人们进行挥霍性消费的心理愿望。

共生效应:

自然界有这样一种现象:当一株植物单独生长时,显得矮小、单调,而与众多同类植物一起生长时,则根深叶茂,生机盎然。人们把植物界中这种相互影响、相互促进的现象,称之为“共生效应”

人才的“共生效应”有两方面的含义:

一是指引入一个杰出人才,可以使四方贤才纷至沓来,进而逐渐形成一个人才群体,这是以人才引人才、挖掘人才的一条规律。认识和运用这条规律,可为组织赢得巨大的效益。

二是指在一个人才荟萃的群体中,人才间的互相交流、信息传递、互相影响往往会极大促进人才与群体的提高。因此,群体的组织者应当充分运用并不断强化“共生效应”,形成一个吸引人才、利于人才成长与脱颖而出的群体。如英国卡文迪许实验室、美国的贝尔实验室等,在那里工作过的科学家先后有获诺贝尔奖的人。因此,我们从中可以得到这样一个启迪,组织的领导者应充分利用并不断强化人才的共生效应,形成一个吸引人才、利于人才成长与脱颖而出的群体。

黑暗效应:

在光线比较暗的场所,约会双方彼此看不清对方表情,就很容易减少戒备感而产生安全感。在这种情况下,彼此产生亲近的可能性就会远远高于光线比较亮的场所。心理学家将这种现象称之为“黑暗效应”。

棘轮效应:

所谓棘轮效应,又称制轮作用,是指人的消费习惯形成之后有不可逆性,即易于向上调整,而难于向下调整。尤其是在短期内消费是不可逆的,其习惯效应较大。这种习惯效应,使消费取决于相对收入,即相对于自己过去的高峰收入。消费者易于随收入的提高增加消费,但不易于收入降低而减少消费,以致产生有正截距的短期消费函数。这种特点被称为棘轮效应

奖惩效应:

惩罚时用语要得体、适度、就事论事,使学生明白为什么受罚和怎样改过。同时还应注意的是奖惩的频率,从心理学的研究结果看,当奖惩的比例为5:1时往往效果最好。

结伴效应:

结伴效应所属现代词,指的是在结伴活动中,个体会感到某种社会比较的压力,从而提高工作或活动效率。

空白效应:

“空白效应”是关于艺术作品审美欣赏的概念。它指的是作品留给读者想象和再创造的空间,读者可以凭借自身的文化素养,展开思维羽翼去思考,从而获得对作品更深层次的理解和把握。

中国有个句子叫:“此时无声胜有声”。它是指在特定的环境中,语言变得苍白无力,人们早已从作者描绘的场景,人物的心理活动、行为举止了解作者所表达的思想感情。在演讲的过程中,适当地留一些空白,会取得良好的演讲效果,这就是空白效应。

本杰明富兰克林效应:

让别人喜欢你的最好方法不是去帮助他们,而是让他们来帮助你。如果想得到别人的好感,主动开口是没坏处的。因此,千万不要“怕麻烦别人”,其实那些曾经帮助过你的人会更愿意再帮你一次。

史密斯原则:

史密斯原则,是美国通用汽车公司前董事长约翰·史密斯提出的一条著名的策略型原则。即“如果你不能战胜他们,你就加入到他们之中去”。没有永远的敌人,只有永远的利益。无论是合作还是竞争,说到底都是为了利益。传统的企业竞争通常是采取一切可能的手段击败竞争对手,将其逐出市场;企业的成功是以竞争对手的失败和消失为基础,“有你无我,势不两立”是市场通行的竞争规则。在新的形势下,传统的竞争方式发生了根本的变化,企业为了自身的生存和发展,需要与竞争对手进行合作,建立战略联盟,即为竞争而合作,靠合作来竞争。

鸟笼逻辑:

人们绝大部分的时候是采取惯性思维。挂一个美丽的鸟笼在房间里最显眼之处,过不了几天,主人必定会做出下面两个选择之一:把鸟笼扔掉,或者买一只鸟回来放在鸟笼里,因为这比无休无止的解释和说明要轻易得多。这就是鸟笼逻辑。

责任分散效应:

责任分散效应也称为旁观者效应,是指对某一件事来说,如果是单个个体被要求单独完成任务,责任感就会很强,会作出积极的反应。但如果是要求一个群体共同完成任务,群体中的每个个体的责任感就会很弱,面对困难或遇到责任往往会退缩。因为前者独立承担责任,后者期望别人多承担点儿责任。“责任分散”的实质就是人多不负责,责任不落实。

美人效应:

美人效应是指是成本效应。用好它也是成本管理中的一个要点。美人效应来源于一个故事:罗马一家自助餐厅的老板想出一个赚小费的妙计。他请来一位非常漂亮的姑娘,坐在柜台边收钱,以便使男客们神魂颠倒,慷慨解囊。

谁知那位姑娘上班后没过几天,就对老板说:“我想,我不如以前漂亮了。”老板忙问:“这是怎么回事呢?”“现在,所有的男客都在柜台边反复地数找给他们的零钱。”美人效应在这里发挥的作用正是挖掘潜在消费和增加客人满意程度,增强餐厅的竞争优势,从而留住客人。

潘多拉效应:

古希腊有个神话,说宙斯给一个名叫潘多拉的女孩一个盒子,告诉她绝对不能打开。“为什么不能打开?还要‘绝对’?里面该不是稀世珍宝吧?”潘多拉越想越好奇,越想揭开真相。憋了一段时间后,她终于把盒子打开了。谁知盒子里装的是人类的全部罪恶,结果让它们都跑到人间了。心理学把这种“不禁不为、愈禁愈为”的现象,叫“潘多拉效应”或“禁果效应”。潘多拉效应的心理实质是好奇心和逆反心理在起作用。

冷热水效应:

一杯温水,保持温度不变,另有一杯冷水,一杯热水。当先将手放在冷水中,再放到温水中,会感到温水热;当先将手放在热水中,再放到温水中,会感到温水凉。同一杯温水,出现了两种不同的感觉,这就是冷热水效应。这种现象的出现,是因为人人心里都有一杆秤,只不过是秤砣并不一致,也不固定。随着心理的变化,秤砣也在变化。当秤砣变小时,它所称出的物体重量就大,当秤砣变大时,它所称出的物体重量就小。人们对事物的感知,就是受这秤砣的影响。人际交往中,要善于运用这种冷热水效应。

马斯洛需求层次理论:

马斯洛需求层次理论是人本主义科学的理论之一,由美国心理学家亚伯拉罕·马斯洛在1943年在《人类激励理论》论文中所提出。书中将人类需求像阶梯一样从低到高按层次分为五种,分别是:生理需求、安全需求、社交需求、尊重需求和自我实现需求。

图片来自网络

卢维斯定理:

谦虚不是把自己想得很糟,而是完全不想自己。

如果把自己想得太好,就很容易将别人想得很糟。

托利得定理:

测验一个人的智力是否属于上乘,只看脑子里能否同时容纳两种相反的思想而无碍于其处世行事。

长尾效应:

长尾效应的根本就是要强调”个性化”,”客户力量”和”小利润大市场”,也就是要赚很少的钱,但是要赚很多人的钱.要将市场细分到很细很小的时候,然后就会发现这些细小市场的累计会带来明显的长尾的效应.

二八法则:

19世纪末20世纪初意大利的经济学家巴莱多认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的。社会约80%的财富集中在20%的人手里,而80%的人只拥有20%的社会财富。这种统计的不平衡性在社会、经济及生活中无处不在,这就是二八法则。

二八法则告诉我们,不要平均地分析、处理和看待问题,企业经营和管理中要抓住关键的少数;要找出那些能给企业带来80%利润、总量却仅占20%的关键客户,加强服务,达到事半功倍的效果;企业领导人要对工作认真分类分析,要把主要精力花在解决主要问题、抓主要项目上。

墨菲定律:

任何事都没有表面看起来那么简单;所有的事都会比你预计的时间长;会出错的事总会出错;如果你担心某种情况发生,那么它就更有可能发生。

康威定律:

软件产品领域应用较广。说系统的设计受制于组织本身交流的架构。什么样的组织,什么样的沟通方式,就会产生什么样的设计,什么样的架构,什么样的系统。换句话说,公司开发的产品或服务其实就是公司自身组织架构、沟通与工作方式的反映

冰山理论:

冰山理论:是萨提亚家庭治疗中的重要理论,实际上是一个隐喻,它指一个人的“自我”就像一座冰山一样,我们能看到的只是表面很少的一部分——行为,而更大一部分的内在世界却藏在更深层次,不为人所见,恰如冰山。包括行为、应对方式、感受、观点、期待、渴望、自我七个层次。

图片来自网络

原文地址:你要的理论、法则、定律、效应都在这里了

打印机在生活中处处可见,白领的书面文件,学生的考试卷等,都是打印机的功劳。那么你知道现在市面上出售的打印机主要有哪几种吗?今天小编就来介绍一下打印机的种类。

目前常用的打印机主要有喷墨式、热敏式、激光式打印机。

一、喷墨式打印机

喷墨式打印机是应用最广泛的打印机。其基本原理是带电的喷墨雾点,直接在纸上形成所需字形。可灵活方便地改变字符尺寸和字体。

喷墨打印机按工作原理可分为固体喷墨和液体喷墨两种。而液体喷墨方式又可分为气泡式(canon和hp)与液体压电式(epson)。气泡技术(bubble jet)是通过加热喷嘴,使墨水产生气泡,喷到打印介质上的。

喷墨式打印机

二、热敏式打印机

热敏打印机的工作原理是打印头上安装有半导体加热元件,打印头加热并接触热敏打印纸后就可以打印出需要的图案,其原理与热敏式传真机类似。图像是通过加热,在膜中产生化学反应而生成的。这种热敏打印机化学反应是在一定的温度下进行的。高温会加速这种化学反应。当温度低于60℃时,纸需要经过相当长,甚至长达几年的时间才能变成深色;而当温度为200℃时,这种反映会在几微秒内完成。

热敏式打印机主要特点是无噪声,结构轻而小,印字清晰。缺点是速度慢,字迹保存性差。

热敏式打印机

三、激光打印机

激光打印机脱胎于80年代末的激光照排技术,流行于90年代中期。它是将激光扫描技术和电子照相技术相结合的打印输出设备。其基本工作原理是由计算机传来的二进制数据信息,通过视频控制器转换成视频信号,再由视频接口/控制系统把视频信号转换为激光驱动信号,然后由激光扫描系统产生载有字符信息的激光束,是由电子照相系统使激光束成像并转印到纸上。较其他打印设备,激光打印机有打印速度快、成像质量高等优点;但使用成本相对高昂。

主要优点是打印速度高,可达20000行/分以上。印字的质量高,噪声小,可采用普通纸,可印刷字符、图形和图像。

激光打印机

四、针式打印机

针式打印机在打印机历史的很长一段时间上曾经占有着重要的地位,从9针到24针,可以说针式打印机的历史贯穿着这几十年的始终。针式打印机之所以在很长的一段时间内能长时间的流行不衰,这与它极低的打印成本和很好的易用性以及单据打印的特殊用途是分不开的。当然,它很低的打印质量、很大的工作噪声也是它无法适应高质量、高速度的商用打印需要的根结,所以现在只有在银行、财务、税务、邮政等需要打印多联票据的地方还可以看见它的踪迹。通常售价都在千元以上,后期使用成本很低。
激光打印机