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

网站开发项目总结报告网站建设与管理

网站开发项目总结报告,网站建设与管理,金耀网站建设,做直播网站找哪个前言 在不同的场景下,执行不同的业务逻辑,在日常工作中是很寻常的事情。比如,订阅系统。在收到阿里云的回调事件、与收到AWS的回调事件,无论是收到的参数,还是执行的逻辑都可能是不同的。为了避免,每次新增…

前言

在不同的场景下,执行不同的业务逻辑,在日常工作中是很寻常的事情。比如,订阅系统。在收到阿里云的回调事件、与收到AWS的回调事件,无论是收到的参数,还是执行的逻辑都可能是不同的。为了避免,每次新增一种场景,就要改变原有的代码结构,比如,改变原有逻辑,添加 if-else结构,一种可行的方案是,使用策略模式。

策略模式

贴个链接
简单来说,就是根据请求方的类型,执行特定的业务逻辑。

问题点

网络上大部分实现策略模式的代码,很多在将具体的策略注入到Map中时,是以硬编码的方式实现的,比如掘金上的这篇文章:如何优雅的将设计模式运用到实际项目中去?

在工作中借鉴,使用截图
这种方案,虽然可以实现策略模式,但是每次新增策略都要修改这个集合。期望的方案是,新增的策略,自动注入到map中,而不必手动添加。
在这里插入图片描述

为了解决新增策略时,要修改map的情况,调研之后,发现有两种方案:

  1. 美团文章推介的 基于单例的方式,每次启动时,自动将策略注入到map中。
  2. 掘金上另一种方案:基于注解+反射的方式,动态将策略加载到map中。

相比,美团的方案更加优秀,代码改动少,且性能高。不过,本次以方案2为例说明。

代码实现

业务场景

需要提供给外部云厂商回调API,当云服务发生告警时,调用此API,将告警事情同步到服务使用方。
考虑点:

  1. 因为每家厂商的回调参数各有不同,此时,需要定义一个回调对象基类,每个云厂商对应的回调对象继承这个基类,并实现添加其特定的属性。
  2. 因为API是放开到公网上的,因此,为了避免被攻击,除了从集团域名出去外,还对IP进行了频控,比如,调用次数100次/秒。

代码结构

在这里插入图片描述

具体代码

定义实体类

基类

import lombok.Data;/*** @author wangbin16* @date 2024/1/18 15:33*/
@Data
public class CloudAlertBase {/*** name = "alertType", value = "告警类型"*/private Integer alertType;/*** 业务*/private Integer business;
}

阿里云

