Openshift源中的高可用性Drools无状态服务

嗨,大家好! 在这篇博客文章中,我想举一个简单的例子,展示使用Openshift 3(Docker和Kubernetes)扩展Drools Stateless服务有多么容易。 我将展示如何通过按需提供新实例来扩展我们的服务,以及如何使用循环策略由Kubernetes平衡这些实例的负载。

我们的Drools无状态服务

首先,我们需要一个无状态的Kie Session进行游戏。 在这些简单的示例中,我创建了一个食品推荐服务,以演示您可以使用这种方法建立什么样的情景。 所有源代码都可以在github上托管的Drools Workshop存储库中找到: https : //github.com/Salaboy/drools-workshop/tree/master/drools-openshift-example

在这个项目中,您将找到4个模块:

  • drools-food-model:我们的业务模型,包括领域类,例如成分,三明治,沙拉等
  • drools-food-kjar:我们的业务知识,在这里,我们有一组规则来描述如何完成食品推荐。
  • drools-food-services:使用Wildfly群,我将展示封装规则引擎的特定于域的服务。 这里提供了一组休息服务,以便我们的客户可以进行交互。
  • drools-controller:通过使用Kubernetes Java API,我们可以根据需要向Openshift环境以编程方式提供食品推荐服务的新实例。

我们的工作单位将是Drools-Food-Services项目,该项目公开REST端点与我们的无状态会话进行交互。

您可以看一下非常简单的服务端点: https : //github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-services/src/main/java/ org / drools / workshop / food / endpoint / api / FoodRecommendationService.java

还请注意,还有另一个服务可以为我们提供有关服务运行位置的非常基本的信息: https : //github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-services/ src / main / java / org / drools / workshop / food / endpoint / api / NodeStatsService.java

稍后,我们将调用此服务以确切知道该服务的哪个实例正在答复我们的客户。

此示例的规则很简单,并且操作不多,如果您想学习Drools,我建议您创建更多有意义的完整规则并与我分享,以便我们改进示例;)您可以看一下这些规则此处: https : //github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-kjar/src/main/resources/rules.drl

如您所料:男孩三明治和女孩沙拉:)

您需要了解的关于我们服务的最后一件重要的事情是服务端点如何挑选规则。 我正在使用Drools CDI扩展名@Inject一个KieContainer,可以使用KIE-CI模块来解决该问题,这在我以前的文章中已有解释。

  • https://github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-services/src/main/java/org/drools/workshop/food/endpoint/impl/FoodRecommendationServiceImpl。 java#L33

我们将把这个项目捆绑到一个Docker Image中,该镜像可以根据需要/启动多次。 如果您已经安装在您的本地环境中的码头工人客户端,您可以通过观察它在举办的salaboy / Drools的食品服务形象开始这种食物推荐服务hub.docker.com/salaboy

通过启动Docker映像甚至不知道内部正在运行什么,我们立即注意到以下优点:

  • 除了Docker外,我们不需要安装Java或任何其他工具
  • 我们无需进行任何配置即可运行Rest Service
  • 由于映像托管在hub.docker.com中,我们甚至不需要在本地构建任何内容
  • 我们可以在任何操作系统上运行

同时,我们注意到以下缺点:

  • 我们需要知道我们的服务在哪个IP和端口中被Docker公开
  • 如果我们运行多个映像,则需要跟踪所有IP和端口,并向所有客户通知这些
  • 同一docker映像实例的不同实例之间没有内置的负载平衡方式

为了解决Openshift的这些缺点,更具体地说,Kubernetes可以拯救我们!

在Openshift中配置我们的服务

如前所述,如果我们只是开始创建服务的新Docker Image实例,我们很快就会发现我们的客户将需要知道我们正在运行多少个实例以及如何与每个实例联系。 显然这不好,因此,我们需要一个中间层来处理此问题。 Kubernetes为我们提供了这一抽象和供应层,这使我们可以创建POD的多个实例(在docker映像之上的抽象),并为其配置Replication Controllers和Services 。

Replication Controller的概念提供了一种方法,该方法可以定义在给定时间应运行多少个实例来运行我们的服务。 复制控制器负责确保如果我们至少需要运行3个实例,那么这些实例将一直运行。 如果这些实例之一死亡,则复制控制器将自动为我们生成一个。

