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

基于php技术的个人网站设计深圳市交易服务中心

基于php技术的个人网站设计,深圳市交易服务中心,展示设计设计万能说明,wordpress固定链接分类etcd 是一个分布式键值对存储#xff0c;设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁#xff0c;leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用#xff0c;持久性数据存储和检索而准备。 以下代码实现的主要业务是#xf… etcd 是一个分布式键值对存储设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用持久性数据存储和检索而准备。 以下代码实现的主要业务是通过etcd自带监听功能动态将监听的key进行缓存到本地缓存达到实时监听key的变化并且不需要多次的网络请求。 Pom依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- cache 缓存 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId/dependency!-- jetcd-core --dependencygroupIdio.etcd/groupIdartifactIdjetcd-core/artifactIdversion0.7.6/version/dependency yaml配置 etcd:watch-key-prefix: yn-demoendpoints:- http://127.0.0.1:2379- http://127.0.0.1:2380 参数说明 watch-key-prefix 参数用于限制服务监听的前缀key endpointsetcd的连接url 配置类 EtcdProperties (etcd 属性配置) import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.net.URI;/*** etcd 属性配置** author yunnuo* date 2023-09-25*/ Data Component ConfigurationProperties(prefix etcd) public class EtcdProperties {/*** etcd url*/private ListURI endpoints;/*** 监听key的前缀*/private String watchKeyPrefix;} EtcdConfig(配置类) import io.etcd.jetcd.Client; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;/*** etcd 配置类** author yunnuo * date 2023-09-25*/ Configuration public class EtcdConfig {Resourceprivate EtcdProperties etcdProperties;Beanpublic Client etcdClient(){return Client.builder().endpoints(etcdProperties.getEndpoints()).build();}} etcd 实现监听功能核心 监听器 import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; import com.ukayunnuo.config.EtcdProperties; import com.ukayunnuo.enums.WatchKeyStatus; import io.etcd.jetcd.*; import io.etcd.jetcd.kv.GetResponse; import io.etcd.jetcd.options.WatchOption; import io.etcd.jetcd.watch.WatchEvent; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Objects;/*** etcd 监听器** author yunnuo a href2552846359qq.comEmail: 2552846359qq.com/a* date 2023-09-25*/ Slf4j Component public class EtcdKeyWatcher {Resourceprivate Client etcdClient;Resourceprivate EtcdProperties etcdProperties;private final Cache watchedKeysCache;public static final String CACHE_ETCD_KEYS_FILED etcdKeys;public EtcdKeyWatcher(CacheManager cacheManager) {this.watchedKeysCache cacheManager.getCache(CACHE_ETCD_KEYS_FILED);}/*** 监听并存储到缓存** param key 配置key* return 监听结果*/public WatchKeyStatus watchKeyHandlerAndCache(String key) {if (Objects.nonNull(watchedKeysCache.get(key))) {return WatchKeyStatus.NO_NEED_MONITOR;}if (StrUtil.isBlank(etcdProperties.getWatchKeyPrefix())) {return WatchKeyStatus.NO_MONITOR;}boolean keyPrefixFlag Arrays.stream(etcdProperties.getWatchKeyPrefix().split(,)).filter(StrUtil::isNotBlank).map(String::trim).anyMatch(prefix - key.substring(0, key.indexOf(.)).equals(prefix));if (Boolean.FALSE.equals(keyPrefixFlag)) {String value getValueForKVClient(key);if (StrUtil.isNotBlank(value)) {// 直接缓存, 不进行监听watchedKeysCache.put(key, value);return WatchKeyStatus.CACHE_NO_MONITOR;}return WatchKeyStatus.FAILED;}WatchOption watchOption WatchOption.builder().withRange(ByteSequence.from(key, StandardCharsets.UTF_8)).build();Watch.Listener listener Watch.listener(res - {for (WatchEvent event : res.getEvents()) {log.info(Watch.listener event:{}, JSONObject.toJSONString(event));KeyValue keyValue event.getKeyValue();if (Objects.nonNull(keyValue)) {// 将监听的键缓存到本地缓存中watchedKeysCache.put(keyValue.getKey().toString(StandardCharsets.UTF_8), keyValue.getValue().toString(StandardCharsets.UTF_8));log.info(watchClient.watch succeed! key:{}, key);}}});Watch watchClient etcdClient.getWatchClient();watchClient.watch(ByteSequence.from(key, StandardCharsets.UTF_8), watchOption, listener);return WatchKeyStatus.SUCCEEDED;}/*** 获取 etcd中的 key值* param key 配置key* return 结果*/public String getValueForKVClient(String key) {KV kvClient etcdClient.getKVClient();ByteSequence keyByteSequence ByteSequence.from(key, StandardCharsets.UTF_8);GetResponse response;try {response kvClient.get(keyByteSequence).get();} catch (Exception e) {// 处理异常情况log.error(etcdClient.getKVClient error! key:{}, e:{}, key, e.getMessage(), e);return null;}if (response.getKvs().isEmpty()) {return null;}return response.getKvs().get(0).getValue().toString(StandardCharsets.UTF_8);}} 监听枚举类 /*** 监听key 状态枚举** author yunnuo a href2552846359qq.comEmail: 2552846359qq.com/a* date 2023-09-26*/ public enum WatchKeyStatus {/*** 监听成功*/SUCCEEDED,/*** 监听失败*/FAILED,/*** 无需再次监听*/NO_NEED_MONITOR,/*** 不监听*/NO_MONITOR,/*** 走缓存但是没有进行监听*/CACHE_NO_MONITOR,; } etcd 工具类 import com.ukayunnuo.enums.WatchKeyStatus; import com.ukayunnuo.watcher.EtcdKeyWatcher; import io.etcd.jetcd.ByteSequence; import io.etcd.jetcd.Client; import io.etcd.jetcd.kv.PutResponse; import io.netty.util.internal.StringUtil; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.Optional; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture;/*** etcd 处理工具类** author yunnuo a href2552846359qq.comEmail: 2552846359qq.com/a* date 2023-09-26*/ Component public class EtcdHandleUtil {Resourceprivate Client etcdClient;Resourceprivate EtcdKeyWatcher etcdKeyWatcher;private final Cache watchedKeysCache;public static final String CACHE_ETCD_KEYS_FILED etcdKeys;public EtcdHandleUtil(CacheManager cacheManager) {this.watchedKeysCache cacheManager.getCache(CACHE_ETCD_KEYS_FILED);}/*** 监听并缓存** param key key* return 监听结果*/public WatchKeyStatus watchKeyHandlerAndCache(String key) {return etcdKeyWatcher.watchKeyHandlerAndCache(key);}/*** put Key** param key key* param value 值* return 结果*/public CompletableFuturePutResponse put(String key, String value) {return etcdClient.getKVClient().put(ByteSequence.from(key, StandardCharsets.UTF_8), ByteSequence.from(value, StandardCharsets.UTF_8));}/*** 获取值** param key key* return 结果*/public String get(String key) {OptionalCache.ValueWrapper valueWrapper Optional.ofNullable(watchedKeysCache.get(key));if (valueWrapper.isPresent()) {return Objects.requireNonNull(valueWrapper.get().get()).toString();}return StringUtil.EMPTY_STRING;}/*** 获取值** param key key* return 结果*/Nullablepublic T T get(String key, Nullable ClassT type) {return watchedKeysCache.get(key, type);}/*** 获取值** param key key* return 结果*/Nullablepublic T T get(String key, CallableT valueLoader) {return watchedKeysCache.get(key, valueLoader);} } 进行测试 请求dto import com.alibaba.fastjson2.JSONObject; import lombok.Data;/*** ETCD test req** author yunnuo a href2552846359qq.comEmail: 2552846359qq.com/a* date 2023-09-26*/ Data public class EtcdReq {private String key;private String value;Overridepublic String toString() {return JSONObject.toJSONString(this);} } controller API接口测试 /*** 测试类** author yunnuo a href2552846359qq.comEmail: 2552846359qq.com/a* date 2023-09-26*/ Slf4j RequestMapping(/etcd/demo) RestController public class EtcdTestController {Resourceprivate EtcdHandleUtil etcdHandleUtil;PostMapping(/pushTest)public ResultPutResponse pushTest(RequestBody EtcdReq req) throws ExecutionException, InterruptedException {PutResponse putResponse etcdHandleUtil.put(req.getKey(), req.getValue()).get();WatchKeyStatus watchKeyStatus etcdHandleUtil.watchKeyHandlerAndCache(req.getKey());log.info(pushTest req:{}, putResponse:{}, watchKeyStatus:{}, req, JSONObject.toJSONString(putResponse), watchKeyStatus);return Result.success(putResponse);}PostMapping(/get)public ResultString get(RequestBody EtcdReq req) {return Result.success(etcdHandleUtil.get(req.getKey()));}}
http://www.hkea.cn/news/14354590/

