单页面组合网站,wordpress拒绝服务,关于手表网站建设策划书,视觉营销的网站设计前一篇文章#xff0c;我们介绍了如何安装部署Ignite集群#xff0c;并且尝试了用REST和SQL客户端连接集群进行了缓存和数据库的操作。现在我们就来写点代码#xff0c;用Ignite的Java thin client来连接集群。 在开始介绍具体代码之前#xff0c;让我们先简单的了解一下Ig…前一篇文章我们介绍了如何安装部署Ignite集群并且尝试了用REST和SQL客户端连接集群进行了缓存和数据库的操作。现在我们就来写点代码用Ignite的Java thin client来连接集群。 在开始介绍具体代码之前让我们先简单的了解一下Ignite的thin client以及背后的binary client protocol(*原本打算把thin client翻译为精简客户端bianry client protocol翻译为二进制客户端协议但总读的不顺口就索性就不翻译了吧-_-|||*)。 Ignite Thin Client和Binary Client Protocol介绍 为了缓存数据的高性能读写Ignite是节点内部需要维护一套高效的数据结构来记录一些元数据所以如果在自己的应用程序中启动一个Ignite的server/client节点是要占用一些应用程序的CPU/内存资源的。另外Ignite是一个分布式系统单个节点需要和集群里的其他节点通讯又要消耗一些的网络资源。 因此不同于server/client节点thin client是一个Ignite轻量化的客户端。为什么说它是轻量化的呢因为thin client并不会加入到Ignite集群的拓扑中(即thin client的连接断开不会导致Ignite集群拓扑发生变化也不会触发相应的事件通知)不会存储任何集群的数据或是被做为计算节点接收计算任务。Thin client就是一个纯粹的客户端它纯粹到通过最原始的socket连接到Ignite集群中的某一个节点进行所有的操作。 在Ignite集群成功启动后我们会在日志看到“Topology snapshot [ver1, servers1, clients0, CPUs2, offheap1.6GB, heap1.0GB]”信息。这条日志里的clients和thin client不是一回事。按照之前介绍thin client是不会加入Ignite集群的拓扑中去理应不会出现在和拓扑相关的日志中所以这里不要把thin client和集群中的client节点搞混了。 这个链接详细的介绍了Binary Client Protocol的数据格式(比如采用的是litter-endianIgnite的二进制对象描述用户数据)消息格式(定义了消息头格式响应消息的格式以及连接时如何进行握手保证版本兼容等)和各种缓存操作所需的操作编码和格式。 所以只要你按照Binary Client Protocol的要求你可以用任何一种语言实现一个thin client。目前Ignite发布了两种语言的thin client的实现一个是基于Java实现一个是基于.Net实现。 当然thin client虽然轻量化也有它的问题。 Thin client写数据时只能先把数据发给其连接的节点再由该节点将数据发送给集群内的其他节点做存储(同理读数据也需要通过该节点才能传给thin client)这样thin client和这个节点间的网络很有可能就成为瓶颈。而server/client节点间可以互联利用数据分区可以充分使用节点间的带宽。另外当前连接节点出故障后thin client只能随机选择一个启动时已知的节点进行重试由于其不感知集群拓扑即便有新节点加入thin client也无法知道其存在更不可能和其进行通讯了。 所以还是要根据自己应用的场景看看到底是server/client节点还是thin client更合适。 Ignite Java Thin Client例子 上一篇文章中我们用Dbeaver连接Ignite后用SQL语句进行建表插入数据和查询数据。 在这个例子里我们就来看看如何通过Ignite的thin client支持的JCache APIs进行相同的操作。 首先我们先用用maven命令创建一个新的project然后在pom.xml文件中添加以下ignite-core的依赖 dependenciesdependencygroupIdorg.apache.ignite/groupIdartifactIdignite-core/artifactIdversion${ignite.version}/version/dependency
/dependencies 在看具体代码之前让我们先来大概了解一下这个例子中我们要进行哪些操作以及步骤 首先我们通过thin client连接上我们已经启动的Ignite集群。然后通过API创建两个cache(cache的名字分别为province和city)一个用来存省份信息一个用来存城市信息。 province缓存的key是省份的idcity缓存的key是城市的名称。我们分别往两个cache里写入一些数据。启动该程序时可以从命令行传入多个城市名称在终端我们会打印出该城市所在的省份信息。下面是主程序的代码 import org.apache.ignite.Ignition;
import org.apache.ignite.client.ClientCache;
import org.apache.ignite.client.ClientException;
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.ClientConfiguration;public class IgniteThinClientExample {private static ClientCacheInteger, Province provinceCache;private static ClientCacheString, City cityCache;public static void main(String[] args) {System.out.println();System.out.println(Ignite thin client example started.);//连接到Ignite集群,默认端口号为10800ClientConfiguration cfg new ClientConfiguration().setAddresses(192.168.0.110:10800);//用java的try-with-resource statement启动clienttry (IgniteClient igniteClient Ignition.startClient(cfg)){System.out.println();System.out.println(Begin create cache and insert data.);//创建两个缓存,具体步骤见该函数creatCacheAndInsertData(igniteClient);System.out.println();System.out.println(Begin query cache.);//根据输入开始查询for(String city : args){//先用城市名字,查询city缓存City c cityCache.get(city);Province p null;if (c ! null){//在用城市数据中的province id查询province缓存p provinceCache.get(c.getProvinceId());}//输出查询结果if (c ! null p ! null) {System.out.println(Find c.getName() in province p.getName());}else{System.out.println(Cannot find city in any province.);}}}catch (ClientException e) {System.err.println(e.getMessage());}catch (Exception e) {System.err.format(Unexpected failure: %s\n, e);}}private static void creatCacheAndInsertData(IgniteClient igniteClient){//创建province缓存,用来存放省份信息,该缓存以省的id为keyfinal String PROVINCE_CACHE_NAME province;provinceCache igniteClient.getOrCreateCache(PROVINCE_CACHE_NAME);//往province缓存中写入一些数据int provinceId 1;final Province on new Province(provinceId, Ontario);final Province ab new Province(provinceId, Alberta);final Province qc new Province(provinceId, Quebec);provinceCache.put(on.getId(), on);provinceCache.put(ab.getId(), ab);provinceCache.put(qc.getId(), qc);System.out.println(Successfully insert all provinces data.);//创建city缓存,用来存放城市信息,该缓存以城市的名字为keyfinal String CITY_CACHE_NAME city;cityCache igniteClient.getOrCreateCache(CITY_CACHE_NAME);//往city缓存写入一些数据int cityId 1;final City toronto new City(cityId, Toronto, on.getId());final City edmonton new City(cityId, Edmonton, ab.getId());final City calgary new City(cityId, Calgary, ab.getId());final City montreal new City(cityId, Montreal, qc.getId());cityCache.put(toronto.getName(), toronto);cityCache.put(edmonton.getName(), edmonton);cityCache.put(calgary.getName(), calgary);cityCache.put(montreal.getName(), montreal);System.out.println(Successfully insert all city data.);}
}public class City {private int id;private String name;private int provinceId;...
}public class Province {private int id;private String name;...
}成功的编译project后我们可以启动这个client看看程序的输出结果 $java -cp $IGNITE_HOME/libs/*:./ignite-thin-client-example-1.0-SNAPSHOT.jar IgniteThinClientExample Toronto Markham Edmonton CalgaryIgnite thin client example started.Begin create cache and insert data.
Successfully insert all provinces data.
Successfully insert all city data.Begin query cache.
Find Toronto in province Ontario
Cannot find Markham in any province.
Find Edmonton in province Alberta
Find Calgary in province Alberta 因为我们的city缓存中并没有Markham的信息所以查询Markham的时候我们也找不到对应的省份信息。但是查询Toronto,Edmonton和Calgary的时候程序是能正确的返回其省份信息的。 在上面的例子中有几个需要注意的地方 在我们连接Ignite集群的时候用的端口号10800。默认配置下Ignite会监听该端口等待thin client的连接。如果需要让Ignite集群用不同的端口号可以修改集群启动时的配置文件加入以下配置项(如果你是用上一篇文章的方法启动的Ignite集群, 配置文件在$IGNITE_HOME/config/default-config.xml)bean idignite.cfg classorg.apache.ignite.configuration.IgniteConfiguration!-- Thin client connection configuration. --property nameclientConnectorConfigurationbean classorg.apache.ignite.configuration.ClientConnectorConfigurationproperty namehost value192.168.0.100/property nameport value新的端口号/property nameportRange value30//bean/property
/bean 我们的插入和查询数据的时候只用到了最简单缓存API--put和get。其实Ignite缓存的查询API比其他缓存更丰富支持scan/SQL/text方式进行查询这个我们会在后面的文章慢慢介绍。我们用城市的名字查询完city缓存后再拿着province id去查询province缓存。这两步查询其实是可以合并成一个SQL的join查询在后面介绍SQL查询时我们再来看看把两个缓存当做两张表做join操作。总结 这篇文章我们介绍了Ignite的thin client并用Ignite的Java think client实现了一个简单的例子解释如何用thin client连接上Ignite集群创建缓存写入数据以及查询。 完整的代码和maven工程文件戳这里。 下一篇文章我们看看如何在自己的Java代码里启动Ignite集群及其相关配置。 转载于:https://www.cnblogs.com/peppapigdaddy/p/9815848.html