cassandra可视化_容器化Spring Data Cassandra应用程序

cassandra可视化

我正在继续学习Docker的旅程。 在这一点上,我仍然保持简单。 这次,我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题。 更确切地说,使用Spring Data Cassandra整理应用程序。

我希望我前几天看过进行此更改。 我在Cassandra上写了很多文章,每次我必须cd到正确的目录或有启动它的快捷方式时。 我想这没什么大不了的,但是还涉及其他一些事情。 例如,删除和重新创建键空间,以便我可以从头开始测试我的应用程序。 现在,我只删除容器并重新启动它。 无论如何对我来说,这是有帮助的!

卡桑德拉

这篇文章与我以前的文章《 使用Docker将现有应用程序推送到容器》稍有不同。 取而代之的是,我将更加侧重于应用程序端,并删除仅使用Docker的中间步骤,而是直接跳至Docker Compose。

集装箱集装箱

我认为最好从项目的容器端开始,因为应用程序取决于Cassandra容器的配置。

我们走吧!

FROM openjdk:10-jre-slim
LABEL maintainer="Dan Newton"
ARG JAR_FILE
ADD target/${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

这里没有太多的事情。 这个Dockerfile构建了Spring应用程序映像,稍后将其放入容器中。

接下来是docker-compose文件。 这将同时构建Spring应用程序和Cassandra容器:

version: '3'
services:app:build:context: .args:JAR_FILE: /spring-data-cassandra-docker-1.0.0.jarrestart: alwayscassandra:
image: "cassandra"

同样,这里没有太多。 app容器使用Dockerfile定义的Dockerfile构建Spring应用程序。 相反, cassandra容器依赖于现有的映像,适当地命名为cassandra

突出的一件事是restart属性设置为always 。 这是我懒惰的尝试,目的是超越Cassandra启动所需的时间,并且所有容器都以docker-compose开头的事实是同时启动的。 这导致应用程序在未准备就绪的情况下尝试连接到Cassandra的情况。 不幸的是,这导致应用程序崩溃。 我希望它对内置的初始连接将有一些重试功能……但事实并非如此。

当我们遍历代码时,我们将看到如何以编程方式处理初始Cassandra连接,而不是依赖于应用程序死掉并多次重启。 您仍然会看到我处理连接的版本……我不是真正的解决方案拥护者,但是我尝试的所有其他操作都使我更加痛苦。

一点代码

我说这篇文章将把重点更多地放在应用程序代码上,但是我们不会深入研究我在此应用程序中放置的所有内容以及如何使用Cassandra。 有关此类信息,您可以查看我的较旧文章,这些文章将在最后链接。 但是,我们要做的是检查配置代码,该代码创建连接到Cassandra的bean。

首先,让我们看一下设置Cassandra集群的ClusterConfig

@Configuration
public class ClusterConfig extends AbstractClusterConfiguration {private final String keyspace;private final String hosts;ClusterConfig(@Value("${spring.data.cassandra.keyspace-name}") String keyspace,@Value("${spring.data.cassandra.contact-points}") String hosts) {this.keyspace = keyspace;this.hosts = hosts;}@Bean@Overridepublic CassandraClusterFactoryBean cluster() {RetryingCassandraClusterFactoryBean bean = new RetryingCassandraClusterFactoryBean();bean.setAddressTranslator(getAddressTranslator());bean.setAuthProvider(getAuthProvider());bean.setClusterBuilderConfigurer(getClusterBuilderConfigurer());bean.setClusterName(getClusterName());bean.setCompressionType(getCompressionType());bean.setContactPoints(getContactPoints());bean.setLoadBalancingPolicy(getLoadBalancingPolicy());bean.setMaxSchemaAgreementWaitSeconds(getMaxSchemaAgreementWaitSeconds());bean.setMetricsEnabled(getMetricsEnabled());bean.setNettyOptions(getNettyOptions());bean.setPoolingOptions(getPoolingOptions());bean.setPort(getPort());bean.setProtocolVersion(getProtocolVersion());bean.setQueryOptions(getQueryOptions());bean.setReconnectionPolicy(getReconnectionPolicy());bean.setRetryPolicy(getRetryPolicy());bean.setSpeculativeExecutionPolicy(getSpeculativeExecutionPolicy());bean.setSocketOptions(getSocketOptions());bean.setTimestampGenerator(getTimestampGenerator());bean.setKeyspaceCreations(getKeyspaceCreations());bean.setKeyspaceDrops(getKeyspaceDrops());bean.setStartupScripts(getStartupScripts());bean.setShutdownScripts(getShutdownScripts());return bean;}@Overrideprotected List getKeyspaceCreations() {final CreateKeyspaceSpecification specification =CreateKeyspaceSpecification.createKeyspace(keyspace).ifNotExists().with(KeyspaceOption.DURABLE_WRITES, true).withSimpleReplication();return List.of(specification);}@Overrideprotected String getContactPoints() {return hosts;}
}

那里没有太多东西,但是如果Spring重试与Cassandra的初始连接,那么将会更少。 无论如何,让我们将这一部分留出几分钟,集中讨论本课程中的其他要点。

我创建ClusterConfig的最初原因是创建应用程序将使用的密钥空间。 为此, getKeyspaceCreations被覆盖。 当应用程序连接时,它将执行此方法中定义的查询以创建键空间。

如果不需要这样做,并且以其他某种方式创建了键空间,例如,在创建Cassandra容器时执行了脚本,则可以依靠Spring Boot的自动配置。 实际上,这允许通过application.properties中定义的属性来配置整个应用application.properties而无需进行其他操作。 las,这本来不是。

由于我们已经定义了AbstractClusterConfiguration ,因此Spring Boot将在此区域中禁用其配置。 因此,我们需要通过重写getContactPoints方法来手动定义contactPoints (我将其命名为变量hosts )。 最初,这仅在application.properties定义。 我意识到一旦开始出现以下错误,我需要进行此更改:

All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/127.0.0.1:9042] Cannot connect))

