Spring Boot集成geode快速入门Demo

1.什么是geode?

Apache Geode 是一个数据管理平台,可在广泛分布的云架构中提供对数据密集型应用程序的实时、一致的访问。Geode 跨多个进程汇集内存、CPU、网络资源和可选的本地磁盘,以管理应用程序对象和行为。它使用动态复制和数据分区技术来实现高可用性、改进的性能、可伸缩性和容错性。除了作为分布式数据容器之外,Geode 还是一个内存数据管理系统,可提供可靠的异步事件通知和有保证的消息传递。(gemfire是它的商业版本)

主要组件概念

  • locator:locator 定位器,类似于 zk ,进行选举协调,服务发现等功能,我们的应用程序链接的是 locator 定位器
  • server:真正提供缓存服务的功能
  • region:对数据进行区域划分,类似数据库中表的概念
  • gfsh:Geode 的命令行控制台
  • client:链接 Geode 服务的客户端

Geode 特性

  • 高读写吞吐量
  • 低且可预测的延迟
  • 高可扩展性
  • 持续可用性
  • 可靠的事件通知
  • 数据存储上的并行应用程序行为
  • 无共享磁盘持久性
  • 降低拥有成本
  • 客户/服务器的单跳能力
  • 客户/服务器安全
  • 多站点数据分布
  • 连续查询
  • 异构数据共享

Geode 与 Redis

总体来说 Geode 的功能包含 Redis 的功能,但是还是有一些迥异点的。

  1. 定位不同:Geode 定位数据管理平台,强调实时一致性, Redis 高速缓存。
  2. 集群:Geode 天然支持集群,节点是对等的,Redis 集群去中心化,主从复制。
  3. 部署方式:Geode 有点对点方式、C/S 方式、WAN 多数据中心方式,而 Redis 是 C/S 主从方式、集群方式。
  4. 查询:Geode 支持 OQL 查询、函数计算、Redis KV 查询
  5. 发布订阅:Geode 支持稳定的时间订阅和连续查询, Redis 的发布订阅貌似用的并不多。
  6. 事务支持:Geode 支持的也是存内存的 ACID 事务,对落盘的事务支持也不行,Redis 支持的也是内存型事务,相对来说,ACID 更一些。
  7. Geode 支持 Redis 的协议模拟,有 Redis Adaper。

应用场景

目前12306.cn就是用Geode作为高性能分布式缓存计算框架 。Apache Geode适用于各种需要处理大规模分布式数据的场景。以下是几个典型的应用场景:

  1. 实时分析系统:Geode的高性能和实时一致性特性使得它成为实时分析系统的理想选择。例如,金融领域的股票交易分析、电商领域的用户行为分析等。
  2. 缓存系统:由于Geode具有高性能和可扩展性,它可以用作缓存系统,为应用程序提供快速的数据访问。例如,在Web应用中缓存用户会话数据或热点数据。
  3. 分布式计算:Geode可以作为分布式计算框架的一部分,提供数据处理和存储的支持。例如,在Hadoop生态系统中集成Geode作为存储后端或消息中间件。
  4. 事务处理系统:由于Geode提供了高可用性和容错性,它可以用于构建需要强一致性和高可用性的事务处理系统。例如,在线支付系统或银行交易系统。

2.环境搭建

pull the container image

复制代码
docker pull apachegeode/geode

This may take a while depending on your internet connection, but it's worth since this is a one time step and you endup with a container that is tested and ready to be used for development. It will download Gradle and as part of the build, project dependencies as well. Starting a locator and gfsh,Then you can start gfsh as well in order to perform more commands:

复制代码
docker run -it -p 10334:10334 -p 7575:7575 -p 40404:40404 -p 1099:1099  apachegeode/geode gfsh

From this point you can pretty much follow Apache Geode in 5 minutes for example:

复制代码
gfsh> start locator --name=locator1 --port=10334
gfsh> start server --name=server1 --server-port=40404

