27
27
28
28
[ Netflix OSS] ( https://netflix.github.io/ ) 提供了一个很好的客户端发现模式示例。[ Netflix Eureka] ( https://github.com/Netflix/eureka ) 是一个服务注册中心,它提供了一个用于管理服务实例注册和查询可用实例的 REST API。[ Netflix Ribbon] ( https://github.com/Netflix/ribbon ) 是一个 IPC 客户端,可与 Eureka 一起使用,用于在可用服务实例之间使请求负载均衡。本章稍后将讨论 Eureka。
29
29
30
- 客户端发现模式存在各种优点与缺点。该模式相对比较简单,除了服务注册中心,没有其他移动部件。此外,由于客户端能发现可用的服务实例,因此可以实现智能的, 特定于应用程序的负载均衡决策,比如使用一致性哈希。该模式的一个重要缺点是它将客户端与服务注册中心耦合在一起。您必须为服务客户端使用的每种编程语言和框架实现客户端服务发现逻辑。
30
+ 客户端发现模式存在各种优点与缺点。该模式相对比较简单,除了服务注册中心,没有其他移动部件。此外,由于客户端能发现可用的服务实例,因此可以实现智能的、 特定于应用程序的负载均衡决策,比如使用一致性哈希。该模式的一个重要缺点是它将客户端与服务注册中心耦合在一起。您必须为服务客户端使用的每种编程语言和框架实现客户端服务发现逻辑。
31
31
32
- 现在我们已经了解了客户端发现,接下来让我们看看服务器端发现 。
32
+ 现在我们已经了解了客户端发现,接下来让我们看看服务端发现 。
33
33
34
34
<a id =" the-server-side-discovery-pattern " ></a >
35
35
36
36
## 4.3、服务端发现模式
37
37
服务发现的另一种方式是服务端发现模式。图 4-3 展示了该模式的结构:
38
38
39
- ![ 服务器间处理也可以处理服务发现 ] ( resources/4-3.png )
39
+ ![ 服务器间也可以处理服务发现 ] ( resources/4-3.png )
40
40
41
41
客户端通过负载均衡器向服务发出请求。负载均衡器查询服务注册中心并将每个请求路由到可用的服务实例。与客户端发现一样,服务实例由服务注册中心注册与销毁。
42
42
43
- [ AWS Elastic Load Balancer] ( https://aws.amazon.com/cn/elasticloadbalancing/ ) (ELB)是一个服务端发现路由示例。ELB 通常用于负载均衡来自互联网的外部流量。然而,您还可以使用 ELB 来负载均衡虚拟私有云(VPC)内部的流量。客户端通过 ELB 使用其 DNS 名称来发送请求(HTTP 或 TCP)。ELB 负载均衡一组已注册的 Elastic Compute Cloud(EC2)实例或 EC2 Container Service(ECS)容器之间的流量。这里没有单独可见的服务注册中心。相反,EC2 实例 与 ECS 容器由 ELB 本身注册。
43
+ [ AWS Elastic Load Balancer] ( https://aws.amazon.com/cn/elasticloadbalancing/ ) (ELB)是一个服务端发现路由示例。ELB 通常用于负载均衡来自互联网的外部流量。然而,您还可以使用 ELB 来负载均衡虚拟私有云(VPC)内部的流量。客户端通过 ELB 使用其 DNS 名称来发送请求(HTTP 或 TCP)。ELB 负载均衡一组已注册的 Elastic Compute Cloud(EC2)实例或 EC2 Container Service(ECS)容器之间的流量。这里没有单独可见的服务注册中心。相反,EC2 实例与 ECS 容器由 ELB 本身注册。
44
44
45
- HTTP 服务器和负载均衡器(如 [ NGINX Plus] ( https://www.nginx.com/products/ ) 和 NGINX)也可以作为服务端发现负载均衡器。例如,[ 此博文] ( https://www.airpair.com/scalable-architecture-with-docker-consul-and-nginx ) 描述了使用 [ Consul Template] ( https://www.hashicorp.com/blog/introducing-consul-template.html ) 动态重新配置 NGINX 反向代理。Consul Template 是一个工具,可以从存储在 [ Consul 服务注册中心] ( https://www.consul.io/ ) 中的配置数据中定期重新生成任意配置文件。每当文件被更改时,它都会运行任意的 shell 命令。在列举的博文描述的示例中,Consul Template 会生成一个 nginx.conf 文件,该文件配置了反向代理,然后通过运行一个命令告知 NGINX 重新加载配置的命令 。更复杂的实现可以使用其 [ HTTP API 或 DNS] ( https://www.nginx.com/products/on-the-fly-reconfiguration/ ) 动态重新配置 NGINX Plus。
45
+ HTTP 服务器和负载均衡器(如 [ NGINX Plus] ( https://www.nginx.com/products/ ) 和 NGINX)也可以作为服务端发现负载均衡器。例如,[ 此博文] ( https://www.airpair.com/scalable-architecture-with-docker-consul-and-nginx ) 描述了使用 [ Consul Template] ( https://www.hashicorp.com/blog/introducing-consul-template.html ) 动态重新配置 NGINX 反向代理。Consul Template 是一个工具,可以从存储在 [ Consul 服务注册中心] ( https://www.consul.io/ ) 中的配置数据中定期重新生成任意配置文件。每当文件被更改时,它都会运行任意的 shell 命令。在列举的博文描述的示例中,Consul Template 会生成一个 nginx.conf 文件,该文件配置了反向代理,然后通过运行一个命令告知 NGINX 重新加载配置 。更复杂的实现可以使用其 [ HTTP API 或 DNS] ( https://www.nginx.com/products/on-the-fly-reconfiguration/ ) 动态重新配置 NGINX Plus。
46
46
47
- 某些部署环境(如 [ Kubernetes] ( https://kubernetes.io/ ) 和 [ Marathon] ( https://mesosphere.github.io/marathon/docs/service-discovery-load-balancing.html ) )在群集中的每个主机上运行着一个代理。这些代理扮演着服务端发现负载均衡器角色。为了向服务发出请求,客户端通过代理使用主机的 IP 地址和服务的分配端口来路由请求。然后 ,代理将请求透明地转发到在集群中某处运行的可用服务实例。
47
+ 某些部署环境(如 [ Kubernetes] ( https://kubernetes.io/ ) 和 [ Marathon] ( https://mesosphere.github.io/marathon/docs/service-discovery-load-balancing.html ) )在群集中的每个主机上运行着一个代理。这些代理扮演着服务端发现负载均衡器角色。为了向服务发出请求,客户端通过代理使用主机的 IP 地址和服务的分配端口来路由请求。之后 ,代理将请求透明地转发到在集群中某处运行的可用服务实例。
48
48
49
- 服务端发现模式有几个优点与缺点。该模式的一个很大的优点是发现的细节从客户端抽象出来 。客户端只需向负载均衡器发出请求。这消除了为服务客户端使用的每种编程语言和框架都实现发现逻辑的必要性。另外,如上所述,一些部署环境免费提供此功能。然而,这种模式存在一些缺点。除非负载均衡器由部署环境提供,否则您需要引入这个高可用系统组件,并进行设置和管理。
49
+ 服务端发现模式有几个优点与缺点。该模式的一大的优点是其把发现的细节从客户端抽象出来 。客户端只需向负载均衡器发出请求。这消除了为服务客户端使用的每种编程语言和框架都实现发现逻辑的必要性。另外,如上所述,一些部署环境免费提供此功能。然而,这种模式存在一些缺点。除非负载均衡器由部署环境提供,否则您需要引入这个高可用系统组件,并进行设置和管理。
50
50
51
51
<a id =" the-service-registry " ></a >
52
52
@@ -57,13 +57,13 @@ HTTP 服务器和负载均衡器(如 [NGINX Plus](https://www.nginx.com/produc
57
57
58
58
Netflix 通过在每个 Amazon EC2 可用性区域(Availability Zone)中运行一个或多个 Eureka 服务器来[ 实现高可用] ( https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud ) 。每个 Eureka 服务器都运行在具有一个 [ Elastic IP 地址] ( http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html ) 的 EC2 实例上。DNS TEXT 记录用于存储 Eureka 集群配置,这是一个从可用性区域到 Eureka 服务器的网络位置列表的映射。当 Eureka 服务器启动时,它将会查询 DNS 以检索 Eureka 群集配置,查找其对等体,并为其分配一个未使用的 Elastic IP 地址。
59
59
60
- 经过 Eureka 客户端 — 服务与服务客户端 — 查询 DNS 以发现 Eureka 服务器的网络位置。客户端优先使用相同可用性区域中的 Eureka 服务器,如果没有可用的,则使用另一个可用性区域的 Eureka 服务器。
60
+ Eureka 客户端 — 服务与服务客户端 — 查询 DNS 以发现 Eureka 服务器的网络位置。客户端优先使用相同可用性区域中的 Eureka 服务器,如果没有可用的,则使用另一个可用性区域的 Eureka 服务器。
61
61
62
62
以下列举了其他服务注册中心:
63
63
64
64
- ** [ etcd] ( https://github.com/coreos/etcd ) **
65
65
66
- 一个用于共享配置和服务发现的高可用、分布式和一致的键值存储。使用 etcd 的两个著名项目分别为 Kubernetes 和 [ Cloud Foundry] ( http://pivotal.io/platform ) 。
66
+ 一个用于共享配置和服务发现的高可用、分布式和一致的键值存储。使用了 etcd 的两个著名项目分别为 Kubernetes 和 [ Cloud Foundry] ( http://pivotal.io/platform ) 。
67
67
- ** [ Consul] ( https://www.consul.io/ ) **
68
68
69
69
一个发现与配置服务工具。它提供了一个 API,可用于客户端注册与发现服务。Consul 可对服务进行健康检查,以确定服务的可用性。
@@ -104,15 +104,15 @@ Netflix 通过在每个 Amazon EC2 可用性区域(Availability Zone)中运
104
104
105
105
![ 图 4-5、一个单独的服务注册器可负责注册其他服务] ( resources/4-5.png )
106
106
107
- 服务注册器的一个例子是开源的 [ Registrator] ( https://github.com/gliderlabs/registrator ) 项目 。它可以自动注册和注销作为 Docker 容器部署的服务实例。注册器支持多个服务注册中心,包括 etcd 和 Consul。
107
+ 开源的 [ Registrator] ( https://github.com/gliderlabs/registrator ) 项目是一个很好的服务注册器示例 。它可以自动注册和注销作为 Docker 容器部署的服务实例。注册器支持多个服务注册中心,包括 etcd 和 Consul。
108
108
109
- 服务注册器的另一个例子是 [ NetflixOSS Prana] ( https://github.com/Netflix/Prana ) 。其主要用于非 JVM 语言编写的服务,它是一个与服务实例并行运行的侧中应用。Prana 使用了 Netflix Eureka 来注册和注销服务实例。
109
+ 另一个服务注册器例子是 [ NetflixOSS Prana] ( https://github.com/Netflix/Prana ) 。其主要用于非 JVM 语言编写的服务,它是一个与服务实例并行运行的侧中应用。Prana 使用了 Netflix Eureka 来注册和注销服务实例。
110
110
111
111
服务注册器在部分部署环境中是一个内置组件。Autoscaling Group 创建的 EC2 实例可以自动注册到 ELB。Kubernetes 服务将自动注册并提供发现。
112
112
113
113
第三方注册模式同样有好有坏。一个主要的好处是服务与服务注册中心之间解耦。您不需要为开发人员使用的每种编程语言和框架都实现服务注册逻辑。相反,仅需要在专用服务中以集中的方式处理服务实例注册。
114
114
115
- 该模式的一个缺点是,除非部署环境内置,否则您同样需要引入这样的一个高可用的系统组件 ,并进行设置和管理。
115
+ 该模式的一个缺点是,除非部署环境内置,否则您同样需要引入这样一个高可用的系统组件 ,并进行设置和管理。
116
116
117
117
<a id =" summary " ></a >
118
118
@@ -123,28 +123,28 @@ Netflix 通过在每个 Amazon EC2 可用性区域(Availability Zone)中运
123
123
124
124
有两种主要的服务发现模式:客户端发现与服务端发现。在使用了客户端服务发现的系统中,客户端查询服务注册中心,选择一个可用实例并发出请求。在使用了服务端发现的系统中,客户端通过路由进行请求,路由将查询服务注册中心,并将请求转发到可用实例。
125
125
126
- 服务实例在服务注册中心中注册与注销有两种主要方式。一个是服务实例向服务注中心自我注册,即[ 自注册模式] ( http://microservices.io/patterns/self-registration.html ) 。另一个是使用他系统组件代表服务完成注册与注销 ,即[ 第三方注册模式] ( http://microservices.io/patterns/3rd-party-registration.html ) 。
126
+ 服务实例在服务注册中心中注册与注销有两种主要方式。一个是服务实例向服务注中心自我注册,即[ 自注册模式] ( http://microservices.io/patterns/self-registration.html ) 。另一个是使用其他系统组件代表服务完成注册与注销 ,即[ 第三方注册模式] ( http://microservices.io/patterns/3rd-party-registration.html ) 。
127
127
128
- 在某些部署环境中,您需要使用如 [ Netflix Eureka] ( https://github.com/Netflix/eureka ) 或 [ Apache ZooKeeper] ( http://zookeeper.apache.org/ ) 等服务注册中心来设置您自己的服务发现基础设施。在其他部署环境中,服务发现是内置的,例如,[ Kubernetes] ( https://kubernetes.io/ ) 和 [ Marathon] ( https://mesosphere.github.io/marathon/docs/service-discovery-load-balancing.html ) ,可以处理服务实例的注册与注销。他们还在每一个扮演服务端发现路由器角色的集群主机上运行一个代理 。
128
+ 在某些部署环境中,您需要使用如 [ Netflix Eureka] ( https://github.com/Netflix/eureka ) 或 [ Apache ZooKeeper] ( http://zookeeper.apache.org/ ) 等服务注册中心来设置您自己的服务发现基础设施。在其他部署环境中,服务发现是内置的,例如,[ Kubernetes] ( https://kubernetes.io/ ) 和 [ Marathon] ( https://mesosphere.github.io/marathon/docs/service-discovery-load-balancing.html ) ,可以处理服务实例的注册与注销。他们还在每一个扮演服务端发现路由角色的集群主机上运行一个代理 。
129
129
130
- 一个 HTTP 反向代理和负载均衡器(如 NGINX)也可以用作服务端发现负载均衡器。服务注册中心可以将路由信息推送给 NGINX,并调用一个正常的配置更新; 例如,您可以使用 [ Consul Template] ( https://www.hashicorp.com/blog/introducing-consul-template/ ) 。NGINX Plus 支持[ 额外的动态重新配置机制] ( https://www.nginx.com/products/on-the-fly-reconfiguration/ ) — 它可以使用 DNS 从注册中心中提取有关服务实例的信息,并为远程重新配置提供一个 API。
130
+ 一个 HTTP 反向代理和负载均衡器(如 NGINX)也可以用作服务端发现负载均衡器。服务注册中心可以将路由信息推送给 NGINX,并调用一个正常的配置更新, 例如,您可以使用 [ Consul Template] ( https://www.hashicorp.com/blog/introducing-consul-template/ ) 。NGINX Plus 支持[ 额外的动态重新配置机制] ( https://www.nginx.com/products/on-the-fly-reconfiguration/ ) — 它可以使用 DNS 从注册中心中提取有关服务实例的信息,并为远程重新配置提供一个 API。
131
131
132
132
<a id =" microservices-in-action " ></a >
133
133
134
134
## 微服务实战:NGINX 的灵活性
135
135
136
136
by Floyd Smith
137
137
138
- 在微服务环境中,由于自动扩缩、故障和升级,您的后端基础设施可能会不断变化,这些包括了服务的创建 ,部署和扩展。如本章所述,在动态重新分配服务位置的环境中需要服务发现机制。
138
+ 在微服务环境中,由于自动扩缩、故障和升级,您的后端基础设施可能会不断变化,这些变化包括了服务的创建 ,部署和扩展。如本章所述,在动态重新分配服务位置的环境中需要服务发现机制。
139
139
140
- 将 NGINX 应用于微服务的一部分好处是,您可以轻松地将其配置为自动响应后端基础设施作出的变更 。NGINX 配置不仅简单灵活,而且兼容 [ Amazon Web Services] ( http://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/create-configuration-template.html ) 使用的模板,可以更轻松地管理特定的服务变更与受负载均衡的变更服务组。
140
+ 将 NGINX 应用于微服务的一部分好处是,您可以轻松地配置其自动响应后端基础设施作出的变更 。NGINX 配置不仅简单灵活,而且兼容 [ Amazon Web Services] ( http://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/create-configuration-template.html ) 使用的模板,可以更轻松地管理特定的服务变更与受负载均衡的变更服务组。
141
141
142
- [ NGINX Plus] ( https://www.nginx.com/products/ ) 具有[ 即时重新配置 API] ( https://www.nginx.com/products/on-the-fly-reconfiguration/ ) ,无需重新启动 NGINX Plus 或手动重新加载配置就能感知受负载均衡服务组的变更。在 [ NGINX Plus Release 8 及更高版本] ( https://www.nginx.com/blog/nginx-plus-r8-released/#on-the-fly ) 中,您可以将对 API 所做的更改配置为在重新启动和配置重新加载时保持不变 。(重新加载不需要重新启动,不要断开连接)[ NGINX Plus Release 9 及更高版本] ( https://www.nginx.com/blog/nginx-plus-r9-released/#dns-srv ) 支持使用 DNS SRV 记录进行服务发现,可与现有服务器发现平台(如 Consul 和 etcd)进行更紧密地集成。
142
+ [ NGINX Plus] ( https://www.nginx.com/products/ ) 具有[ 即时重新配置 API] ( https://www.nginx.com/products/on-the-fly-reconfiguration/ ) ,无需重新启动 NGINX Plus 或手动重新加载配置就能感知受负载均衡服务组的变更。在 [ NGINX Plus Release 8 及更高版本] ( https://www.nginx.com/blog/nginx-plus-r8-released/#on-the-fly ) 中,您可以将对 API 所做的变更配置为在重新启动和配置重新加载时保持不变 。(重新加载不需要重新启动,不要断开连接)[ NGINX Plus Release 9 及更高版本] ( https://www.nginx.com/blog/nginx-plus-r9-released/#dns-srv ) 支持使用 DNS SRV 记录进行服务发现,可与现有服务器发现平台(如 Consul 和 etcd)进行更紧密地集成。
143
143
144
144
我们在 NGINX 创建了一个用于管理服务发现的模型:
145
145
146
- 1 . 为几个应用程序单独运行的Docker容器 ,包括如 etcd 的服务发现应用程序、服务注册工具、一个或多个后端服务器以及用于负载均衡其他容器的 NGINX Plus 本身。
146
+ 1 . 为几个应用程序每个应用运行单独的 Docker 容器 ,包括如 etcd 的服务发现应用程序、服务注册工具、一个或多个后端服务器以及用于负载均衡其他容器的 NGINX Plus 本身。
147
147
2 . 注册工具监控 Docker 的新容器,并使用服务发现工具注册新服务,此外,还可以删除消失的容器。
148
- 3 . 容器及其运行的服务将自动添加到负载均衡上游服务器中或从其中删除 。
148
+ 3 . 容器及其运行的服务将自动添加到负载均衡上游服务器中或从中删除 。
149
149
150
- 此 Demo 应用程序可用于多个服务发现应用程序:[ Consul API] ( https://www.nginx.com/blog/service-discovery-with-nginx-plus-and-consul/ ) 、[ 来自 Consul 的 DNS SRV 记录] ( https://www.nginx.com/blog/service-discovery-nginx-plus-srv-records-consul-dns/ ) 、[ etcd] ( https://www.nginx.com/blog/service-discovery-nginx-plus-etcd/ ) 以及 [ ZooKeeper] ( https://www.nginx.com/blog/service-discovery-nginx-plus-zookeeper/ ) 等。
150
+ 此 Demo 应用程序可用于多个服务发现应用程序:[ Consul API] ( https://www.nginx.com/blog/service-discovery-with-nginx-plus-and-consul/ ) 、[ 来自 Consul 的 DNS SRV 记录] ( https://www.nginx.com/blog/service-discovery-nginx-plus-srv-records-consul-dns/ ) 、[ etcd] ( https://www.nginx.com/blog/service-discovery-nginx-plus-etcd/ ) 以及 [ ZooKeeper] ( https://www.nginx.com/blog/service-discovery-nginx-plus-zookeeper/ ) 等。
0 commit comments