东莞五金网站建设,新闻页面设计,三足鼎立小程序开发公司,wordpress微语zookeeper 负载Zookeeper如何确保每个工人都能从工作委托经理那里愉快地完成工作。 Apache ZooKeeper是注册#xff0c;管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时#xff0c;它是技术堆栈中必不可少的成员#xff0c;这些节点… zookeeper 负载 Zookeeper如何确保每个工人都能从工作委托经理那里愉快地完成工作。 Apache ZooKeeper是注册管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时它是技术堆栈中必不可少的成员这些节点需要知道其依赖关系从何处启动。 但是ZooKeeper的级别很低即使标准用例也需要多行代码。 这就是Apache Curator诞生的原因-一个比ZooKeeper更友好更易于使用的包装器库。 使用Curator我们可以用更少的代码和更简洁的方式交付更多内容。 “ Guava对Java来说就像Curator对ZooKeeper一样” – ZooKeeper提交者Patrick Hunt 使用ZooKeeper进行负载均衡微服务 我们习惯于在应用程序前面部署负载均衡器的情况。 它的作用是确保每个单个节点获得或多或少相同的流量。 在微服务世界中情况是相同的但是与单片方法相比我们具有显着的优势当我们需要扩展应用程序时我们不必复制整个系统并将其部署在功能强大的服务器上即可平稳运行。 我们只能将精力集中在需要扩展的小模块上因此扩展成本要低得多无论是在服务器成本还是在许多情况下准备模块部署所需的开发方面。 但是随着我们系统的发展我们最终会得到许多可扩展的模块每个模块都需要单独的负载平衡器。 这似乎很麻烦因为即使没有基础设施我们的基础设施也非常复杂。 幸运的是如果我们将ZooKeeper用作服务编排和发现工具则可以使用内置的负载平衡功能而不会在我们的微服务体系结构中引入任何其他复杂性。 为了展示ZooKeeper中开箱即用的负载平衡工作方式我们需要两项服务将被多次部署的工作程序以及将任务委派给已注册工作程序的经理。 简单工人 让我们从创建一个简单的工作程序开始该工作程序将侦听给定的端口并在被要求执行其工作时返回一些结果。 为了实现这个微小的微服务我们将使用Groovy Undertow轻量级servlet容器当然还要使用ZooKeeper和Curator。 我们的工作人员将由一个小类组成该类具有主要方法可完成三件事 class Main {static final void main(String[] args) {// Step 1: Extract name and port number to launch worker// Step 2: Configure and start Rest server on given port// Step 3: Register worker in ZooKeeper}
} 为简便起见我将在此处省略步骤1和2您可以在GitHub project上查看完整的源代码。 我们的工作人员只有一个端点GET / work该端点将返回一个带有被调用工作人员名称的响应 Path(/)
class Main {GETPath(/work)public String work() {String response Work done by $workerNameprintln responsereturn response}} 步骤3 ZooKeeper中的注册工作人员是最有趣的地方因此我将对其进行详细说明 private static void registerInZookeeper(int port) {CuratorFramework curatorFramework CuratorFrameworkFactory.newClient(localhost:2181, new RetryNTimes(5, 1000))curatorFramework.start()ServiceInstanceVoid serviceInstance ServiceInstance.builder().uriSpec(new UriSpec({scheme}://{address}:{port})).address(localhost).port(port).name(worker).build()ServiceDiscoveryBuilder.builder(Void).basePath(load-balancing-example).client(curatorFramework).thisInstance(serviceInstance).build().start()
} 第2-3行我们创建并启动CuratorFramework客户端该客户端包装了我们要在ZooKeeper实例上执行的所有操作。 为了简单起见我们将localhost与默认端口一起使用通常它应该是ZooKeeper的运行实例的URL 第4-9行创建了代表我们的工作人员的ServiceInstance。 我们传递了从其他微服务呼叫此工作人员所需的所有“联系方式” 第11-16行在CuratorFramework客户端代表的ZooKeeper中注册我们的实例。 出发工人 现在Worker已经准备就绪因此我们可以创建胖子罐使用Gradle fatJar任务然后使用以下命令启动它 java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_1 18005 在启动worker之前请记住您需要在默认2181端口上运行的ZooKeeper实例 要检查worker是否正在运行您应该在http// localhost18005 / work上打开浏览器并在其中看到“ Worker_1完成的工作”文本。 要验证工作人员是否已在ZooKeeper中正确注册自己请启动命令行客户端 cd/bin
./zkCli.sh 然后执行ls命令查看在/ load-balancing-example / worker路径下注册的一个节点 [zk: localhost:2181(CONNECTED) 1] ls /load-balancing-example/worker enter
[f69545e8-8466-40c0-93e9-f493eb7496b4]简单的经理 现在由于工作人员正在监听/ work的请求因此我们可以创建简单的经理服务委托任务给其下属。 主要方法看上去与简单工作人员项目中的方法非常相似主要区别在于我们没有在ZooKeeper中注册我们仅创建角色给惊喜为我们提供工作人员实例的ServiceProvider 。 所以基本的工作流程是 等待/ delegate上的请求 从ZooKeeper的ServiceProvider获取工作程序服务的实例 呼叫工作人员的/工作并返回其执行结果 要创建ServiceProvider我们必须创建CuratorFramework客户端连接到ZooKeeper然后获取具有给定名称的服务的ServiceProvider在本例中为worker CuratorFramework curatorFramework CuratorFrameworkFactory.newClient(localhost:2181, new RetryNTimes(5, 1000))
curatorFramework.start()ServiceDiscoveryVoid serviceDiscovery ServiceDiscoveryBuilder.builder(Void).basePath(load-balancing-example).client(curatorFramework).build()
serviceDiscovery.start()serviceProvider serviceDiscovery.serviceProviderBuilder().serviceName(worker).build()
serviceProvider.start() 第1-2行创建ZooKeeper客户端方法与简单工作人员相同 第4-8行创建ServiceDiscovery它将能够为我们提供服务提供商。 第10-11行。 创建并启动ServiceProvider将用于获取工作程序节点的工作实例。 最后我们需要一个Rest端点经理在该端点上等待任务委派 GET
Path(/delegate)
public String delegate() {def instance serviceProvider.getInstance()String address instance.buildUriSpec()String response (address /work).toURL().getText()println responsereturn response
} 起始经理 Manager已准备就绪在fatJar任务完成后我们可以使用以下命令启动它 java -jar simple-manager/build/libs/simple-manager-1.0-shadow.jar 18000 为了验证它是否正常工作我们可以在浏览器中打开 http// localhost18000 / delegate 以查看消息“ Worker_1完成的工作”。 经理对其员工一无所知。 他只知道服务是在ZooKeeper中的特定路径下注册的。 这很简单无论我们是在本地启动多个工作人员还是在不同国家的不同服务器上分散工作。 使用ZooKeeper开箱即用的负载平衡 想象一下这样的情况经理从首席执行官那里获得了太多任务以至于他需要多个工人来委派工作。 在标准情况下我们将被迫扩大规模并在他们前面放置负载平衡器。 但是ZooKeeper无需任何其他工作即可为我们提供此功能。 让我们添加更多在不同端口上侦听的工作者 java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_1 18005 java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_2 18006 java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_3 18007 java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_4 18008 诀窍是所有工作程序都在ZooKeeper中的同一路径下注册因此当我们在/ load-balancing-example / worker下列出节点时将看到四个实例 [zk: localhost:2181(CONNECTED) 0] ls /load-balancing-example/worker enter
[d5bc4eb9-8ebb-4b7c-813e-966a25fdd843, 13de9196-bfeb-4c1a-b632-b8b9969b9c0b, 85cd1387-2be8-4c08-977a-0798017379b1, 9e07bd1d-c615-430c-8dcb-bf228e9b56fc] 这里最重要的是要利用这四个新工作人员经理不需要对代码进行任何更改。 我们可以在流量增加时启动新的工作程序实例或者在无事可做时将其关闭。 Manager从这些操作中分离出来它仍然调用ServiceProvider来获取worker的实例并将工作传递给他。 所以现在当我们打开http// localhost18000 / delegate并按几次刷新时我们将看到 Work done by Worker_1
Work done by Worker_2
Work done by Worker_3
Work done by Worker_4
Work done by Worker_1
Work done by Worker_2
Work done by Worker_3 它是如何实现的 默认情况下ServiceProvider使用Rounded-robin ProviderStrategy实现该实现旋转给定路径下可用的实例从而使每个实例都有一些工作要做。 如果默认机制不符合我们的需求我们当然可以实施自定义策略。 摘要 今天就这些。 如您所见通过使用Apache ZooKeeper和Curator我们可以在没有需要部署监视和管理的单独负载均衡器的情况下生存。 即使没有微服务架构基础架构也非常复杂。 翻译自: https://www.javacodegeeks.com/2014/07/zookeeper-curator-and-how-microservices-load-balancing-works.htmlzookeeper 负载