query cluster status

复制代码
list members

Create a region:

复制代码
gfsh> create region --name=hello --type=REPLICATE 
gfsh> create region --name=People --type=REPLICATE

query region

复制代码
gfsh>query --query="select * from /hello"

clean region

复制代码
remove --all --region=People

Finally, shutdown the Geode server and locator:

复制代码
gfsh> shutdown --include-locators=true

3.代码工程

实验目的

实现springboot对geode插入和查询操作

pom.xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>gemfire</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.geode</groupId>
            <artifactId>spring-geode-starter-session</artifactId>
            <version>1.4.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.geode</groupId>
            <artifactId>spring-geode-starter-test</artifactId>
            <version>1.4.13</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.geode</groupId>
            <artifactId>spring-geode-starter</artifactId>
            <version>1.4.13</version>
        </dependency>
    </dependencies>

</project>

controller

复制代码
package com.et.gemfire.controller;

import com.et.gemfire.entity.People;
import com.et.gemfire.repository.PersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorldController {
    @RequestMapping("/hello")
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "HelloWorld");
        return map;
    }
    @Autowired
    PersonRepository personRepository;

    @RequestMapping(value = "/findById", method = RequestMethod.GET)
    public Object findById(String id) {
        return personRepository.findById(id);
    }

    @RequestMapping(value = "/findAll", method = RequestMethod.GET)
    public Object findAll() {
        return personRepository.findAll();
    }

    @RequestMapping(value = "/insert", method = RequestMethod.POST)
    public Object insert(@RequestBody People bean) {
        personRepository.save(bean);
        return "add OK";
    }
}

respository

复制代码
package com.et.gemfire.repository;

import com.et.gemfire.entity.People;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PersonRepository extends CrudRepository<People, String> {}

entity

复制代码
package com.et.gemfire.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.gemfire.mapping.annotation.Region;

import java.io.Serializable;

@Region(value = "People")
public class People implements Serializable {
   @Id
   private  String name;
   private  int age;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public int getAge() {
      return age;
   }

   public void setAge(int age) {
      this.age = age;
   }
}

DemoApplication.java

复制代码
package com.et.gemfire;

import com.et.gemfire.entity.People;
import org.apache.geode.cache.client.ClientRegionShortcut;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.gemfire.cache.config.EnableGemfireCaching;
import org.springframework.data.gemfire.config.annotation.EnableCachingDefinedRegions;
import org.springframework.data.gemfire.config.annotation.EnableEntityDefinedRegions;
import org.springframework.data.gemfire.config.annotation.EnablePdx;

@SpringBootApplication
@EnableEntityDefinedRegions(basePackageClasses = People.class, clientRegionShortcut = ClientRegionShortcut.PROXY ) // 只是当代理转发的操作
@EnablePdx
@EnableCachingDefinedRegions
@EnableGemfireCaching
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

4.测试

启动SpringBoot应用

测试插入

测试查询

5.引用

相关推荐
工业互联网专业3 分钟前
基于springboot+vue的动漫交流与推荐平台
java·vue.js·spring boot·毕业设计·源码·课程设计·动漫交流与推荐平台
雷渊6 分钟前
深入分析Spring的事务隔离级别及实现原理
java·后端·面试
Smilejudy16 分钟前
不可或缺的相邻引用
后端
惜鸟16 分钟前
Elasticsearch 的字段类型总结
后端
rebel17 分钟前
Java获取excel附件并解析解决方案
java·后端
微客鸟窝19 分钟前
Redis常用数据类型和命令
后端
熊猫片沃子21 分钟前
centos挂载数据盘
后端·centos
微客鸟窝22 分钟前
Redis配置文件解读
后端
不靠谱程序员24 分钟前
"白描APP" OCR 软件 API 逆向抓取
后端·爬虫
小华同学ai26 分钟前
6.4K star!企业级流程引擎黑马,低代码开发竟能如此高效!
后端·github