Kubernetes中的服务解决了了解所有Docker实例详细信息的问题。 服务使我们能够为客户提供一个立面,以便与我们的Pod实例进行交互。 服务层还允许我们定义一种策略(称为会话亲和力)来定义如何在服务后平衡Pod实例的负载。 有内置策略:ClientIP和Round Robin。

因此,我们现在需要做的事情,我们需要安装Openshift Origin(v3)和项目Drools Controller,该项目将与Kubernetes REST端点进行交互以提供Pod,复制器控制器和服务。

对于Openshift安装,建议您遵循此处描述的步骤: https : //github.com/openshift/origin/blob/master/CONTRIBUTING.adoc

我在笔记本电脑上的上一个链接中介绍了Vagrant选项(第二个选项)。

最后,可以找到一个非常简单的示例,说明如何使用Kubernetes API在这种情况下将我们的drools-food-services供应到Openshift中。

注意,我们正在运行时定义所有内容,这确实很酷,因为我们可以从头开始或修改现有的服务,复制控制器和Pod。

您可以看一下drools-controller项目。 其中显示了我们如何创建指向Docker映像并定义1个副本的复制控制器(默认情况下会创建一个副本)。

  • https://github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-controller/src/main/java/org/drools/workshop/drools/food/controller/Main。Java

如果您登录Openshift Console,您将能够使用Replication Controller和我们Pod的一个副本看到新创建的服务。 通过使用UI(或API,更改Main类),我们可以根据需要提供更多副本。 Kubernetes服务将确保在不同的Pod实例之间实现负载平衡。

瞧!我们的服务副本已启动并正在运行!

瞧! 我们的服务副本已启动并正在运行!

现在,如果通过对映射的Kubernetes服务端口执行GET来访问NodeStat服务,您将获得响应该请求的Pod。 如果您多次执行请求,您应该可以看到循环策略正在实施。

wget http://localhost:9999/api/node {"node":"drools-controller-8tmby","version":"version 1"}
wget http://localhost:9999/api/node {"node":"drools-controller-k9gym","version":"version 1"}
wget http://localhost:9999/api/node {"node":"drools-controller-pzqlu","version":"version 1"}
wget http://localhost:9999/api/node {"node":"drools-controller-8tmby","version":"version 1"}

以相同的方式,您可以在这3个Pod中的每个中与Statless会话进行交互。 在这种情况下,您实际上不需要知道哪个Pod在回答您的请求,您只需要由他们中的任何一个来完成工作即可。

加起来

通过利用Openshift起源基础架构,我们通过不重新发明Kubernetes和Docker等工具中已经存在的机制来简化架构。 在接下来的文章中,我将介绍使用此基础结构的其他一些不错的优点,例如汇总来升级我们的服务版本,增加安全性和Api管理。

如果您对此方法有疑问,请分享您的想法。

翻译自: https://www.javacodegeeks.com/2016/03/high-availability-drools-stateless-service-openshift-origin.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第1部分

