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

openshift

嗨,大家好! 在这篇博客文章中,我想举一个简单的示例,展示使用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和端口,并通知所有客户有关这些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

openshift

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

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

相关文章

【WebRTC---源码篇】(一)全局初始化

一,任何平台的客户端在使用WebRTC的API之前都需要进行一些初始化操作,主要是设置实验性功能开关,初始化SSL,当然也可以启用trace,设置日志输出等。 Windows和Linux端的初始化 rtc::WinsockInitializer winsock_init;rtc::Win32So…

ibm服务器芯片架构,IBM x366 服务器技术详解

背景资料IBM eServer x366 提供了突破性的 4 路性能,采用机架优化的 3U服务器设计,结合了源自大型机灵感的 eServer X3技术的高可用性,具有最新 64 位Intel Xeon MP 处理器带来的 64位性能,可创建面向商业企业应用程序、虚拟化及 …

python函数调用自身后果_python 写函数在一定条件下需要调用自身时的写法说明...

例如以下这个函数:state 1 def set_state(state): while state: set int(input(请输入9或5,显示"hello world"\n)) if set 9 or set 5: print(hello world) state int(input(输入1继续,输入0停止!\n)) else: print(请输入要求…

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

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

【WebRTC---源码篇】(二)PeerConnectionFactory

在初始化之后,使用PC之前需要先创建和初始化PeerConnectionFactory对象,因为PC的创建使用了工厂模式。实现在InitializePeerConnection()中实现,其中还调用了 PC的创建以及添加相关轨 //创建PC Factory,这个函数会在用户呼叫对方,或者收到对方呼叫信息时调用 bool Conducto…

服务器安装虚拟交换机,虚拟交换机配置如何操作?虚拟交换机配置步骤有哪些...

很多朋友在做虚拟交换机配置的时候,不知道如具体的操作方法,下面新网就给大家详细的介绍下虚拟交换机配置如何操作以及虚拟交换机配置步骤有哪些等问题,以供参考。虚拟交换机配置方法1.先安装驱动D:\Company\S5700S-28P-LI-AC\驱动\S5700系列…

rostcm6情感分析案例分析_卷积情感分析

这是一个面向小白(比如,本人)的关于情感分析的系列教程 [1]。老鸽子整理了“4 - Convolutional Sentiment Analysis.ipynb”中的内容。本文任务:使用卷积神经网络(CNN)来实现句子分类。简介CNN用于分析图像,包含一个或多个卷积层,…

java jigsaw_60秒内使用Java 9的Project Jigsaw的JavaFX HelloWorld

java jigsaw到目前为止,您可能已经听说过Java 9的新模块系统,即项目Jigsaw。 如果您不了解Java 9的新模块系统,则应该访问Mark Reinhold的论文“模块系统的状态” 。 另外,您应该在nipafx上查看 Nicolai Parlog的优秀博客&#xf…

C++ 11 深度学习(三)范围for、new内存动态分配、nullptr

1.范围for 作用&#xff1a;用于遍历一个序列&#xff0c;例&#xff1a; int v[]{ 1,2,3,4,5,6 };for (auto x : v)//数组v中每个元素&#xff0c;依次放入x中;cout << x << endl; 2.new和delete new和delete是C中的两个关键字&#xff0c;其中new 先执行mallo…

opencv python 多帧降噪算法_OpenCV-Python中用于视频跟踪的Meanshift和Camshift算法介绍...

学习目标在本章中&#xff0c;我们将学习用于跟踪视频中对象的Meanshift和Camshift算法。MeanshiftMeanshift背后的直觉很简单&#xff0c;假设你有点的集合。(它可以是像素分布&#xff0c;例如直方图反投影)。你会得到一个小窗口(可能是一个圆形)&#xff0c;并且必须将该窗口…

【视频码率==文件传输大小等通用计算】

1字节&#xff08;Byte&#xff09; 8位&#xff08;bit&#xff09;&#xff0c;我们通常称比特为小b 1千字节&#xff08;KB,Kilobyte&#xff09;1024字节&#xff08;2的10次方字节&#xff09;&#xff08;1KB1024B&#xff09;&#xff0c;我们经常称字节为大B 通用计算…

vue.jsr入门_JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性

vue.jsr入门Java 8引入了JSR-308&#xff0c;它为Java语言添加了新的注释功能。 最重要的是&#xff1a;键入注释。 现在可以像下面这样设计怪物了&#xff1a; 比注解更疯狂的是类型注解。 在数组上。 谁认为这是有效的Java代码&#xff1f; pic.twitter.com/M9fSRRerAD — …

数组索引必须为正整数或逻辑值_Office 365函数新世界——动态数组

革新一个旧的函数体系&#xff0c;无外乎从这么几个方面入手&#xff0c;函数的运行效率、函数的编写方式以及扩展新的函数功能。今天咱们就学习一下&#xff0c;看看365新函数是如何通过这三个方面打破旧函数条条框框的。365函数系列推出了一个新的概念&#xff0c;叫做动态数…

【音视频安卓开发 (零)】用 Android NDK 编译 FFmpeg 与 X264

下载相关构建和工具链 1.先下载NDK Google Android 2.在Windows端下载使用msys2,msys2支持Linux msys2 安装相关源&#xff0c;等待更新要很久.....慢慢等 pacman -S mingw-w64-x86_64-toolchain 然后执行以下命令安装 pacman -S base-devel 如果下载过慢或者不成功可…

jax-rs jax-ws_极端懒惰:使用Spring Boot开发JAX-RS服务

jax-rs jax-ws我认为可以公平地说&#xff0c;作为软件开发人员&#xff0c;我们一直在寻找编写更少的代码的方法&#xff0c;这些代码可以自动地或不能自动地完成更多的工作。 考虑到这一点&#xff0c;作为Spring产品组合的骄傲成员的Spring Boot项目中断了传统方法&#xff…

python内置类型_Python内置对象类型

核心数字类型&#xff1a;数字&#xff1a;int&#xff0c;long&#xff0c;float&#xff0c;complex&#xff0c;bool字符&#xff1a;str&#xff0c;unicode列表&#xff1a;list字典&#xff1a;dict元组&#xff1a;tuple文件&#xff1a;file其他类型&#xff1a;集合(s…

【Android OpenGL ES 开发 (零)】创建一个新的工程

创建符合要求的AndroidApp 使用Android Studio开发&#xff0c;Android Studio下载地址 1.先创建Native C 2.项目相关添加 3.使用C11标准 学习使用JNI为Java提供API 1.在cpp中定义相关接口&#xff0c;格式如下 2.外部调用这个API 把so改成自己想要的名字 1.需要在cmake文件…

java方法参数类型不确定_一个Java方法能有多少个参数类型?这个好奇coder做了个实验...

选自 justinblank机器之心编译参与&#xff1a;李志伟、张倩在 JVM 中&#xff0c;一个 Java 方法&#xff0c;最多能定义多少参数呢&#xff1f;这是一个很无聊的问题&#xff0c;即使能定义一万个&#xff0c;十万个&#xff0c;谁又会真的去这么做呢。但是作为一个 coder&am…

lagom的微服务框架_您的第一个Lagom服务– Java Microservices入门

lagom的微服务框架在撰写我的下一份OReilly报告时&#xff0c;我一直很沮丧&#xff0c;并且一段时间内没有足够的时间来撰写博客。 是时候赶快来这里&#xff0c;让您真正快速地开始使用名为Lagom的新微服务框架。 它与您从Java EE或其他应用程序框架中可能了解到的有所不同。…

【Android OpenGL ES 开发 (一)】使用c++开发opengles 与 日志功能 及 加载assets

创建OpenGLES视口 1.App窗口改成OpenGL窗口,是通过java调用C&#xff0c;在以下位置修改如下内容 package com.example.learnogles;import androidx.appcompat.app.AppCompatActivity;import android.content.Context; import android.opengl.GLSurfaceView; import android.o…