在创建ClusterConfig之前,地址为cassandra而不是localhost

无需为集群配置其他任何属性,因为在这种情况下,Spring的默认值就足够了。

在这一点上我已经提到太多application.properties了,我应该向您展示其中的内容。

spring.data.cassandra.keyspace-name=mykeyspace
spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS
spring.data.cassandra.contact-points=cassandra

keyspace-namecontact-points已经弹出,因为它们与配置集群有关。 根据项目中的实体创建表需要进行schema-action 。 我们不需要在这里做任何其他事情,因为自动配置仍在该领域中工作。

contact-points值设置为cassandra的事实非常重要。 该域名源自提供给容器的名称,在本例中为cassandra 。 因此,既可以使用cassandra也可以使用容器的实际IP。 域名肯定更容易,因为部署之间始终是静态的。 只是为了验证这一理论,您可以将cassandra容器的名称更改为所需的名称,只要您还在application.properties中进行了更改,它仍然可以连接。

返回到ClusterConfig代码。 更确切地说,是cluster bean。 我再次粘贴了下面的代码,以便于查看:

@Configuration
public class ClusterConfig extends AbstractClusterConfiguration {// other stuff@Bean@Overridepublic CassandraClusterFactoryBean cluster() {RetryingCassandraClusterFactoryBean bean = new RetryingCassandraClusterFactoryBean();bean.setAddressTranslator(getAddressTranslator());bean.setAuthProvider(getAuthProvider());bean.setClusterBuilderConfigurer(getClusterBuilderConfigurer());bean.setClusterName(getClusterName());bean.setCompressionType(getCompressionType());bean.setContactPoints(getContactPoints());bean.setLoadBalancingPolicy(getLoadBalancingPolicy());bean.setMaxSchemaAgreementWaitSeconds(getMaxSchemaAgreementWaitSeconds());bean.setMetricsEnabled(getMetricsEnabled());bean.setNettyOptions(getNettyOptions());bean.setPoolingOptions(getPoolingOptions());bean.setPort(getPort());bean.setProtocolVersion(getProtocolVersion());bean.setQueryOptions(getQueryOptions());bean.setReconnectionPolicy(getReconnectionPolicy());bean.setRetryPolicy(getRetryPolicy());bean.setSpeculativeExecutionPolicy(getSpeculativeExecutionPolicy());bean.setSocketOptions(getSocketOptions());bean.setTimestampGenerator(getTimestampGenerator());bean.setKeyspaceCreations(getKeyspaceCreations());bean.setKeyspaceDrops(getKeyspaceDrops());bean.setStartupScripts(getStartupScripts());bean.setShutdownScripts(getShutdownScripts());return bean;}// other stuff
}

仅需要此代码才能允许在初始Cassandra连接上重试。 这很烦人,但我无法提出另一个简单的解决方案。 如果您有更好的选择,请告诉我!

我所做的实际上很简单,但是代码本身并不是很好。 除了RetryingCassandraClusterFactoryBean (我自己的类)之外, cluster方法是AbstractClusterConfiguration重写版本的副本。 原始函数改为使用CassandraClusterFactoryBean (Spring类)。

以下是RetryingCassandraClusterFactoryBean

