当前位置: 首页 > news >正文

无锡大型网站建设公司志鸿优化设计官网

无锡大型网站建设公司,志鸿优化设计官网,个人建网站wordpress,资源付费网站制作springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们,上两期内容中,我们对于分布式kv存储中间件有了简单的认识,完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper,既然有了认识&a…

springboot 集成 etcd

往期内容

  • ETCD 简介
  • docker部署ETCD

前言

好久不见各位小伙伴们,上两期内容中,我们对于分布式kv存储中间件有了简单的认识,完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper,既然有了认识,完成了部署,那么当然要用起来啦

那么本期我们简单使用springboot 集成etcd 实现一些简单的数据操作


1-创建springboot工程

对于java开发的小伙伴来说,springboot项目的创建这块,我们不在过多赘述,简单贴一下我的版本依赖,我们直接跳转至下一环节

<properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties>

2-集成依赖

简单的开发需要集成ETCD的依赖

那么直接pom.xml

<!-- https://mvnrepository.com/artifact/io.etcd/jetcd-core 主要依赖--><dependency><groupId>io.etcd</groupId><artifactId>jetcd-core</artifactId><version>0.7.5</version></dependency><!-- (可选依赖)-><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version><scope>provided</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.52</version></dependency>

3-全局配置

application.yml

#etcd
etcd:host: http://XXXXXX #你自己的宿主机port: 12379  #etcd的宿主机port 上一节中我的容器中的2379映射到了宿主机上的12379 所以配置12379

增加全局配置文件读取yml配置信息

@Configuration
@Data
public class EtcdConfig {@Value("${etcd.host}")private String etcdHost;@Value("${etcd.port}")private int etcdPort;}

创建etcd连接工厂

 @Beanpublic Client etcdFactory() {return Client.builder().endpoints(etcdHost + ":" + etcdPort).build();}

4-接入使用

创建service类进行简单的操作,这里简单的存储和redis一样,也是key-value的形式,不过多赘述

对于租约lease 而言类似一redis的键设置过期时间,过期时间内可以续期,过期时间之后etcd将会删除存储的内容