jpa jsf我们创建了这篇文章,将展示如何使用以下工具创建完整的Web应用程序:Tomcat7,带有Primefaces的JSF2(Facelets和Libraries)(具有AutoComplete),JPA / Hibernate(具有…

错题

1. 本题考查String对象的声明和赋值方式。C#中没有new String() 这种方式来构造字符串。故选 AC 2. 在CSS中,控制列表样式的属性有:list-style-type,list-style-position,list-style-image,list-style equals比较的是像…

javascript-发布订阅模式

说明:本篇文章转载自小火柴的蓝色理想的一篇博文。原文地址:http://www.cnblogs.com/xiaohuochai/p/8031564.html 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖…

python-列表list和元组tuple

list Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。 比如,列出班里所有同学的名字,就可以用一个list表示: >>> classmates [Michael, Bob, Tracy] >>&g…

jsf表单验证_动态表单,JSF世界期待已久

jsf表单验证新的PrimeFaces扩展版本0.5.0带来了新的DynaForm组件。 通常,如果知道行/列的数量,元素的位置等,则可以通过h:panelGrid或p:panelGrid构建非常简单的表单。 静态表单是正确的。 但是,如果在运行…

转载黑客是如何黑到你手机的?绝对涨姿势,一位黑客的Wi-Fi入侵实录!

声明:这是一虚构的故事,因此对图片均进行了模糊化处理。内容整理自网络! 故事的主人公小黑是一名从事IT相关工作的技术宅男。五一长假来临,宅在家中的他相当无聊,打开手机上的Wi-Fi模块,发现附近有将近10个…

html5——DOM扩展

元素获取 1、document.getElementsByClassName (class) 通过类名获取元素,以类数组形式存在。 2、document.querySelector(‘div’) 通过CSS选择器获取元素,符合匹配条件的第1个元素。 3、document.querySelectorAll(selector) 通过CSS选择器获取元素&am…

JAVA递归实现全排列

全排列(permutation) 排列组合概念 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序 全排列 以数字为例,全排…

java云端部署_Jelastic Java云端平台

java云端部署谁在Jelastic背后? 那是我的第一个问题,因此我浏览了Jelastic网站。 回答此问题的最佳方法是查看“ Jelastic团队”部分。 创始人,顾问,特殊合作伙伴构成了一支真正的专业团队。 作为特殊的合作伙伴,您会…

Spring Bootstrap中带有配置元数据的高级配置

在简要介绍了配置元数据并涵盖了我之前的文章《 在Spring Boot中使用配置元数据Pimp您的配置》中的基础知识之后,是时候看看如何进一步执行此步骤并进一步自定义配置了。 在本文中,我计划提出对配置属性的弃用,并讨论各种值提供程序&#xff…

windows系统服务器添加ssl证书

一、为域名申请证书 浏览器打开后系在对应版本: https://keymanager.org/ 注册账号: https://freessl.cn/ 安装刚刚下载的软件; 登录进去就可以申请域名的证书了 二、域名解析 解析完后倒回软件那点击“配置完成,检查一下” …

使用ANTLR在5分钟内用Java解析任何语言:例如Python

我喜欢出于多种目的处理代码,例如静态分析或自动重构。 对我来说,有趣的部分是推理从抽象语法树(AST)构建的模型。 为此,您需要一种从源文件中获取AST的方法。 使用ANTLR和完整的语法集合可在此处轻松完成:…

linux服务器配置ssl证书

一、申请ssl证书 这里有申请域名的ssl证书的步骤: https://blog.csdn.net/weixin_38797742/article/details/109471250 二、配置服务器 打开项目对应的配置文件,配置图中三行信息,端口、还有申请的证书的所在目录。 listen 443 ssl; ssl_…

视图层的数据绑定

数据绑定WXML 中的动态数据均来自对应 Page 的 data。 只要把data中的数据改变,视图层就会自动改变,无需使用DOM操作。 简单绑定数据绑定使用 Mustache 语法(双大括号)将变量包起来 使用方法: {{ 内容 }} 在组件中使用…

【原创】Linux安装Redis

【注】说是原创其实是从各个博客中copy出来的,不过经本人总结,也算是半个原创吧,哈哈... 1.安装环境: 2.安装步骤 2.1 安装目录 cd /usr/local mkdir redis 2.2 下载包 wget http://download.redis.io/releases/redis-3.2.11.tar…

原型链继承

转载于:https://www.cnblogs.com/cmblog/p/8079773.html

java线程死锁_Java线程死锁–案例研究

java线程死锁本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析。 此案例研究还将证明掌握线程转储分析技能的重要性; 包括用于IBM JVM Thread Dump格式。 环境规格 – Java EE服务器:Oracle Weblo…

linux下安装pm2

提前安装node linux下安装pm2 全局安装 npm install pm2 -g安装完成后可以查看pm2的所在目录 创建软连接----根据上面的安装目录创建 ln -s /home/node/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/查看进程 pm2 list安装成功!!&#xff…

主机关机后第二天就无法开机_工控机几种常见的在开机或关机后不能正常使用的故障处理方法汇总...

工控机开机启动时我们经常会碰到各种不能正常使用的问题,下面我们把这类故障现象及处理方法在这里给大家汇总分析一下,希望你在碰到类似的问题时,能给你们提供一定的帮助!故障现象一:工控机在开机过程中出现死机故障.故…

网站添加页面热力图--百度统计

1,注册百度统计的账户并登录 https://tongji.baidu.com/web/10000307684/welcome/login 2,新增网站 管理-网站列表-自有网站-新增网站 3,新增网页热力图 基础报告-页面点击图-新增点击图 4,复制统计代码 把统计的代码放到…