前一篇文章,咱們介紹瞭如何安裝部署Ignite集羣,而且嘗試了用REST和SQL客戶端鏈接集羣進行了緩存和數據庫的操做。如今咱們就來寫點代碼,用Ignite的Java thin client來鏈接集羣。 在開始介紹具體代碼以前,讓咱們先簡單的瞭解一下Ignite的thin client,以及背後的binary client protocol(*本來打算把thin client翻譯爲精簡客戶端,bianry client protocol翻譯爲二進制客戶端協議,但總讀的不順口,就索性就不翻譯了吧-_-|||*)。html
爲了緩存數據的高性能讀寫,Ignite是節點內部須要維護一套高效的數據結構來記錄一些元數據,因此若是在本身的應用程序中啓動一個Ignite的server/client節點是要佔用一些應用程序的CPU/內存資源的。另外,Ignite是一個分佈式系統,單個節點須要和集羣裏的其餘節點通信,又要消耗一些的網絡資源。 所以不一樣於server/client節點,thin client是一個Ignite輕量化的客戶端。爲何說它是輕量化的呢,由於thin client並不會加入到Ignite集羣的拓撲中(即thin client的鏈接,斷開不會致使Ignite集羣拓撲發生變化,也不會觸發相應的事件通知),不會存儲任何集羣的數據或是被作爲計算節點接收計算任務。Thin client就是一個純粹的客戶端,它純粹到經過最原始的socket鏈接到Ignite集羣中的某一個節點進行全部的操做。java
在Ignite集羣成功啓動後,咱們會在日誌看到「Topology snapshot [ver=1, servers=1, clients=0, CPUs=2, offheap=1.6GB, heap=1.0GB]」信息。這條日誌裏的clients和thin client不是一回事。按照以前介紹,thin client是不會加入Ignite集羣的拓撲中去,理應不會出如今和拓撲相關的日誌中,因此這裏不要把thin client和集羣中的client節點搞混了。git
這個連接詳細的介紹了Binary Client Protocol的數據格式(好比採用的是litter-endian,Ignite的二進制對象描述用戶數據),消息格式(定義了消息頭格式,響應消息的格式,以及鏈接時如何進行握手保證版本兼容等)和各類緩存操做所需的操做編碼和格式。 因此只要你按照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更合適。apache
上一篇文章中,咱們用Dbeaver鏈接Ignite後,用SQL語句進行建表,插入數據和查詢數據。 在這個例子裏,咱們就來看看如何經過Ignite的thin client支持的JCache APIs進行相同的操做。api
首先咱們先用用maven命令建立一個新的project,而後在pom.xml文件中添加如下ignite-core的依賴:緩存
<dependencies> <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-core</artifactId> <version>${ignite.version}</version> </dependency> </dependencies>
在看具體代碼以前,讓咱們先來大概瞭解一下這個例子中咱們要進行哪些操做以及步驟:網絡
下面是主程序的代碼:數據結構
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 ClientCache<Integer, Province> provinceCache; private static ClientCache<String, City> cityCache; public static void main(String[] args) { System.out.println(); System.out.println("Ignite thin client example started."); //鏈接到Ignite集羣,默認端口號爲10800 ClientConfiguration cfg = new ClientConfiguration().setAddresses("192.168.0.110:10800"); //用java的try-with-resource statement啓動client try (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爲key final 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緩存,用來存放城市信息,該緩存以城市的名字爲key final 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看看程序的輸出結果:socket
$java -cp $IGNITE_HOME/libs/*:./ignite-thin-client-example-1.0-SNAPSHOT.jar IgniteThinClientExample Toronto Markham Edmonton Calgary Ignite 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的時候,程序是能正確的返回其省份信息的。
在上面的例子中,有幾個須要注意的地方:
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <!-- Thin client connection configuration. --> <property name="clientConnectorConfiguration"> <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration"> <property name="host" value="192.168.0.100"/> <property name="port" value="新的端口號"/> <property name="portRange" value="30"/> </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集羣及其相關配置。