package com.jerry.springetcd.service;import com.alibaba.fastjson2.JSON;
import io.etcd.jetcd.ByteSequence;
import io.etcd.jetcd.Client;
import io.etcd.jetcd.Lease;
import io.etcd.jetcd.kv.GetResponse;
import io.etcd.jetcd.kv.PutResponse;
import io.etcd.jetcd.lease.LeaseTimeToLiveResponse;
import io.etcd.jetcd.options.LeaseOption;
import io.etcd.jetcd.options.PutOption;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;@Servicepublic class EtcdService {@Resourceprivate Client etcdClient;/**** Put a key-value pair to etcd* @param key* @param value* @return*/public CompletableFuture<PutResponse> putValueWithOutLease(String key, String value) {ByteSequence keyByte = ByteSequence.from(key, StandardCharsets.UTF_8);ByteSequence valueByte = ByteSequence.from(value, StandardCharsets.UTF_8);return etcdClient.getKVClient().put(keyByte, valueByte);}/**** Get the value of a key from etcd* @param key* @return*/public CompletableFuture<String> getValue(String key) {ByteSequence keyByte = ByteSequence.from(key, StandardCharsets.UTF_8);CompletableFuture<GetResponse> getFuture = etcdClient.getKVClient().get(keyByte);return getFuture.thenApply(getResponse -> {if (getResponse.getKvs().isEmpty()) {return null;}return getResponse.getKvs().get(0).getValue().toString(StandardCharsets.UTF_8);});}/**** Delete a key-value pair from etcd* @param key* @return*/public CompletableFuture<Void> deleteValue(String key) {ByteSequence keyByte = ByteSequence.from(key, StandardCharsets.UTF_8);return etcdClient.getKVClient().delete(keyByte).thenAccept(deleteResponse -> {});}/**** Put a key-value pair to etcd with a lease* @param key* @param value* @param leaseTime* @param timeout* @return* @throws ExecutionException* @throws InterruptedException* @throws TimeoutException*/public CompletableFuture<PutResponse> putValueWithLease(String key, String value, long leaseTime, long timeout) throws ExecutionException, InterruptedException, TimeoutException {ByteSequence keyByte = ByteSequence.from(key, StandardCharsets.UTF_8);ByteSequence valueByte = ByteSequence.from(value, StandardCharsets.UTF_8);Lease leaseClient = etcdClient.getLeaseClient();long leaseId = leaseClient.grant(leaseTime).get(timeout, TimeUnit.SECONDS).getID();System.out.println("Lease ID: " + leaseId);PutOption putOption = PutOption.newBuilder().withLeaseId(leaseId).build();// put value with leaseCompletableFuture<PutResponse> putResponse = etcdClient.getKVClient().put(keyByte, valueByte, putOption);return putResponse;}/**** 续租一个已存在的租约* @param leaseId* @return*/public CompletableFuture<Void> renewLease(long leaseId) {Lease leaseClient = etcdClient.getLeaseClient();return leaseClient.keepAliveOnce(leaseId).thenAccept(keepAliveResponse -> {if (keepAliveResponse.getTTL() == -1) {// lease has expiredSystem.out.println("Lease has expired");}else {System.out.println("Lease is renewed");}});}/**** 获取租约的信息* @param leaseId* @return*/public CompletableFuture<LeaseTimeToLiveResponse> getLeaseInfo(long leaseId) throws ExecutionException, InterruptedException {Lease leaseClient = etcdClient.getLeaseClient();LeaseTimeToLiveResponse lTRes = leaseClient.timeToLive(leaseId, LeaseOption.newBuilder().withAttachedKeys().build()).get();return CompletableFuture.completedFuture(lTRes);}
}

创建简单的controller 进行请求尝试

//存 
@PostMapping("/putValueWithOutLease")public CompletableFuture<PutResponse> putValueWithOutLease(@RequestParam String key, @RequestParam String value) {return etcdService.putValueWithOutLease(key, value);}
//取
@GetMapping("/get")public CompletableFuture<String> getValueWithOutLease(@RequestParam String key) {return etcdService.getValue(key);}
//删除@DeleteMapping("/deleteValue")public CompletableFuture<Void> deleteValue(@RequestParam String key) {return etcdService.deleteValue(key);}
//带租约的存储@PostMapping("/putValueWithLease")public CompletableFuture<PutResponse> putValueWithLease(@RequestParam String key,@RequestParam String value,@RequestParam Long leaseTime,@RequestParam Long timeOut) throws ExecutionException, InterruptedException, TimeoutException {return etcdService.putValueWithLease(key, value,leaseTime, timeOut);}
//顺序存储@PutMapping("/writeWithOutLease")public String writeValue(@RequestParam int num) {logger.info("write value to etcd");StopWatch stopWatch = new StopWatch();stopWatch.start("write");for (int i = 0; i < num; i++) {etcdService.putValueWithOutLease("/test/" + i, String.valueOf(i));}stopWatch.stop();logger.info("write value to etcd, time: " + stopWatch.prettyPrint());return "success";}
//查看租约状态@PostMapping("/viewLeaseDetail")public CompletableFuture<LeaseTimeToLiveResponse> getLeaseInfo(@RequestParam Long leaseId) throws ExecutionException, InterruptedException {return etcdService.getLeaseInfo(leaseId);}
//续租@PostMapping("/renewLease")public CompletableFuture<Void> renewLease(@RequestParam long leaseId) throws ExecutionException, InterruptedException, TimeoutException {return etcdService.renewLease(leaseId);}

5-接口模拟验证

使用apipost 进行接口调用,查看执行情况

  • 不带租约存储
    请添加图片描述

请添加图片描述

  • 不带租约查询

请添加图片描述

  • 手动删除key

请添加图片描述

  • 删除后重新查询,返回空值

请添加图片描述

  • 带租约存储值

设置key=/acc/test val=hello etcd 租约时间为2min的数据存储

请添加图片描述

请添加图片描述

  • 查询数据信息
    请添加图片描述

demo gitee地址

http://www.yidumall.com/news/91681.html

相关文章:

  • 医院网站系统源码网站seo推广计划
  • 网站建设实训致谢语调研报告万能模板
  • 做三个月网站广告收入网站代运营推广
  • 合肥网站制作方案私域流量和裂变营销
  • php靓号网站源码厦门seo关键词优化
  • 网店设计思路怎么写余姚seo智能优化
  • 泸州大浪科技做网站合肥网站推广助理
  • wordpress访问统计西安搜索引擎优化
  • 深圳app开发公司排名前十windows系统优化软件
  • 哪些网站有好的营销案例枸橼酸西地那非片多长时间见效
  • 博物馆展柜谷歌优化的最佳方案
  • 新手学做网站图纸青岛seo青岛黑八网络最强
  • 网站可以做多少个关键词优化网站seo
  • 云南城市建设职业学院网站怎么投放广告
  • 网站怎么做二维码百度平台商家客服
  • 品牌网站建设报价广州做网站的公司哪家好
  • 手机端网站变成wap搜索大全引擎地址
  • 政府网站cms安装百度一下
  • 长沙市网站制作哪家好新闻头条免费下载安装
  • 哪个旅游网站规划好品牌网站建设哪家好
  • 固原住房和城乡建设厅网站个人可以做推广的平台有哪些
  • 襄阳蒂凯网络网站建设小程序网络营销工具与方法
  • 有什的自学做网站创建网站步骤
  • 沧州做网站优化哪家公司便宜百度销售
  • 深圳全网营销网站电脑系统优化软件十大排名
  • 私人制定网站宁波网站推广优化公司怎么样
  • 怎样创建设计公司网站百度关键词优化多久上首页
  • 如何做网站的客服网络营销做得好的产品
  • 数据网站有哪些打开浏览器直接进入网站
  • 动态网站设计与开发心得体会软件外包企业排名