public class RetryingCassandraClusterFactoryBean extends CassandraClusterFactoryBean {private static final Logger LOG =LoggerFactory.getLogger(RetryingCassandraClusterFactoryBean.class);@Overridepublic void afterPropertiesSet() throws Exception {connect();}private void connect() throws Exception {try {super.afterPropertiesSet();} catch (TransportException | IllegalArgumentException | NoHostAvailableException e) {LOG.warn(e.getMessage());LOG.warn("Retrying connection in 10 seconds");sleep();connect();}}private void sleep() {try {Thread.sleep(10000);} catch (InterruptedException ignored) {}}
}

原始CassandraClusterFactoryBeanafterPropertiesSet方法采用其值,并通过最终委托给Datastax Java驱动程序来创建Cassandra集群的表示形式。 正如我在整个帖子中提到的。 如果无法建立连接,则将引发异常,如果未捕获,将导致应用程序终止。 这就是上面代码的重点。 它将afterPropertiesSet包装在为可能引发的异常指定的try-catch块中。

添加了sleep ,使Cassandra有一些时间可以真正启动。 上一次尝试失败时,尝试立即重新连接没有任何意义。

使用此代码,应用程序最终将连接到Cassandra。

在这一点上,我通常会向您显示一些毫无意义的日志,以证明该应用程序可以正常工作,但是在这种情况下,它实际上并没有带来任何好处。 当您说以下命令时,请相信我:

mvn clean install && docker-compose up

然后创建Spring应用程序映像,并旋转两个容器。

结论

我们已经看过如何将连接到Cassandra数据库的Spring应用程序放入容器中。 一个用于应用程序,另一个用于Cassandra。 应用程序映像是从项目的代码构建的,而Cassandra映像是从Docker Hub获取的。 图像名称是cassandra只是为了确保没有人忘记。 通常,将两个容器连接在一起相对简单,但是应用程序需要进行一些调整,以允许在连接到另一个容器中运行的Cassandra时重试。 这使代码有些丑陋,但至少可以工作……由于本文中编写了代码,我现在有了另一个不需要在自己的机器上设置的应用程序。

这篇文章中使用的代码可以在我的GitHub上找到 。

如果您发现此帖子有帮助,可以在Twitter上@LankyDanDev关注我,以了解我的新帖子。

链接到我的Spring Data Cassandra帖子

  • Spring Data Cassandra入门
  • 使用Spring Data Cassandra分离键空间
  • 使用单个Spring Data CassandraTemplate的多个键空间
  • 使用Spring Data Cassandra进行更复杂的建模
  • Spring Data Cassandra中的启动和关闭脚本
  • Spring Data Cassandra的React流
  • Spring Data Cassandra中自动配置随附的管道
  • 使用Datastax Java驱动程序与Cassandra进行交互

哇,我没意识到我写了那么多Cassandra帖子。

翻译自: https://www.javacodegeeks.com/2018/09/spring-data-cassandra-application.html

cassandra可视化

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

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

相关文章

自定义Mybatis框架

一、开发环境的准备及统一 1、 Jdk环境&#xff1a;JDK 1.8 64bit 2、 Maven环境&#xff1a;MAVEN 3.3.9 二、创建Maven工程并引入坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

Linux 命令之 userconf -- 设置用户账号

文章目录命令介绍常用选项参考示例新增用户账号新增群组删除用户账号删除群组命令介绍 userconf的命令全称是“user config”&#xff0c;该命令是用户账号设置程序。 userconf实际上为linuxconf的符号连接&#xff0c;提供图形界面的操作方式&#xff0c;供管理员建立与管理各…

javafx 动画没效果_通过JavaFX标注制作动画效果

javafx 动画没效果在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使…

基于自定义Mybatis框架实现数据库操作

一、场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis&#xff0c;查询所有用户信息。 二、创建工程并引入自定义Mybatis框架的坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0…

javafx按钮设计风格_Java,JavaFX的流畅设计风格按钮,切换按钮和工具提示

javafx按钮设计风格你好&#xff0c;我们又见面了&#xff01; 这个周末&#xff0c;在业余时间&#xff0c;我继续从事JMetro的工作。 最终结果是新的Button和ToggleButton深色和浅色样式。 这些新样式包括按下按钮时的新动画。 可以通过CSS打开和关闭。 最后&#xff0c;我…

MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量

文章目录MySQL 变量分类系统变量查看系统变量设置系统变量如何通过配置文件来设置变量值通过命令行选项来设置变量值动态设置全局级的系统变量设置静态的系统变量设置会话级的系统变量引用系统变量总结用户自定义变量用户变量声明定义用户变量查看用户变量的值参考示例使用命令…

Mybatis框架快速入门

