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

win7 iis6.0添加网站个人网站做接口可以么

win7 iis6.0添加网站,个人网站做接口可以么,企业宽带 做网站,专业建站公司的业务内容简介#xff1a; 总以为混沌工程离你很远#xff1f;但发生故障的那一刻不是由你来选择的#xff0c;而是那一刻来选择你#xff0c;你能做的就是为之做好准备。混沌工程在阿里内部已经应用多年#xff0c;而ChaosBlade这个开源项目是阿里多年来通过注入故障来对抗故障的经…简介 总以为混沌工程离你很远但发生故障的那一刻不是由你来选择的而是那一刻来选择你你能做的就是为之做好准备。混沌工程在阿里内部已经应用多年而ChaosBlade这个开源项目是阿里多年来通过注入故障来对抗故障的经验结晶。为使大家更深入的了解其实现原理以及如何扩展自己所需要的组件故障注入我们准备了一个系列对其做详细技术剖析架构篇、模型篇、协议篇、字节码篇、插件篇以及实战篇。 作者 | 叶飞、穹谷 导读总以为混沌工程离你很远但发生故障的那一刻不是由你来选择的而是那一刻来选择你你能做的就是为之做好准备。混沌工程在阿里内部已经应用多年而ChaosBlade这个开源项目是阿里多年来通过注入故障来对抗故障的经验结晶。为使大家更深入的了解其实现原理以及如何扩展自己所需要的组件故障注入我们准备了一个系列对其做详细技术剖析架构篇、模型篇、协议篇、字节码篇、插件篇以及实战篇。 原文标题《技术剖析 Java 场景混沌工程实现系列一| 架构篇》 前言 在分布式系统架构下服务间的依赖日益复杂很难评估单个服务故障对整个系统的影响并且请求链路长监控告警的不完善导致发现问题、定位问题难度增大同时业务和技术迭代快如何持续保障系统的稳定性和高可用性受到很大的挑战。 我们知道发生故障的那一刻不是由你来选择的而是那一刻来选择你你能做的就是为之做好准备。所以构建稳定性系统很重要的一环是混沌工程在可控范围或环境下通过故障注入来持续提升系统的稳定性和高可用能力。 ChaosBladeGithub 地址https://github.com/chaosblade-io/chaosblade 是一款遵循混沌工程实验原理提供丰富故障场景实现帮助分布式系统提升容错性和可恢复性的混沌工程工具可实现底层故障的注入特点是操作简洁、无侵入、扩展性强。 其中 chaosblade-exec-jvm Github 地址https://github.com/chaosblade-io/chaosblade-exec-jvm 项目实现了零成本对 Java 应用服务故障注入。其不仅支持主流的框架组件如 Dubbo、Servlet、RocketMQ 等还支持指定任意类和方法注入延迟、异常以及通过编写 Java 和 Groovy 脚本来实现复杂的实验场景。 为使大家更深入的了解其实现原理以及如何扩展自己所需要的组件故障注入分为六篇文章对其做详细技术剖析架构篇、模型篇、协议篇、字节码篇、插件篇以及实战篇。本文将详细介绍 chaosblade-exec-jvm 的整体架构设计使用户对 chaosblade-exec-jvm 有一定的了解。 系统设计 Chaosblade-exec-jvm 基于 JVM-Sanbox 做字节码修改执行 ChaosBlade 工具可实现将故障注入的 Java Agent 挂载到指定的应用进程中。Java Agent 遵循混沌实验模型设计通过插件的可拔插设计来扩展对不同 Java 组件的支持可以很方便的扩展插件来支持更多的故障场景插件基于 AOP 的设计定义通知Advice、增强类Enhancer、切点PointCut同时结合混沌实验模型定模型ModelSpec、实验靶点Target、匹配方式Matcher、攻击动作Action。 Chaosblade-exec-jvm 在由make build编译打包时下载 JVM-Sanbox relase 包编译打包后 chaosblade-exec-jvm 做为 JVM-Sandbox 的模块。在加载 Agent 后同时监听 JVM-Sanbox 的事件来管理整个混沌实验流程通过Java Agent 技术来实现类的 transform 注入故障。 原理剖析 在日常后台应用开发中我们经常需要提供 API 接口给客户端而这些 API 接口不可避免的由于网络、系统负载等原因存在超时、异常等情况。使用 Java 语言时HTTP 协议我们通常使用 Servlet 来提供 API 接口chaosblade-exec-jvm 支持 Servlet 插件注入超时、自定义异常等故障能力。本篇将通过给 Servlet API 接口 注入延迟故障能力为例分析 chaosblade-exec-jvm 故障注入的流程。 对 Servlet API 接口/topic延迟3秒步骤如下 // 挂载 Agent blade prepare jvm --pid 888 {code:200,success:true,result:98e792c9a9a5dfea}// 注入故障能力 blade create servlet --requestpath/topic delay --time3000 --methodpost {code:200,success:true,result:52a27bafc252beee}// 撤销故障能力 blade destroy 52a27bafc252beee// 卸载 Agent blade revoke 98e792c9a9a5dfea 1. 执行过程 以下通过 Servlet 请求延迟为例详细介绍故障注入的过程。 ChaosBlade 下发挂载命令挂载 Sandbox 到应用进程激活 Java Agent例如blade p jvm --pid 888。挂载 Sandbox 后加载 chaosblade-exec-jvm 模块加载插件如 ServletPlugin、DubboPlugin 等。匹配 ServletPlugin 插件的切点、注册事件监听HttpServlet 的 doPost、doGet 方法。ChaosBlade 下发故障规则命令blade create servlet --requestpath/topic delay --time3000 --methodpost。匹配故障规则如 --requestpath/topic 访问 http://127.0.0.1/topic 规则匹配成功。匹配故障规则成功后触发故障如延迟故障、自定义异常抛出等。ChaosBlade 下发命令卸载 JavaAgent如blade revoke 98e792c9a9a5dfea。 2. 代码剖析 1挂载 Agent blade p jvm --pid 888 该命令下发后将在目标 Java 应用进程挂在 Agent 触发 SandboxModule onLoad() 事件初始化           PluginLifecycleListener 来管理插件的生命周期同时也触发 SandboxModule onActive() 事件加载部分插件加载插件对应的 ModelSpec。 // Agent 加载事件 public void onLoad() throws Throwable {ManagerFactory.getListenerManager().setPluginLifecycleListener(this);dispatchService.load();ManagerFactory.load(); } // ChaosBlade 模块激活实现 public void onActive() throws Throwable {loadPlugins(); } 2加载 Plugin Plugin 加载时创建事件监听器 SandboxEnhancerFactory.createAfterEventListener(plugin) 监听器会监听感兴趣的事件如 BeforeAdvice、AfterAdvice 等具体实现如下 // 加载插件 public void add(PluginBean plugin) {PointCut pointCut plugin.getPointCut();if (pointCut null) {return;}String enhancerName plugin.getEnhancer().getClass().getSimpleName();// 创建filter PointCut匹配Filter filter SandboxEnhancerFactory.createFilter(enhancerName, pointCut);// 事件监听int watcherId moduleEventWatcher.watch(filter, SandboxEnhancerFactory.createBeforeEventListener(plugin), Event.Type.BEFORE);watchIds.put(PluginUtil.getIdentifier(plugin), watcherId); } 3匹配 PointCut SandboxModule onActive() 事件触发 Plugin 加载后SandboxEnhancerFactory 创建 FilterFilter 内部通过 PointCut 的 ClassMatcher 和 MethodMatcher 过滤。 public static Filter createFilter(final String enhancerClassName, final PointCut pointCut) {return new Filter() {Overridepublic boolean doClassFilter(int access, String javaClassName, String superClassTypeJavaClassName,String[] interfaceTypeJavaClassNameArray,String[] annotationTypeJavaClassNameArray) {// ClassMatcher 匹配ClassMatcher classMatcher pointCut.getClassMatcher();...}Overridepublic boolean doMethodFilter(int access, String javaMethodName,String[] parameterTypeJavaClassNameArray,String[] throwsTypeJavaClassNameArray,String[] annotationTypeJavaClassNameArray) {// MethodMatcher 匹配MethodMatcher methodMatcher pointCut.getMethodMatcher();...}; } 4触发 Enhancer 如果已经加载插件此时目标应用匹配能匹配到 Filter 后EventListener 已经可以被触发但是 chaosblade-exec-jvm 内部通过 StatusManager 管理状态所以故障能力不会被触发。 例如 BeforeEventListener 触发调用 BeforeEnhancer 的 beforeAdvice() 方法在ManagerFactory.getStatusManager().expExists(targetName) 判断时候被中断具体的实现如下 public void beforeAdvice(String targetName, ClassLoader classLoader, String className,Object object,Method method, Object[] methodArguments) throws Exception {// 判断实验的状态if (!ManagerFactory.getStatusManager().expExists(targetName)) {return;}EnhancerModel model doBeforeAdvice(classLoader, className, object, method, methodArguments);if (model null) {return;}...// 注入阶段Injector.inject(model); } 5创建混沌实验 blade create servlet --requestpath/topic delay --time3000 该命令下发后触发 SandboxModule Http(/create) 注解标记的方法将事件分发给 com.alibaba.chaosblade.exec.service.handler.CreateHandler 处理 在判断必要的 uid、target、action、model 参数后调用 handleInjectionhandleInjection 通过状态管理器注册本次实验如果插件类型是 PreCreateInjectionModelHandler 类型将预处理一些东西。同是如果 Action 类型是  DirectlyInjectionAction那么将直接进行故障能力注入且不需要走 Enhancer如 JVM OOM 故障能力等。 public Response handle(Request request) {if (unloaded) {return Response.ofFailure(Code.ILLEGAL_STATE, the agent is uninstalling);}// 检查 suidsuid 是一次实验的上下文IDString suid request.getParam(suid);...return handleInjection(suid, model, modelSpec); }private Response handleInjection(String suid, Model model, ModelSpec modelSpec) {RegisterResult result this.statusManager.registerExp(suid, model);if (result.isSuccess()) {// 判断是否预创建applyPreInjectionModelHandler(suid, modelSpec, model);} } ModelSpec com.alibaba.chaosblade.exec.common.model.handler.PreCreateInjectionModelHandler预创建com.alibaba.chaosblade.exec.common.model.handler.PreDestroyInjectionModelHandler预销毁private void applyPreInjectionModelHandler(String suid, ModelSpec modelSpec, Model model)throws ExperimentException {if (modelSpec instanceof PreCreateInjectionModelHandler) {((PreCreateInjectionModelHandler)modelSpec).preCreate(suid, model);} } ... DirectlyInjectionAction 如果 ModelSpec 是 PreCreateInjectionModelHandler 类型且 ActionSpec 的类型是 DirectlyInjectionAction 类型将直接进行故障能力注入比如 JvmOom 故障能力ActionSpec 的类型不是 DirectlyInjectionAction 类型将加载插件。 private Response handleInjection(String suid, Model model, ModelSpec modelSpec) {// 注册RegisterResult result this.statusManager.registerExp(suid, model);if (result.isSuccess()) {// handle injectiontry {applyPreInjectionModelHandler(suid, modelSpec, model);} catch (ExperimentException ex) {this.statusManager.removeExp(suid);return Response.ofFailure(Response.Code.SERVER_ERROR, ex.getMessage());}return Response.ofSuccess(model.toString());}return Response.ofFailure(Response.Code.DUPLICATE_INJECTION, the experiment exists); } 注册成功后返回 uid如果本阶段直接进行故障能力注入了或者自定义 Enhancer advice 返回 null那么后不通过Inject 类触发故障。 6注入故障能力 故障能力注入的方式最终都是调用 ActionExecutor 执行故障能力。 通过 Injector 注入DirectlyInjectionAction 直接注入直接注入不进过 Inject 类调用阶段如果  JVM OOM 故障能力等。 DirectlyInjectionAction 直接注入不经过Enhancer参数包装匹配直接到故障触发 ActionExecutor 执行阶段如果是Injector 注入此时因为 StatusManager 已经注册了实验当事件再次出发后ManagerFactory.getStatusManager().expExists(targetName) 的判断不会被中断继续往下走到了自定义的 Enhancer 在自定义的 Enhancer 里面可以拿到原方法的参数、类型等甚至可以反射调原类型的其他方法这样做风险较大一般在这里往往是取一些成员变量或者 get 方法等用于 Inject 阶段参数匹配。 7包装匹配参数 自定义的 Enhancer如 ServletEnhancer把一些需要与命令行匹配的参数 包装在 MatcherMode 里面然后包装 EnhancerModel 返回比如  --requestpath /index 那么requestpath 等于 requestURI--querystringnamexx 做自定义匹配。参数包装好后在 Injector.inject(model) 阶段判断。 public EnhancerModel doBeforeAdvice(ClassLoader classLoader, String className, Object object,Method method, Object[] methodArguments)throws Exception {Object request methodArguments[0];String requestURI ReflectUtil.invokeMethod(request, ServletConstant.GET_REQUEST_URI, new Object[]{}, false);String requestMethod ReflectUtil.invokeMethod(request, ServletConstant.GET_METHOD, new Object[]{}, false);MatcherModel matcherModel new MatcherModel();matcherModel.add(ServletConstant.METHOD_KEY, requestMethod);matcherModel.add(ServletConstant.REQUEST_PATH_KEY, requestURI);MapString, Object queryString getQueryString(requestMethod, request);EnhancerModel enhancerModel new EnhancerModel(classLoader, matcherModel);// 自定义参数匹配enhancerModel.addCustomMatcher(ServletConstant.QUERY_STRING_KEY, queryString, ServletParamsMatcher.getInstance());return enhancerModel; } 8判断前置条件 Inject 阶段首先获取 StatusManage 注册的实验compare(model, enhancerModel) 做参数比对比对失败返回limitAndIncrease(statusMetric) 判断 --effect-count --effect-percent 来控制影响的次数和百分比 public static void inject(EnhancerModel enhancerModel) throws InterruptProcessException {String target enhancerModel.getTarget();ListStatusMetric statusMetrics ManagerFactory.getStatusManager().getExpByTarget(target);for (StatusMetric statusMetric : statusMetrics) {Model model statusMetric.getModel();// 匹配命令行输入参数if (!compare(model, enhancerModel)) {continue;}// 累加攻击次数和判断攻击次数是否到达 effect count boolean pass limitAndIncrease(statusMetric);if (!pass) {break;}enhancerModel.merge(model);ModelSpec modelSpec ManagerFactory.getModelSpecManager().getModelSpec(target);ActionSpec actionSpec modelSpec.getActionSpec(model.getActionName());// ActionExecutor执行故障能力actionSpec.getActionExecutor().run(enhancerModel);break;} } 9触发故障能力 由 Inject 触发或者由 DirectlyInjectionAction 直接触发最后调用自定义的 ActionExecutor 生成故障如  DefaultDelayExecutor 此时故障能力已经生效了。 public void run(EnhancerModel enhancerModel) throws Exception {String time enhancerModel.getActionFlag(timeFlagSpec.getName());Integer sleepTimeInMillis Integer.valueOf(time);// 触发延迟TimeUnit.MILLISECONDS.sleep(sleepTimeInMillis); } 3. 销毁实验 blade destroy 52a27bafc252beee 该命令下发后触发 SandboxModule Http(/destory) 注解标记的方法将事件分发给 com.alibaba.chaosblade.exec.service.handler.DestroyHandler 处理注销本次故障的状态此时再次触发 Enchaner 后StatusManger判定实验状态已经销毁不会在进行故障能力注入 // StatusManger 判断实验状态 if (!ManagerFactory.getStatusManager().expExists(targetName)) {return; } 如果插件的 ModelSpec 是 PreDestroyInjectionModelHandler 类型且 ActionSpec 的类型是 DirectlyInjectionAction 类型停止故障能力注入ActionSpec 的类型不是 DirectlyInjectionAction 类型将卸载插件。 // DestroyHandler 注销实验状态 public Response handle(Request request) {String uid request.getParam(suid);...// 判断 uidif (StringUtil.isBlank(uid)) {if (StringUtil.isBlank(target) || StringUtil.isBlank(action)) {return false;}// 注销statusreturn destroy(target, action);}return destroy(uid); } 4. 卸载 Agent blade revoke 98e792c9a9a5dfea 该命令下发后触发 SandboxModule unload() 事件同时插件卸载完全回收 Agent 创建的各种资源。 public void onUnload() throws Throwable {dispatchService.unload();ManagerFactory.unload();watchIds.clear(); } 总结 本文以 Servlet 场景为例详细介绍了 chaosblade-exec-jvm 项目架构设计和实现原理后续将通过模型篇、协议篇、字节码篇、插件篇以及实战篇深入介绍此项目使读者达到可以快速扩展自己所需插件的目的。 ChaosBlade 项目作为一个混沌工程实验工具不仅使用简洁而且还支持丰富的实验场景且扩展场景简单支持的场景领域如下 基础资源比如 CPU、内存、网络、磁盘、进程等实验场景Java 应用比如数据库、缓存、消息、JVM 本身、微服务等还可以指定任意类方法注入各种复杂的实验场景C 应用比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景Docker 容器比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景Kubernetes 平台比如节点上 CPU、内存、网络、磁盘、进程实验场景Pod 网络和 Pod 本身实验场景如杀 PodPod IO 异常容器的实验场景如上述的 Docker 容器实验场景云资源比如阿里云 ECS 宕机等实验场景。 ChaosBlade 社区欢迎各位加入我们一起讨论混沌工程领域实践或者在使用 ChaosBlade 过程中产生的任何想法和问题。 作者简介 叶飞Github tiny-x开源社区爱好者ChaosBlade Committer参与推动 ChaosBlade 混沌工程生态建设。穹谷Github xcasparChaosBlade 项目负责人混沌工程布道师。 原文链接 本文为阿里云原创内容未经允许不得转载。
http://www.sadfv.cn/news/424176/

