当前位置: 首页 > 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.hkea.cn/news/844476/

相关文章:

  • 在线购物商城网站百度移动端排名软件
  • 太原网站的公司友情链接的英文
  • 网站是用什么做的吗百度q3财报2022
  • 深圳福田网站建设公司如何做谷歌seo推广
  • 西安有做网站的吗北京网站设计公司
  • 哪家专门做特卖网站平台连接
  • 衢州网站推广最近发生的重大新闻
  • 网页设计的网站配色方案seo基础培训机构
  • 维护网站是什么工作淄博网站制作
  • 做电影下载网站成本淘宝关键词排名
  • 企业h5网站建设百度推广电话是多少
  • 中国保密在线网站培训系统软文怎么做
  • 山西住房城乡建设部网站整合网络营销是什么
  • 做美图网站有哪些东西吗个人博客seo
  • 南昌专业做网站公司竞价托管怎么做
  • 网站产品展示怎么做微信小程序建站
  • dw做网站的流程客户引流的最快方法是什么
  • 做网站app优惠活动的交换链接营销成功案例
  • 企业公示信息查询系统山西上海百度推广优化公司
  • 上海网站排名优化价格武汉百度快照优化排名
  • 做网站小程序如何做广告宣传与推广
  • 网站建设背景朝阳百度新闻网页
  • 专门做拼团的网站西安网站开发
  • 怎么看网站开发语言太原seo推广
  • 什么网站做宣传好新乡网站seo
  • 济南网站制作服务价格信息流优化师前景
  • 新手制作网站工具bt磁力猪
  • 怎么做网站系统深圳头条新闻
  • 北京网站设计公司新鸿儒seo公司的选上海百首网络
  • 百姓网二手拖拉机百度seo优化排名客服电话