seo网站优化知识网站如何进行优化设计

news/2025/9/30 17:06:48/文章来源:
seo网站优化知识,网站如何进行优化设计,免费咨询劳动法电话,中国空间站组成部分文章目录 依赖bus应用接口用到的封装参数类 接收的应用监听器定义的事件类 使用bus定义bus远程调用A应用数据更新后通过bus数据同步给B应用 依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bus-amqp… 文章目录 依赖bus应用接口用到的封装参数类 接收的应用监听器定义的事件类 使用bus定义bus远程调用A应用数据更新后通过bus数据同步给B应用 依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bus-amqp/artifactId/dependencybus应用 类似于生产者 接口 供内部其他应用使用,远程调用该接口实现各应用之间数据同步参数1定义事件,参数2定义操作具体crud,参数3定义传参数据,参数4定义给哪个应用(nacos注册的应用名)同步数据 import cn.hutool.log.Log; import cn.hutool.log.LogFactory; import com.xyc.sms.common.bus.events.DataSyncEventEnum; import com.xyc.sms.common.bus.events.DataSyncEventFactory; import com.xyc.sms.common.bus.events.DataSyncOperateTypeEnum; import com.xyc.sms.common.entity.Result; import org.springframework.cloud.bus.ServiceMatcher; import org.springframework.context.ApplicationEventPublisher; import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** 数据同步通知事件控制器,该事件主要用于平台中常规的数据同步通知,* 需要用于其他功能请新增类* 需要增加同步的方式请在{link DataSyncEventEnum}增加事件枚举* 同时在{link com.xyc.sms.common.bus.events.dataSync}下增加事件类,新增的事件类需要继承{link com.xyc.sms.common.bus.events.DataSyncEvent}*/ RestController RequestMapping(/default) public class DataSyncNotifyEventController {private static final Log logger LogFactory.get();Resourceprivate ServiceMatcher busServiceMatcher;Resourceprivate ApplicationEventPublisher applicationEventPublisher;/*** 发布数据同步通知事件** param eventEnum 事件枚举,可通过枚举找到对应的事件类* param operateType 操作类型枚举* param obj 需要处理的消息* param destination 目的地,为null则是广播给所有该事件的监听器* return 发布结果*/PostMapping(/publish/{eventEnum}/{operateType})public Result publishDataSyncNotifyEvent(PathVariable(eventEnum) DataSyncEventEnum eventEnum,PathVariable(operateType) DataSyncOperateTypeEnum operateType,RequestBody Object obj,RequestParam(value destination, required false) String destination) {try {applicationEventPublisher.publishEvent(DataSyncEventFactory.getInstanceForEvent(eventEnum,operateType,obj,busServiceMatcher.getServiceId(),destination));return Result.returnSuccessWithMsg(success);} catch (Exception e) {logger.error(e);return Result.returnFail(e.getMessage());}} }事件工厂类 import com.fasterxml.jackson.databind.ObjectMapper;import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Arrays;public class DataSyncEventFactory {private static final ObjectMapper OM new ObjectMapper();/*** 通过事件的类模板获取构造器并调用,生成事件的实体类** param operateType 操作类型* param source 事件原数据* param originService 原服务* param destinationService 目标服务* return 事件实体类* throws NoSuchMethodException 通过类模板无法找到相应的构造方法所抛出的异常* throws InvocationTargetException 构造器创建实例可能出现的调用目标异常* throws InstantiationException 构造器创建实例可能出现的实例化异常* throws IllegalAccessException 构造器创建实例可能出现的无法访问异常* throws IOException json转化出现IO的异常* throws ClassNotFoundException 通过类名{link DataSyncEventEnum#getEventClassName()}没有找到对应类*/public static DataSyncEvent? getInstanceForEvent(DataSyncEventEnum eventEnum,DataSyncOperateTypeEnum operateType,Object source,String originService,String destinationService)throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, IOException, ClassNotFoundException {Constructor?[] constructors DataSyncEventFactory.getEventClass(eventEnum).getDeclaredConstructors();Constructor? constructor Arrays.stream(constructors).filter(c - c.getParameterCount() 4).findFirst().orElseThrow(NoSuchMethodException::new);// 值转化Object o OM.readValue(OM.writeValueAsString(source), constructor.getParameterTypes()[1]);return (DataSyncEvent?) constructor.newInstance(operateType, o, originService, destinationService);}private static Class? getEventClass(DataSyncEventEnum eventEnum) throws ClassNotFoundException {return Class.forName(eventEnum.getEventClassName());} }用到的封装参数类 定义各事件的枚举(只定义全类限定名称) public enum DataSyncEventEnum {/*** 黑名单同步,参数为事件的类型名注意需要使用全限定类名* see com.xyc.sms.common.bus.events.dataSync.BlackListSyncEvent*/BLACKLIST_SYN(com.xyc.sms.common.bus.events.dataSync.BlackListSyncEvent),/*** 路由同步* see com.xyc.sms.common.bus.events.dataSync.RouteSyncEvent*/ROUTE_SYN(com.xyc.sms.common.bus.events.dataSync.RouteSyncEvent);/*** 事件类型名* see DataSyncEvent 该抽象类的实现类*/private final String eventClassName;DataSyncEventEnum(String eventClassName) {this.eventClassName eventClassName;}public String getEventClassName() {return eventClassName;} }定义crud操作枚举 public enum DataSyncOperateTypeEnum implements Serializable {ADD, UPD, DEL }推送的事件类 /*** 数据同步通知事件,作为一般通用事件使用,如需要特殊处理建议新增事件*/ public abstract class DataSyncEventT extends RemoteApplicationEvent {/*** 事件数据*/private DataSyncT dataSync;public DataSyncT getDataSync() {return dataSync;}public void setDataSync(DataSyncT dataSync) {this.dataSync dataSync;}/*** 基础构造器** param source 引发事件的原始数据* param originService 引发事件的原始服务* param destinationService 事件的目标服务*/public DataSyncEvent(DataSyncT source, String originService, String destinationService) {super(source, originService, destinationService);this.dataSync source;}/*** 事件的日志打印,会在监听器监听到事件时输出打印* 结果尽可能不要有换行,保证日志输出在一行内* 该方法可以在子类中重写** return 日志*/public String logPrint() {return String.format({\originService\:\%s\,\destinationService\:\%s\,\id\:\%s\,\dataSync\:%s,\timestamp\:\%s\}, this.getId(), this.getOriginService(), this.getDestinationService(), Objects.nonNull(this.dataSync) ? this.dataSync.toString() : null, this.getTimestamp());}/*** 数据同步的原始数据封装*/public static class DataSyncT implements Serializable {private DataSyncOperateTypeEnum operateType;private T data;public DataSync() {}public DataSync(DataSyncOperateTypeEnum operateType, T data) {this.operateType operateType;this.data data;}public DataSyncOperateTypeEnum getOperateType() {return operateType;}public T getData() {return data;}Overridepublic String toString() {return {\operateType\: operateType ,\data\: data };}} }应用枚举 /*** 服务枚举*/ public enum ServiceEnum {SMS_BLACK_API(sms-black-api),SMS_RULES(sms-rules);public final String serviceName;ServiceEnum(String serviceName) {this.serviceName serviceName;} }接收的应用 类似于消费者 监听器 推送过来的操作枚举类crud的值,决定执行哪个crud的具体方法该类放在接收的应用中,其他顶部继承的类放在common包中即可 import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.log.Log; import cn.hutool.log.LogFactory; import com.xyc.sms.common.bus.DataSyncListener; import com.xyc.sms.common.bus.events.dataSync.RouteSyncEvent; import com.xyc.sms.common.entity.sms.Route; import com.xyc.sms.rules.dao.boss.RouteMapper; import com.xyc.sms.rules.data.RuleSymbol; import com.xyc.sms.rules.service.SynService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors;/*** 路由同步通知监听器*/ Component public class RouteSynNotifyListener extends DataSyncListenerRouteSyncEvent, ListRoute {private static final Log log LogFactory.get();Autowiredprivate RouteMapper routeMapper;Autowiredprivate SynService synService;Overridepublic void handleByADD(ListRoute data) {Optional.ofNullable(data).ifPresent(ls - {if (ls.isEmpty()) {return;}long l System.currentTimeMillis();String time DateUtil.formatDateTime(ls.get(0).getCreateTime());ListRoute list routeMapper.selectByCreatetime(time);if (CollectionUtil.isEmpty(list)) {return;}// 加载到内存中list.forEach(r - RuleSymbol.RouteMap.put(r.getId(), r));synService.transformRoute(list, (s, r) - RuleSymbol.RouteChannelMap.put(s, r));log.info(RouteSynNotifyListener - {} - add | createTime:{}, (System.currentTimeMillis() - l), time);});}Overridepublic void handleByUPD(ListRoute data) {// 流程还是先删除后新增的方式Optional.ofNullable(data).ifPresent(ls - {ListInteger collect ls.stream().map(Route::getId).filter(Objects::nonNull).collect(Collectors.toList());if (collect.isEmpty()) {return;}long l System.currentTimeMillis();// 如果有先删除ListRoute c collect.stream().map(RuleSymbol.RouteMap::get).filter(Objects::nonNull).collect(Collectors.toList());if (!c.isEmpty()) {synService.transformRoute(c, (s, r) - RuleSymbol.RouteChannelMap.remove(s, r));}// 如果有再加入ListRoute list routeMapper.selectById(collect);if (!list.isEmpty()) {list.forEach(r - RuleSymbol.RouteMap.put(r.getId(), r));synService.transformRoute(list, (s, r) - RuleSymbol.RouteChannelMap.put(s, r));}log.info(RouteSynNotifyListener - {} - update | {}, (System.currentTimeMillis() - l), collect);});}Overridepublic void handleByDEL(ListRoute data) {Optional.ofNullable(data).ifPresent(ls - {long l System.currentTimeMillis();ListRoute collect ls.stream().map(r - RuleSymbol.RouteMap.remove(r.getId())).filter(Objects::nonNull).collect(Collectors.toList());if (collect.isEmpty()) {return;}synService.transformRoute(collect, (s, r) - RuleSymbol.RouteChannelMap.remove(s));log.info(RouteSynNotifyListener - {} - remove, (System.currentTimeMillis() - l));});} }继承的抽象监听类 import cn.hutool.log.Log; import cn.hutool.log.LogFactory; import com.xyc.sms.common.bus.events.DataSyncEvent; import org.springframework.context.ApplicationListener;/*** 数据同步事件监听器* 需要具体的子类实现,并注册到spring容器中** param T 数据同步件*/ public abstract class DataSyncListenerT extends DataSyncEventD, D implements ApplicationListenerT {private static final Log logger LogFactory.get();Overridepublic void onApplicationEvent(T event) {logger.info([DataSyncListener][onApplicationEvent] trigger event - {} - {}, event.getClass().getName(), event.logPrint());try {triggerEvent(event);} catch (Exception e) {logger.error(e);}}/*** 触发监听,处理事件** param event 事件*/public void triggerEvent(T event) {DataSyncEvent.DataSyncD source event.getDataSync();switch (source.getOperateType()) {case ADD:handleByADD(source.getData());return;case UPD:handleByUPD(source.getData());return;case DEL:handleByDEL(source.getData());return;default:}}/*** 处理添加事件* 由子类实现** param data 需要处理的数据*/public abstract void handleByADD(D data);/*** 处理修改事件* 由子类实现** param data 需要处理的数据*/public abstract void handleByUPD(D data);/*** 处理删除事件* 由子类实现** param data 需要处理的数据*/public abstract void handleByDEL(D data); }定义的事件类 上面封装的事件枚举所记录的是该类的全类限定名称 package com.xyc.sms.common.bus.events.dataSync;import com.xyc.sms.common.bus.events.DataSyncEvent; import com.xyc.sms.common.bus.events.DataSyncOperateTypeEnum; import com.xyc.sms.common.entity.sms.Route;import java.util.List;public class RouteSyncEvent extends DataSyncEventListRoute {private static final long serialVersionUID -501657066268464154L;public RouteSyncEvent(DataSyncOperateTypeEnum operateType, ListRoute Routes, String originService, String destinationService) {super(new DataSync(operateType, Routes), originService, destinationService);} }继承的抽象事件类 /*** 数据同步通知事件,作为一般通用事件使用,如需要特殊处理建议新增事件*/ public abstract class DataSyncEventT extends RemoteApplicationEvent {/*** 事件数据*/private DataSyncT dataSync;public DataSyncT getDataSync() {return dataSync;}public void setDataSync(DataSyncT dataSync) {this.dataSync dataSync;}/*** 基础构造器** param source 引发事件的原始数据* param originService 引发事件的原始服务* param destinationService 事件的目标服务*/public DataSyncEvent(DataSyncT source, String originService, String destinationService) {super(source, originService, destinationService);this.dataSync source;}/*** 事件的日志打印,会在监听器监听到事件时输出打印* 结果尽可能不要有换行,保证日志输出在一行内* 该方法可以在子类中重写** return 日志*/public String logPrint() {return String.format({\originService\:\%s\,\destinationService\:\%s\,\id\:\%s\,\dataSync\:%s,\timestamp\:\%s\}, this.getId(), this.getOriginService(), this.getDestinationService(), Objects.nonNull(this.dataSync) ? this.dataSync.toString() : null, this.getTimestamp());}/*** 数据同步的原始数据封装*/public static class DataSyncT implements Serializable {private DataSyncOperateTypeEnum operateType;private T data;public DataSync() {}public DataSync(DataSyncOperateTypeEnum operateType, T data) {this.operateType operateType;this.data data;}public DataSyncOperateTypeEnum getOperateType() {return operateType;}public T getData() {return data;}Overridepublic String toString() {return {\operateType\: operateType ,\data\: data };}} }使用bus 引用注入bus应用的接口远程调用 定义bus远程调用 FeignClient(valuesms-bus, fallbackFactory DataSyncNotifyEventServiceFallbackFactory.class) public interface DataSyncNotifyEventService {/*** 发布数据同步通知事件* destination 参数被删除,不需要指定服务** param eventEnum 事件枚举,可通过枚举找到对应的事件类* param operateType 操作类型枚举* param obj 需要处理的消息* return 发布结果*/PostMapping(/default/publish/{eventEnum}/{operateType})Result publishDataSyncNotifyEvent(PathVariable(eventEnum) DataSyncEventEnum eventEnum,PathVariable(operateType) DataSyncOperateTypeEnum operateType,RequestBody Object obj,RequestParam(destination) String destination); }注入使用 A应用数据更新后通过bus数据同步给B应用 在A应用的业务层写以下代码 try {result dataSyncNotifyEventService.publishDataSyncNotifyEvent(DataSyncEventEnum.ROUTE_SYN,DataSyncOperateTypeEnum.ADD,new ArrayListRoute() {{Route r new Route();r.setCreateTime(date);add(r);}}, ServiceEnum.SMS_RULES.serviceName);log.info(新增路由调用通知同步所有服务 result:{}, result);} catch (Exception e) {log.error(同步异常 {}, result, e);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可以做长页的网站怎么更改网站域名

图像分类是模式识别重要研究领域之一,它的任务是把目标样本分成不同类别,赋予样本相应类别标签。分类实现的基础是用传感器检测到样本的特征,比如形状、颜色、纹理等基本特征或通过基本特征提取更为复杂的特征信息,其中纹理是表示…

一个人做公司管理网站一灯wordpress主题

随着社交媒体的不断发展和智能手机的普及,微信已经成为我们日常生活中不可或缺的一部分。作为一个商家或者个人品牌,利用微信进行群发消息是一种非常便捷和高效的方式来推广产品或者传递信息。 然而,传统的微信群发功能却有着一些限制&#…

怎么建设一个淘宝客网站制作网站用什么软件好

背景 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点。在移动互联网时代,前端人员除了传统的 XSS、CSRF 等安全问题之外,又时常遭遇网络劫持、非法调用 Hybrid API 等新…

手机网站外链巢湖网站设计

屏幕锁,就是锁住屏幕不让用户误触摸,从开发者的角度看就是不响应用户的点击事件。 屏幕锁界面 可以自己创建一个布局文件,或者直接创建一个View(例如ImageView)。 参数LayoutParams mLayoutParams new LayoutParam…

公司做网站比较好的青海旅游的网站建设

java中有7个位运算&#xff08;&、|、^、~、>>、<<和>>>&#xff09; 第一组 分别是按位与&、按位或|、按位异或^&#xff0c;按位取反~&#xff0c;它们的运算规则是&#xff1a; 按位与& : 两位全为1&#xff0c;结果为1&#xff0c;否则…

浙江网站建设设计wordpress菜单添加链接

WPF布局原则 不应显式设置大小 为了布局的稳定性&#xff0c;控件的大小应该可以自动适应容器。如下为新建一个窗体&#xff0c;默认包含一个Grid容器&#xff0c;该控件没有显式设置宽高&#xff0c;所以&#xff0c;在改变窗体大小的时候&#xff0c;该容器的大小也随着变化…

网站建设管理招聘贵阳专业网站建设公司哪家好

CSS 3D变换是Web开发中一项强大的技术&#xff0c;它允许开发者在网页上创建和展示三维图形和动画。以下是关于CSS 3D变换的深入浅出介绍&#xff1a; 一、3D变换基础 坐标轴&#xff1a; X轴&#xff1a;水平向右&#xff0c;正方向为右&#xff0c;负方向为左。Y轴&#xff…

做co网站重庆妇科医院咨询

Go语言学习笔记&#xff1a;GORM 介绍及快速入门&#xff0c;简单查询 前言 GORM 是一个用 GoLang 语言编写的 ORM&#xff08;对象关系映射&#xff09;库。它被设计为开发者友好的方式来进行数据库操作。GORM 提供了一种高级的 API 来处理数据库的 CRUD&#xff08;创建、读…

文登网站建设南京做网站南京乐识专心

市面上读取 ini 的包都是 读取整个文件到内存中,再获取和修改值, 最后自己再调用保存文件, 这种方式在读取大文件的时候 非常的不友好. windows api 中有现成的高效方法 安装 jna-platform (里面封装了各个系统的 api ,直接用就行. 不用再手动写固定的函数定义) jna-platfor…

做视频网站程序多少钱企业宣传片视频模板

在Vue.js中&#xff0c;$nextTick是一个用于延迟执行一段代码的实例方法。它的作用是在DOM更新后立即执行回调函数&#xff0c;确保在DOM更新完成后再进行操作。以下是其具体用法&#xff1a; 使用场景&#xff1a;当需要在数据变化后立即对DOM进行操作时&#xff0c;可以使用…

开一个二手车销售网站怎么做贵阳网站seo

1、参数化 1&#xff09;、准备参数化文件 2&#xff09;&#xff0c;添加CSV数据文件设置 3&#xff09;、在请求里 引用参数 2、关联函数 1&#xff09;、给学生充值金币需要从登录返回获取登录cookie 在登录接口添加后置处理器JSON Extractor 用户登录返回结果为&#xff1…

移动端网站制作的有哪些要求网页版原神

爱丽丝和鲍勃一起玩游戏&#xff0c;他们轮流行动。爱丽丝先手开局。 最初&#xff0c;黑板上有一个数字 N 。在每个玩家的回合&#xff0c;玩家需要执行以下操作&#xff1a; 选出任一 x&#xff0c;满足 0 < x < N 且 N % x 0 。 用 N - x 替换黑板上的数字 N 。 如…

js 获取下一个月时间和下一年的时间

// d 实例 :2025-09-01 getNextMonthDate(d) { let t = d.split("-"); console.log(t) let year = parseInt(t[0]); let month = parseInt(t[1]); let day = t[2]; if (month === 1 && (da…

【Rust GUI开发入门】编写一个本地音乐播放器(5. 制作音乐列表组件) - Jordan

目的是要做一个这样的音乐列表组件:包含:一个标题栏 多个列表项制作标题栏 需要在标题栏上显示排序图标,实现点击排序功能,因此额外需要定义一个枚举类型SortKey指示排序依据。这里的排序图标也手动绘制,不使用网…

实用指南:分布式调度问题:定时任务

实用指南:分布式调度问题:定时任务2025-09-30 16:25 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

运输公司网站模板辽宁建设工程信息网变更

文章目录 一、if语句1.if语句2.if 和 elif区别3.三元表达式 二、循环语句1.range函数和循环结束关键字2.while循环3.for循环 三、逻辑运算符1.and语句2.or语句3.not语句4.逻辑运算法的优先级 四、python运算符优先级和结合性一览表 一、if语句 1.if语句 1.if单分支语句 格式…

【Nordic】nRF9151的SLM例程常用AT指令说明

nRF9151的SLM例程常用AT指令说明 本文章主要讲解如何使用nRF9151DK测试SLM例程并且列出常用的AT指令一、SLM介绍 SLM(Serial LTE Modem)是 Nordic Semiconductor 提供的一种基于串口的 LTE 调制解调器解决方案。它通…

sql server经典语句「转」

1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密: select encrypt(原始密码) select pwdencrypt(原始密码) select pwdcompare(原始密码,加密后密码…

Codeforces 2149G Buratsuta 3 题解 [ 蓝 ] [ 摩尔投票 ] [ 线段树 ] [ 随机化 ] [ 主席树 ] [ 根号分治 ]

Buratsuta 3:典中典中典中典中典了属于是。 Sol.1 摩尔投票 首先维护区间出现次数大于等于 $\left \lfloor \dfrac{len}{k} \right \rfloor $ 次的数是摩尔投票板子,每次把 \(k\) 个不同的数相消即可。然后因为摩尔投…

2025 年最新推荐软件开发机构榜:聚焦微服务架构与 724 小时服务的优质厂商精选指南人力资源管理系统/资产管理系统/数据中台管理系统/流程管理系统软件开发公司推荐

当前数字化转型浪潮下,政企机构对软件开发服务的需求愈发旺盛,涵盖 CRM 系统、物联网、运维管理等多类场景。但市场中厂商资质参差不齐,部分厂商技术架构落后,难以适配业务增长;部分重开发轻售后,故障响应迟缓;…