From 6e1789e37d345c85208650aeb4aefc07c7fe66eb Mon Sep 17 00:00:00 2001 From: oopsguy <474608426@qq.com> Date: Fri, 8 Sep 2017 00:59:54 +0800 Subject: [PATCH] finished chapter 'service discovery' --- 4-service-discovery.md | 87 ++++++++++++++++++++++++++++++++++++++--- README.md | 10 ++--- resources/4-4.png | Bin 0 -> 41837 bytes 3 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 resources/4-4.png diff --git a/4-service-discovery.md b/4-service-discovery.md index c234e66..285d4dd 100644 --- a/4-service-discovery.md +++ b/4-service-discovery.md @@ -1,5 +1,5 @@ # 4、服务发现 -本书主要介绍如何使用微服务来构建应用程序,现在是第四章。第一章已经介绍了[微服务架构模式](http://microservices.io/patterns/microservices.html),并讨论了使用微服务的优点与缺点。第二章和第三章介绍了微服务间通信,并对不同的通信机制作出对比。在本章中,我们将探讨服务发现(service discovery)相关的内容。 +本书主要介绍如何使用微服务来构建应用程序,现在是第四章。第一章已经介绍了[微服务架构模式](http://microservices.io/patterns/microservices.html),并讨论了使用微服务的优点与缺点。第二章和第三章介绍了微服务间的通信,并对不同的通信机制作出对比。在本章中,我们将探讨服务发现(service discovery)相关的内容。 ## 4.1、为何使用服务发现 我们假设您正在编写某些代码,这些代码调用了有 REST API 或 Thrift API 的服务。为了发送一个请求,您的代码需要知道服务实例的网络位置(IP 地址与端口)。在运行于物理硬件上的传统应用中,服务实例的网络位置是相对静态的。例如,您的代码可以从偶尔更新的配置文件中读取网络位置。 @@ -10,7 +10,7 @@ ![图 4-1、需要服务寻找帮助的客户端或 API 网关](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/resources/4-1.png) -有两种主要的服务发现模式:客户端发现(client-side discovery)与服务器端发现(server-side discovery)。让我们先来看看客户端发现。 +有两种主要的服务发现模式:客户端发现(client-side discovery)与服务端发现(server-side discovery)。让我们先来看看客户端发现。 ## 4.2、客户端发现模式 当使用[客户端发现模式](http://microservices.io/patterns/client-side-discovery.html)时,客户端负责确定可用服务实例的网络位置和请求负载均衡。客户端查询服务注册中心(service registry),它是可用服务实例的数据库。之后,客户端利用负载均衡算法选择一个可用的服务实例并发出请求。 @@ -19,7 +19,7 @@ ![客户端可以承担发现服务任务](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/resources/4-2.png) -服务实例的网络位置在服务注册中心启动时被注册。当实例终止时,它将从服务注册中心中移除。通常使用心跳机制周期性地刷新服务实例的注册。 +服务实例的网络位置在服务注册中心启动时被注册。当实例终止时,它将从服务注册中心中移除。通常使用心跳机制周期性地刷新服务实例的注册信息。 [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。 @@ -36,13 +36,88 @@ [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 本身注册。 -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。 +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。 某些部署环境(如 [Kubernetes](https://kubernetes.io/) 和 [Marathon](https://mesosphere.github.io/marathon/docs/service-discovery-load-balancing.html))在群集中的每个主机上运行着一个代理。这些代理扮演着服务端发现负载均衡器角色。为了向服务发出请求,客户端通过代理使用主机的 IP 地址和服务的分配端口来路由请求。然后,代理将请求透明地转发到在集群中某处运行的可用服务实例。 -服务端发现模式有几个优点与缺点。该模式的一个很大的优点是发现的细节从客户端抽象出来。客户端只需向负载均衡器发出请求。这消除了为服务客户端使用的每种编程语言和框架都实现发现逻辑的必要性。另外,如上所述,一些部署环境免费提供此功能。然而,这种模式存在一些缺点。除非负载均衡器由部署环境提供,否则它将是您需要设置和管理的另一个高可用系统组件。 +服务端发现模式有几个优点与缺点。该模式的一个很大的优点是发现的细节从客户端抽象出来。客户端只需向负载均衡器发出请求。这消除了为服务客户端使用的每种编程语言和框架都实现发现逻辑的必要性。另外,如上所述,一些部署环境免费提供此功能。然而,这种模式存在一些缺点。除非负载均衡器由部署环境提供,否则您需要引入这个高可用系统组件,并进行设置和管理。 ## 4.4、服务注册中心 [服务注册中心](http://microservices.io/patterns/service-registry.html)(service registry)是服务发现的一个关键部分。它是一个包含了服务实例网络位置的数据库。服务注册中心必须是高可用和最新的。虽然客户端可以缓存从服务注册中心获得的网络位置,但该信息最终会过期,客户端将无法发现服务实例。因此,服务注册中心由使用了复制协议(replication protocol)来维护一致性的服务器集群组成。 -如之前所述,[Netflix Eureka](https://github.com/Netflix/eureka) 是服务注册中心的一个很好例子。它提供了一个用于注册和查询服务实例的 REST API。服务实例使用 POST 请求注册其网络位置。它必须每隔 30 秒使用 PUT 请求来刷新其注册信息。通过使用 HTTP DELETE 请求或实例注册超时来移除注册信息。正如您所料,客户端可以使用 HTTP GET 请求来检索已注册的服务实例。 \ No newline at end of file +如之前所述,[Netflix Eureka](https://github.com/Netflix/eureka) 是一个很好的服务注册中心范例。它提供了一个用于注册和查询服务实例的 REST API。服务实例使用 POST 请求注册其网络位置。它必须每隔 30 秒使用 PUT 请求来刷新其注册信息。通过使用 HTTP DELETE 请求或实例注册超时来移除注册信息。正如您所料,客户端可以使用 HTTP GET 请求来检索已注册的服务实例。 + +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 地址。 + +经过 Eureka 客户端 - 服务与服务客户端 - 查询 DNS 以发现 Eureka 服务器的网络位置。客户端优先使用相同可用性区域中的 Eureka 服务器,如果没有可用的,则使用另一个可用性区域的 Eureka 服务器。 + +以下列举了其他服务注册中心: + +- **[etcd](https://github.com/coreos/etcd)** - 一个用于共享配置和服务发现的高可用、分布式和一致的键值存储。使用 etcd 的两个著名项目分别为 Kubernetes 和 [Cloud Foundry](http://pivotal.io/platform)。 +- **[Consul](https://www.consul.io/)** - 一个发现与配置服务工具。它提供了一个 API,可用于客户端注册与发现服务。Consul 可对服务进行健康检查,以确定服务的可用性。 +- **[Apache ZooKeeper](http://zookeeper.apache.org/)** - 一个被广泛应用于分布式应用程序的高性能协调服务。Apache ZooKeeper 最初是一个 Hadoop 子项目,但现在已经成为一个独立的顶级项目。 + +另外,如之前所述,部分系统,如 Kubernetes、Marathon 和 AWS,没有明确的服务注册中心。相反,服务注册中心只是基础设施的一个内置部分。 +  +现在我们已经了解服务注册中心的概念,接下来让我们看看服务实例是如何被注册到服务注册中心。 + +## 4.5、服务注册方式 +如之前所述,服务实例必须在服务注册中心中注册与注销。有几种不同的方式来处理注册和注销。一是服务实例自我注册,即[自注册模式](http://microservices.io/patterns/self-registration.html)。另一个是使用其他系统组件来管理服务实例的注册,即[第三方注册模式](http://microservices.io/patterns/3rd-party-registration.html)。我们先来了解自注册模式。 + +## 4.6、自注册模式 +当使用自注册模式时,服务实例负责在服务注册中心注册和注销自己。此外,如果有必要,服务实例将通过发送心跳请求来防止其注册信息过期。 + +图 4-4 展示了该模式的结构。 + +![图 4-4、服务可以自我处理注册](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/resources/4-4.png) + +该方式的一个很好的范例就是 [Netflix OSS Eureka 客户端](https://github.com/Netflix/eureka)。Eureka 客户端负责处理服务实例注册与注销的所有方面。实现了包括服务发现在内的多种模式的 [Spring Cloud 项目](http://projects.spring.io/spring-cloud/)可以轻松地使用 Eureka 自动注册服务实例。您只需在Java Configuration类应用 `@EnableEurekaClient` 注解即可。 + +自注册模式有好有坏。一个好处是它相对简单,不需要任何其他系统组件。然而,主要缺点是它将服务实例与服务注册中心耦合。您必须为服务使用的每种编程语言和框架都实现注册代码。 + +将服务与服务注册中心分离的替代方法是第三方注册模式。 + +## 4.7、第三方注册模式 +当使用第三方注册模式时,服务实例不再负责向服务注册中心注册自己。相反,该工作将由被称为服务注册器(service registrar)的另一系统组件负责。服务注册器通过轮询部署环境或订阅事件来跟踪运行实例集的变更情况。当它检测到一个新的可用服务实例时,它会将该实例注册到服务注册中心。此外,服务注册器可以注销终止的服务实例。 + +图 4-5 展示了该模式的结构: + +![图 4-5、一个单独的服务注册器可负责注册其他服务](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/resources/4-5.png) + +服务注册器的一个例子是开源的 [Registrator](https://github.com/gliderlabs/registrator) 项目。它可以自动注册和注销作为 Docker 容器部署的服务实例。注册器支持多个服务注册中心,包括 etcd 和 Consul。 + +服务注册器的另一个例子是 [NetflixOSS Prana](https://github.com/Netflix/Prana)。其主要用于非 JVM 语言编写的服务,它是一个与服务实例并行运行的侧中应用。Prana 使用了 Netflix Eureka 来注册和注销服务实例。 + +服务注册器在部分部署环境中是一个内置组件。Autoscaling Group 创建的 EC2 实例可以自动注册到 ELB。Kubernetes 服务将自动注册并提供发现。 + +第三方注册模式同样有好有坏。一个主要的好处是服务与服务注册中心之间解耦。您不需要为开发人员使用的每种编程语言和框架都实现服务注册逻辑。相反,仅需要在专用服务中以集中的方式处理服务实例注册。 + +该模式的一个缺点是,除非部署环境内置,否则您同样需要引入这样的一个高可用的系统组件,并进行设置和管理。 + +## 4.8、总结 +在微服务应用程序中,运行的服务实例集会动态变更。实例具有动态分配的网络位置。因此,为了让客户端向服务发出请求,它必须使用服务发现机制。 + +[服务发现](http://microservices.io/patterns/service-registry.html)的一个关键部分是服务注册中心。服务注册中心是一个可用服务实例的数据库。服务注册中心提供了管理 API 和查询 API 的功能。服务实例通过使用管理 API 从服务注册中心注册或者注销。系统组件使用查询 API 来发现可用的服务实例。 + +有两种主要的服务发现模式:客户端发现与服务端发现。在使用了客户端服务发现的系统中,客户端查询服务注册中心,选择一个可用实例并发出请求。在使用了服务端发现的系统中,客户端通过路由器进行请求,路由器将查询服务注册中心,并将请求转发到可用实例。 + +服务实例在服务注册中心中注册与注销有两种主要方式。一个是服务实例向服务注中心自我注册,即[自注册模式](http://microservices.io/patterns/self-registration.html)。另一个是使用他系统组件代表服务完成注册与注销,即[第三方注册模式](http://microservices.io/patterns/3rd-party-registration.html)。 + +在某些部署环境中,您需要使用如 [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),可以处理服务实例的注册与注销。他们还在每一个扮演服务端发现路由器角色的集群主机上运行一个代理。 + +一个 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。 + +## 微服务实战:NGINX 的灵活性 +在微服务环境中,由于自动扩展、故障和升级,您的后端基础设施可能会不断变化,这些包括了服务的创建,部署和扩展。如本章所述,在动态重新分配服务位置的环境中需要服务发现机制。 + +将 NGINX 应用于微服务的一部分好处是,您可以轻松地将其配置为自动响应后端基础设施作出的变更。NGINX 配置不仅简单灵活,而且兼容 [Amazon Web Services](http://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/create-configuration-template.html) 使用的模板,可以更轻松地管理特定的服务变更与受负载均衡的变更服务组。 + +[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)进行更紧密地集成。 + +我们在 NGINX 创建了一个用于管理服务发现的模型: + +1. 为几个应用程序单独运行的Docker容器,包括如 etcd 的服务发现应用程序、服务注册工具、一个或多个后端服务器以及用于负载均衡其他容器的 NGINX Plus 本身。 +2. 注册工具监控 Docker 的新容器,并使用服务发现工具注册新服务,此外,还可以删除消失的容器。 +3. 容器及其运行的服务将自动添加到负载均衡上游服务器中或从其中删除。 + +此 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/) 等。 \ No newline at end of file diff --git a/README.md b/README.md index b1a4c05..f1185c5 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,11 @@ - [4.2、客户端发现模式](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#42客户端发现模式) - [4.3、服务端发现模式](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#43服务端发现模式) - [4.4、服务注册中心](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#44服务注册中心) -- 4.5、服务注册方式 -- 4.6、自注册模式 -- 4.7、第三方注册模式 -- 4.8、总结 -- 微服务实战:NGINX 的灵活性 +- [4.5、服务注册方式](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#45服务注册方式) +- [4.6、自注册模式](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#46自注册模式) +- [4.7、第三方注册模式](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#47第三方注册模式) +- [4.8、总结](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#48总结) +- [微服务实战:NGINX 的灵活性](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/4-service-discovery.md#微服务实战nginx-的灵活性) ### 5、微服务的事件驱动数据管理 - 5.1、微服务与分布式数据管理问题 diff --git a/resources/4-4.png b/resources/4-4.png new file mode 100644 index 0000000000000000000000000000000000000000..b34dd628098177dce5b086b10d26408c04669ca1 GIT binary patch literal 41837 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%0A9Tx0F1~M$ZJbDZi(Z z;k5EsqPIry@!uCnPbI`C(lg4JjWk41O|lPM9nDdrz0vQ7O^ud0q%#dI|&tlu3jam;5+vT zR(sdqy~cau6kE^y&p80d=N}h9^kJV0xoK*5%|R#l#{*+7aA4+EnBA(xh~DwrW{TYx z1h1hsc9i#@(;!6Km@_jJ!bTl{K@%<{3!_^J2X025x?o0|=m&cNt=%`iCi`jAQ z_nR7d`Q509yYM#5^F5Pz1qSTGoq*7gwm5l&gywghNe0!FOm0T$vkmHXz-_yJk09}$ z3i63J_Z-#O+04Q4Ykp+*7dAIo(zOT6MzgznYLjW3LJF4mu80!T+cHP@{o|a3J46}A|zWaec*<1l6%p__v!cPe0Mob zqsVl%^HbG+X_ksO7(I335K@z6bpQVT7@)fkhjBpW8pJ&cton&=sqTtIWg2{7fi~w_ zgd9(q#b#u;mt4==W$UhA;I}~_ImN}bkJyH&UD~BlSGx!tkHrUr*V3KG40ZeLj}lHt zKAreL48_Y@h2FT<4|@+W$NK`c5SKU~`2&Y_k~Rc>TiO=)QvU}$b&waGoYACTm>@{y zZW|qHwb*6#*fNoS&z8&4pK6Wj+qkHQzJXuJ>ICwebs3ip0Fp7{4&prEJNJ@Ewcb z3+JYI3a~?BmKo$91CO|41@bjAdQ;Pz9&s!^#K+hdOA?N>y0X`J(*fZ{eKMvLmPZbE zu;4M?>Y%t2zrwv&WUDp>9ncIoK6qn#5p0BQ0?fRy-)gB-eFS zTCA0|djl(xk5$qcq)k%85)L|`bPK?1 zNPTOJqZ_mSdk8^mZP@scFU$}R{w5U zW@#05yM!XRMO~s=XLH1W&&BwW04lz5M>x*gh-qk6Z5ztuCicJL*eOJ0+3@%nsPF7U z`7Mg>a$^Ei?uI?-`rX`ts+R4Ld9f^h>y0VW$iM-j18-e4yjNQQK#qK?=9nE(-oERd z(JP{zT8Ouq@uir()LAWZNspDhXkP+@OXhW=tB_jl_|!mTCVkztM#m1YXkZ#eXnfw< zI|Ke#`3WvISUa1~SP_vWF;-qdRhr$`gk*-)cNZCTyvMssw_OBSU^(m(@2IItWp>_q ztae1Eyin9B0&+0=@xGJMa(_>6;|xJcqJ@BG^@*Z3SMTYNvrW`CA2};RYdyrc zc20KmweE!Gtf%VxL@6CQpGi#g%=O|m{hojbdmGp9+>YWpW@)EL?WOu7H`Vr7sm_X% z$vO!$QORaOo>p656>mF)i{8xSea!IQ;WLaR&zHChtn(J?0y3jDDb9Pdm*0WNNgA~V zL6AJV|FI58-`OlzbS)w?Ri&%^T(`=&AJ0GlS!M3eVGP7}S8SJd6)gOeJL#2V?ecso zpVWlXAmD8~?w0^yTR!a2p;heu_n)fZtfj(Hf!qSmy3+Mxi-`?!Ga#4g%wU+o_+h8C z1;lwe{)=w^?&n<0&6vEBpuZl)l$ONZkbdh9pa+M-=;)Jo%si@F~pI*2j!=bHU_YE-QWBruf z^B)Aa3`n4l1dbkD*o7RbM@P zB7Wi-j~P|ewuPT%x4p}ueZn>!a&{yFNXkeZ_Byq>z|jV^sA?$n$hC8m;{HP?#xw_u z$)vnm0CvJAuAKEV8ZS7K1lSl;d}pUy>?k%R_LWbSDa5Jb*;!GFJdma}1|!X=T@`w@ zQg1&(Sh=SLnKr@>I%cVp5@;4}%GNy^6^5WQ6|$l=3XOkcjetDA0OyC|sS%*6H`}vH zF$WS+Vh16h4YBUzcmSVb}Eg*kJV6nt-fxefOz zW4GvuBzTqGT=+fU-3p1n==A3NOvw>l`Z{KceDCvrjlTPwl!?>iiubo+ut;W!^6WHg zSxZs7uu8TS2u>nC{8Gn{sH_hlSP;+~**QY??(gqA96^p9aP)5@zAg@B#iFD5NR?YW zfMI_00!Icsr+OmqBM`nx^_a*Dko>_9YDx4ob6>vB*6ex9K;RM)(HNnK0Fgv9L|>!d zK9e@K{eZYe7?^Whxc(^c2l)J-rtlJe{C{LJ?h}sPXWitNM%U4fXPM8ipI^&b-fG(i zCZl%?M!5#S9zikV=S^o`(+jcs7AtNfQ#mJrYP)Z4MbJ*I6LQjjS`(^e5=q#eRFc4M z62p(e3FR1is|eo)iRF~*uY?64fEpH=K#KDxpk&7jz(Q?YHwd|}UdKx^z3(&qcHZ)$|ZRH&;PjgTGX-ms><%#SDo<5w(J3esmmHJTU*~FYGXpQLp26} zmXRQ#2|#zR-zM0RkXfL8B92x95-nm3}l2(xFtA&}GM{m9@paf^^hx=5XPl%F;W2DsqK4}wASM0$xC zYmvK{;a4}!c_|RcC??r&D=VZjsf&SVe`P9?$b$l7{J?n8kthHN!uGDm`qc$ao(;b< zzFgmBoEH%Ro7<9OMf4UYH%V10107hpPB1#`m2>NK0}P0SV@!$DFaOXP3cxo4y~!?+ z2A+LL;PyO`t`S^kM_hVf-LC&wtpN>v98tOsw9n?ec$%>FwJ^b`7Q-7ptOr`kf*sW~ zhBVOHf0z7?AdKl#GD1?I6&V ziyJumbiDy?aBf^tJ$dCxeMhyjci7OE9~A#)TjAmqN9=uKw_# zY0oyW4S%4h;ZT4*`9>!O7|xyK3pslmY9y`%=W`2{kp(JmOy;?Oh6spH@1 zFv?A(`J#mv7x%2cX!)gOmua=^>gh4wEpMTf4uQE?L8AC)gx&EVkMGh({^b$W`SH-| z4%aF{0W4fJYYQdn#mu^H(Gis<@7C^i=8#@YDv`)%!bl%B{74m+^HK;&w$>xw`EW5& zZLE!Z3%GxsSie{#g=nDkYc&c)FFP0DjxRl(@2r-gWtRT8s+-FkjRaY>H^-G0B`JI70V*rKbhr(yBzgH6 z@O_X#HlySzE~0TAP$iqwK>mNQoNRoDIq=ga8NnA@dhMsU4@5?QFM7WMGZyqfy4y=H zn{g_4pn$Fa;2cp`b1AZ>V1wvvysj>`R$0y5U;Xk^YtCydX?KVnZz$aJ)a&)Su4qS> ztB^Ei+}cl@oyoVNXCu|j(tj*w>FmDrQd3D!SKa+V(3e||q@v$~46a9Bi+qFfKItEa zPS%XqO|W^R{*GeoY~Kd%<3{by!L8>B0ORir)z@^%yv?@mQ3qK2%l1~bQdNLuI#3&s zffXn!bt^Jp<*ZF+Yp+cPRoM6J5@lrW>FnPx+wL2|{Ws8e=ZQJQ{8WgZyf@k*dG$%3 zJD^nh{Grf^tJCg_AodsLr&FBuj-cm7=|D>&I-suC;qzIjDNZv&IE z*0TydpTsVGCn6Ho0PcE)+vyZ&qLk13IAyXdv#*JW$o9u3$*Xvq;RSUG|JYj&nK215`})7#D^&X!K)une=!F+=pBti^yM2$*mt49OhO?9)M}R*MEP)bofS7#vzuk}Xbg}^K%tjv}H$f-O>=w3)vSYP?V73hp ze%s_jXA<>4{t#a9jT_mjt8&NgcU_&%zBlZ@^vd~VZ=l|Yur&XfBmeE80DnnyZ(HpG z3xoSdXY;0~otkB{pR!59!Oe&NTYFa;*3{9qQ?=5HRa?Zcr%83v=}fz zA`uh5D3s}i?SrNMOGnEk;MdpYypK3tRcu6kR=chG!YR3LRVnJH+w% z$b2x%<-&NhoZ?DcYMYII_4h?u+FJvcwVBevk;|$(^yoNu#`}xN}o> z8Fg?)<=;QHvF&5=$BA}9`tB||4duUG=tn1kT_H?gROwu8cmV{J%pOblX|(Fes74EP zV*wZgo+S(6vDBEGu~ZypW<_Q5qGD%mb^VoKbY>2Ct zx(v%K>v67jI;h&3#ZiA5X@b;TBagYhE!e@94+S%)dCfC;;^GP;O=VT)3U|9YLYZ6( za3+*d1MzOhY+DvIeoAG=)yXi;;4Q_K!R(}ZMMN4iZ@VG;(h6tM|8k8*Nv}_w<*GD#^76N_%(}K!5Wmcy}CpX zYsL8aWcSLdA{=k{?QyFF5}CT-sqw9P$af7@%+l3;Vt-j^Z^iDKxnphd)vBEE-?}HT42jCMEw?7ZH+19 z;fZq2dowGz6NDKTD?Sbc2%w|h9zlX;J5uA5<_Oz$v zWI5DJB}%r4IZE*x)rIh$VAU%R`WlSn6Ik=}=(qaFeAHsZMivc2`es+59ykw4nx&Vl zw+iWy>a>z&O_O07?a~R*_i>w$`eA{?XmBc7{QT>cbs#NM;g zcwFxVSHY`GSk}C63LLFu_%d<&b@#f2Gxh$`HwR2x$e{_&485bd;qAzS@s*}7kAtVB zVseYr;C)X6^5a#Y<)i=$d?>PPicZmqFAw|Eyk*t>@gZMh()Wh>ybaj09W6JD_)p5T zbXNU&xNWZ8eaf!B@`mc$GY%~uG=B8w{W9}w(&w}9?Lx9X$X;PTZr?{U;jAAitg?>K z1crQa8n`^Di}ieFumkii6tMES?ng3B#>TjP#ogbz#22e}ER?R66|CPF!F6`@f+xQ^13dAt`!C@o2Rd}D!A6w~Juu6{C$W(>W{c9S6YNk`6dsWYXl z2>se%D@3xGFS~-4K*=rV%<)HbL_QhI)gnt;>v{S#$*r@!J$WuU#x~Dfn2U%dq$i|< zn>0B|ck+GiK9B4mup9Y%i}QMP~i!XvY6zrl;PyJ@>&ya06%MUap1!LOZB@TKv zuJ*-zk&#)dFSu|o?o!s{wMV}hr!yjwR#YKU!As-xqc@4-uJ=1q7K_O(Z(2(!=q|xJ zmM!F0?rEQb@%LJ0o|_Kd9l_KkNCL>1N!4H(CK4Mu*INRWB!ggiim{< zE9*->SkHWOIK0?fSY1jxcF%kGrMPqlwsYcdRxLS1Km@C8(lBfH?@<6yKBoW^J_#~Q=%YuNe zglH0W|5}8gH?tXOZA~C3!VB_%ah%<3ngYCu3pahZJ_)_ zTp1?rZh?Q}C6ypIjIGrc zP8u9h(dF*c-dCI>)Tug|8aLVr)1G--90W zv2!MqbOUK)f*C_hRAFU3cTuwUFWUD& zSX@?H?g6c|NNZ`*Yny3$?KeEa!P&-I{KI^9;yJr6Uk9VvRjOMob*326J)dFT+@5)f zH+kI0%X2(@WMgfqF2Vz~F~dL`9lKqd_Z?3;C+xjD{A9j9l8EIIAwBZ6+$>DBVCzcp z;nu@NB2lDOoKJAs)8Ag5^cY#L%KW8eE2v=)FoDfI3z*eXgGTqR4SR5!Q>ZIb;!c!E zf_BclTf1cw5%*-Yob?~qZ!-MdgM_0a^Q1|MX{d(flsJmXa3SE*%y7SJ-!&nm5PW7z z`x~qEQVe{D>zRt`B?Jc7hpi#m9_LdgE5BBeaXlm($bJOqgt_3L=boGjL zKlEZoP_Lh>n;x)sw=^o^MX7J9Y7Tk^lDa-ohN^g`uyx)PC23tb!4GK$D`0=?eDsCG zJ&0|&|J-!71NdzWhNMGQ_FmLK(b3y2=JInF&}FQAvX zRCGnqmXs$S+=HY_0uHfkUy zKmtPRZFfSe%m!>N1xMJz;T^oj92ndTH(Kd_c<4Kn7K>R##X5n0HP57c6kiZEty_aS zpN_YPPlt@*X(rp7^a?W)j0?vN4P1AEu52$sZ0&+MjpP{T%Hed9s@vQa0O$NWo zsW&roGcfUCo0Rxu*yItK$rjL|JAnD_Ev^2L`V&OOIkS7~!wZzT*n)<40^s@I)LQ?S znC6xJk+y_|L%)WIS8kT5S)MeLFF}W10Yx1i0^~o|AKwdTcj~i0pYZnbUz`A{?(VR7 zDVlWgmjhhuc7E3Z|X4oD&FFRBdD8dFIrumj4aUlqWj#YvM`h{cKi4o zKxjwzHVYg*<5I#ig6af7+kyF*!H+9_Yk$QpXn&gzzYgdVdpl!1@1Lh8VETUmLg4@n z`3Atc_^%