相关文章:

  • wordpress 网站域名广东工程建设监理协会网站
  • 做类似起点的网站wordpress站点演示
  • 中国空间站扩建POS机网站怎么做
  • 跟我学seoseo排名优化收费
  • 做网站是不是要域名费足球比赛直播平台
  • 济南网站开发哪家好浦东新区手机网站设计
  • 福建网站建设开发深圳做网站哪家公司好
  • 做本地网站赚钱吗?域名注册服务商网站
  • 动态素材网站网站域名怎么查询
  • 济南网站建设服务公司北京搜索关键词优化
  • 苏州网站建设制作网页设计实训内容及过程
  • 查询网站开发语言排网站搭建论文
  • 广西建设执业资格注册中心网站网站构成
  • 域名到网站上线WordPress这新手
  • 网站制作软件是什么电商网页设计理念
  • 网站备案个人信息科技有限公司属于什么行业
  • 慈溪企业网站建设刚做的网站怎么在百度搜到
  • 域名推广技巧安徽网站关键词优化
  • 做网站v赚钱wordpress简约企业主题
  • 西安网站建设推广专家ngrok 群晖wordpress
  • 自己做的网站如何在网络上展示太原建站公司有哪些
  • 个人网站模板建站软件技术适合女生学吗大专
  • 金华品牌网站建设wordpress 建企业网站
  • 手机ppt在哪个网站做招聘wordpress
  • 网站开发基础语言龙采网站建设资源分享平台
  • 设计类素材网站网站服务器名是什么
  • 成都网站建设 lkcms如何提高网站点击率
  • 国网商旅云网站地址做创新方法工作网站
  • 做网站前端需要编程基础吗wordpress主题 网站大全
  • 网络销售平台wordpress完美优化