import lombok.Data;/*** 阿里云监控告警* @author wangbin16* @date 2024/1/18 15:35*/
@Data
public class AliyunCloudAlertAo extends CloudAlertBase {private static final long serialVersionUID = 1L;/*** name = "alertName", value = "报警名称"*/private String alertName;/*** name = "alertState", value = "报警状态"*/private String alertState;/*** name = "curValue", value = "报警发生或恢复时监控项的当前值"*/private String curValue;/*** name = "dimensions", value = "发生报警的对象"*/private String dimensions;/*** name = "expression", value = "报警规则的表达式"*/private String expression;

策略模式

策略基类

/*** @author wangbin16* @date 2024/1/18 15:41*/
public interface CloudAlertStrategy {/*** 处理云监控告警* @param param*/void handleCloudAlert(CloudAlertBase param);
}

阿里云策略

@Slf4j
@Service
@CloudAlertAnnotation(alertType = CloudAlertTypeEnum.ALIYUN)
public class AliyunCloudAlertStrategy implements CloudAlertStrategy {@Overridepublic void handleCloudAlert(CloudAlertBase param) {// TODO 处理阿里云监控告警// 暂时先发送给我 @wangbin16SendMsgUtils sendMsgUtils = new SendMsgUtils();sendMsgUtils.sendP2pPopoMsg(JSON.toJSONString(param), "wangbin16@xxx", "【阿里云监控告警】");}
}
策略注册
import org.reflections.Reflections;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** @author wangbin16* @date 2024/1/18 15:50*/
public class AnnotationCloudAlertStrategyFactory {/*** 存储策略*/static Map<Integer, CloudAlertStrategy> strategyMap = new HashMap<>();static {registerStrategy();}/*** 自动注册策略*/private static void registerStrategy() {// 通过反射获取所有的策略类Reflections reflections = new Reflections(CloudAlertStrategy.class.getPackage().getName());Set<Class<? extends CloudAlertStrategy>> cloudStrategyClassSet = reflections.getSubTypesOf(CloudAlertStrategy.class);if (cloudStrategyClassSet != null) {for (Class<?> clazz : cloudStrategyClassSet) {// 找到类型注解,自动完成策略注册if (clazz.isAnnotationPresent(CloudAlertAnnotation.class)) {CloudAlertAnnotation alertTypeAnnotation = clazz.getAnnotation(CloudAlertAnnotation.class);CloudAlertTypeEnum chargeType = alertTypeAnnotation.alertType();try {strategyMap.put(chargeType.getCode(), (CloudAlertStrategy) clazz.newInstance());} catch (InstantiationException | IllegalAccessException e) {e.getStackTrace();}}}}}/*** 提供注册策略接口,外部只需要调用此接口接口新增策略* 策略定义时,即注入,这是口子*/public static void registerChargeStrategy(CloudAlertTypeEnum alertType, CloudAlertStrategy strategy) {strategyMap.put(alertType.getCode(), strategy);}
}

策略选择器

@Service
@Slf4j
public class CloudAlertStrategySelector {public CloudAlertStrategy selector(Integer alertType) {if (alertType == null) {return null;}return AnnotationCloudAlertStrategyFactory.strategyMap.get(alertType);}
}

服务调用

@Slf4j
@Service("cloudMonitorService")
public class CloudMonitorService {@Autowiredprivate CloudAlertStrategySelector cloudAlertStrategySelector;public void handleCloudMonitor(CloudAlertBase param) {logger.info("handleCloudMonitor param:{}", JSON.toJSONString(param));CloudAlertStrategy selector = cloudAlertStrategySelector.selector(param.getAlertType());if (selector != null) {selector.handleCloudAlert(param);} else {logger.error("外部云告警异常调用, param:{}", JSON.toJSONString(param));}}
}

测试

调用指定的接口,执行指定的逻辑
在这里插入图片描述

http://www.dinnco.com/news/28542.html

相关文章:

  • 17zwd一起做网店潮汕站营销策略包括哪些内容
  • 12306网站能不能用银河二计算机做服务器啊慢得要死徐州seo管理
  • 网站内容维护费用西安百度网站快速优化
  • 长沙建网站设计视频剪辑培训班一般学费多少
  • 网站建设的心得与体会网页广告怎么投放
  • 个人博客网站制作教程百度公司注册地址在哪里
  • 做外包哪个网站好一些seo的方法有哪些
  • 一个做二维码问卷调查的网站如何在手机上制作网站
  • 品牌网站的愿望清单怎么做长春seo按天计费
  • wordpress主题 幻灯什么是seo优化推广
  • 怎么在网站上做推谷歌推广技巧
  • wap网站推荐seo免费优化公司推荐
  • 移动网站seo免费涨粉工具
  • 广东网站建设发信息51链
  • 动态网站建设步骤谷歌推广运营
  • 大理网站制作公司网站开发软件
  • 网站落地页怎么做网络营销策划方案800字
  • 深圳seo网站建设郑州网站推广公司
  • 学校网站的图片轮播怎么做自然搜索优化
  • 公司网站 优帮云腾讯云服务器
  • 成都正规小程序开发公司百度移动端优化
  • 企业网站建设需要哪些步骤网络销售
  • 网站如何做百度搜索优化网站自助建站系统
  • 北京微网站宁波做网站的公司
  • 临海市住房与城乡建设规划局网站手机优化软件下载
  • 开发一个交友app多少钱优化seo可以从以下几个方面进行
  • 网站备案要幕布照怎么让百度收录
  • 网站做淘客seo点击
  • 湖北外贸网站设计制作怎么制作公司网站
  • 装饰公司网站上海网络seo公司