一、场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis&#xff0c;查询所有用户信息。 二、创建工程并引入Mybatis框架的坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

oidc_使用Java EE和OIDC构建Java REST API

oidc“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标…

Mybatis实现CRUD操作

项目实现的功能 查询所有用户信息 通过Id查询用户信息 添加用户&#xff08;回显主键&#xff09; 修改用户信息 删除用户信息 通过用户名字模糊查询 一、引入依赖和工程结构 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http…

Linux系统下MySQL的导出数据语句SELECT … INTO OUTFILE的用法

文章目录关于参数 secure_file_priv按默认参数设定导出表数据到文本文件中自定义分隔符&#xff0c;将表数据导出到 txt 文件中自定义分隔符&#xff0c;将表数据导出到 csv 文件中导出数据时&#xff0c;提示“拒绝访问”总结确保 Linux 用户 mysql 对导出的目标目录拥有写入和…

java cxf_拥抱模块化Java平台:Java 10上的Apache CXF

java cxfJava 9版本终于将Project Jigsaw交付给大众已经过去了一年的时间。 这是一段漫长的旅程&#xff0c;但是在那里&#xff0c;所以发生了什么变化&#xff1f; 这是一个很好的问题&#xff0c;答案并不明显和直接。 总的来说&#xff0c; 拼图项目是一种颠覆性的变化&am…

MySQL数据字典

数据字典就类似于系统编目或花名册&#xff0c;它保存数据库服务器上的元数据信息&#xff08;数据库的整体属性信息&#xff09;。 元数据信息包括&#xff1a;数据库的属性信息、数据表的属性信息、字段的属性信息、视图的属性信息、用户信息、统计类信息等。 MySQL 保存元…

Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项

Mybatis映射文件SQL语句模糊查询 1. “%”#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. ‘%${value}%’ 在参数中不需要添加 %_ 3. #{abc} 在参数中添加 %_ #和$的区别和注意事项 ${}直接拼接 &#xff0c;不会转换类型 如果是简单类型&#xff0c;必须写${…

启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...

启动php-fpm服务器从无服务器开始时&#xff0c;您很快就会学习/听到有关函数冷启动的信息&#xff08;我相信无服务器云功能 API &#xff09;。 首次调用云功能时或长时间不调用后会发生冷启动。 基本上&#xff0c;服务器&#xff08;是的&#xff0c;有服务器&#xff01;&…

声明定义存储过程或者函数时,其中的 delimiter 关键字是干嘛的呢?

我们写 SQL 的时候&#xff0c;MySQL 怎么判断 SQL 是否已经结束了&#xff0c;可以去执行了&#xff1f; 需要一个结束符&#xff0c;当 MySQL 看到这个结束符的时候&#xff0c;表示可以执行前面的语句了&#xff0c;MySQL 默认以分号为结束符。 当我们创建存储过程或者自定…

istio api_Istio的网络API解释了

istio apiIstio 1.0版附带一个网络API&#xff0c;该API包含许多功能并涵盖了各种场景。 联网API在最近几个月中得到了发展&#xff0c;并且可能不会立即说明。 该API的概念和构建块是什么&#xff0c;以及如何使用各个Istio资源类型来通过我们的服务网格路由流量&#xff1f; …

MySQL命令之mysqldump的选项详解

文章目录--opt--skip-opt--add-drop-table--add-locks--skip-add-locks--allow-keywords--all-databases,-A--comments--skip-comments--compact--complete-insert,-c--compress,-C--events,-E--compatible--skip-disable-keys,-K--skip-add-drop-table--quick,-q--skip-quick-…

网关限流(令牌桶算法)

一、需求&#xff1a; 每个ip地址1秒内只能发送1次请求&#xff0c;多出来的请求返回429错误。 二、引入依赖 spring cloud gateway 默认使用redis的RateLimter限流算法来实现。所以我们要使用首先需要引入redis的依赖 <!--redis--> <dependency><groupId&g…

openapi_MicroProfile OpenAPI上的Swagger UI

openapiMicroProfile OpenApi为我们提供了一种使用OpenApi 3描述我们JAX-RS API的标准化方法。如果您以前使用过swagger-jaxrs和swagger- 批注 &#xff0c;由于OpenApi是基于Swagger构建的&#xff0c;因此您会感到非常熟悉。 2015年11月5日&#xff0c;SmartBear与3Scale&am…

MySQL的用户表(user)

文章目录字段 host 中的特殊值介绍user 字段中的特殊值介绍我们查看下这张表的字段 host 和 user&#xff0c;如下所示&#xff1a; mysql> select host,user from user; ----------------------------- | host | user | ----------------------------- |…