相关文章:

  • 新洲区城乡建设局网站高端网站推荐
  • 完整网站设计做营销型网站一般要多少钱
  • 自助建站管理平台建筑工地招工网
  • 企业网站备案还是不用备案南阳河南网站建设
  • 浙江网站建设而少儿编程老师
  • 广告公司网站源码下载旅游网站技术方案
  • 纸箱 技术支持 东莞网站建设php大型网站开发
  • 奇艺广州网站建设熊掌号西安市住房和城乡建设官网
  • 网站流量地址评价是什么意思企业营销策划实现的途径
  • 电商网站设计安徽网站推广优化
  • 上海网站建设微信开发成全视频免费观看在线看第6季动漫
  • 推荐个好看的网站广元企业网站建设
  • 麻城建设网站网站建设_免费视频
  • 网站建设 甘肃大学生一个人做网站
  • 做英文网站的标准字体公司产品怎样网上推广
  • 阿里巴巴网站的pc端和手机端怎么做的免费网站建设平台哪个好
  • 淘宝客网站搜索怎么做昆明做企业网站哪家好
  • 德州网站建设设计秦皇岛seo招聘
  • 一个公司可以注册几个网站p2p网站建设 上海
  • wordpress 引用图片不显示手机优化大师官网
  • 订货网站建设成都网站设计公司官网
  • 毕业设计可以做网站不宿迁网站建设价位
  • 如何使用开源程序做网站妖姬直播
  • 辽阳专业建设网站公司什么播放器能看无线新闻台直播
  • 营销网站如何实现差异化宁乡县建设局网站
  • 宝塔做网站可以用什么端口wordpress旅游主题
  • 网站的交互设计包括哪些高清素材网站无水印
  • 莆田网站建设费用9377白蛇传奇
  • 网络推广渠道分类汕头seo网站优化
  • 广告网站怎么做wordpress弹穿登陆