深圳网站的做网站公司移动网站开发服务

web/2025/10/5 1:31:42/文章来源:
深圳网站的做网站公司,移动网站开发服务,超变传奇网站,互联网营销 网站 推荐java web源代码与其他系统进行交互时#xff0c;大多数Java Web应用程序都使用标准Java接口。 诸如Web页面或REST服务器之类的基于HTTP的服务是使用接口javax.servlet.Servlet来实现的。 使用JDBC接口java.sql.Statement和java.sql.Connection实现数据库交互。 这些标准几乎是… java web源代码 与其他系统进行交互时大多数Java Web应用程序都使用标准Java接口。 诸如Web页面或REST服务器之类的基于HTTP的服务是使用接口javax.servlet.Servlet来实现的。 使用JDBC接口java.sql.Statement和java.sql.Connection实现数据库交互。 这些标准几乎是通用的与基础框架Spring或Java EE和Servlet容器TomcatWildfly等无关。 本文介绍如何实现Java代理该Java代理使用Bytecode操作来挂接到这些接口并收集有关HTTP和数据库调用的频率和持续时间的度量。 演示代码可在https://github.com/fstab/promagent上找到 该代码是为Prometheus监视系统检测Java Web应用程序的代理。 但是本文不是Prometheus特有的它着重于Java代理字节码操作和类加载器等基础技术。 1. Java代理 Java代理是可以附加到JVM以便操作Java字节码的Java程序。 例如Java代理可用于修改接口javax.servlet.Servlet所有实现以获取有关HTTP调用的数量和持续时间的统计信息。 Java代理作为JAR文件提供。 常规Java程序使用main()方法作为应用程序的入口点而Java代理具有premain()方法该方法将在应用程序的main()方法之前调用 Java代理概述 public class MyAgent {public static void premain(String agentArgs, Instrumentation inst) throws Exception {// ...} } 虽然可执行的JAR文件有一个MANIFEST.MF文件中指定Main-Class 代理JAR文件有一个MANIFEST.MF文件中指定的Premain-Class 。 可以使用命令行选项-javaagent:在应用程序启动期间附加代理 Java代理命令行 java -javaagent:myagent.jar -jar myapp.jar 然后 premain()方法可以调用inst.addTransformer()来注册ClassFileTransformer 。 类文件转换器实现了每当加载Java类时都会调用的transform()方法。 它可以检查和修改任何Java类的字节码以添加其他功能。 2.字节码操作 有几个可用的库可帮助Java开发人员实现字节码操作。 最低级别的是ASM 。 其他库例如cglib和javassist提供更高级别的API。 最新最易于使用的库是Byte Buddy 。 它提供了易于阅读的流畅Java API用于创建ClassFileTransformer并将其注册到Instrumentation 字节伙伴代理示例 package io.promagent;import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.agent.builder.AgentBuilder.Transformer; import net.bytebuddy.matcher.ElementMatchers;import java.lang.instrument.Instrumentation;import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; import static net.bytebuddy.matcher.ElementMatchers.named;public class MyAgent {public static void premain(String agentArgs, Instrumentation inst) throws Exception {new AgentBuilder.Default().type(hasSuperType(named(javax.servlet.Servlet))).transform(new Transformer.ForAdvice().include(MyAgent.class.getClassLoader()).advice(ElementMatchers.named(service), io.promagent.MyAdvice)).installOn(inst);} 上面的示例显示了检测所有javax.servlet.Servlet实现的service()方法所需的完整代码。 每当Servlet处理Web请求时都会调用service()方法。 MyAdvice类定义将注入到Servlet的service()方法中的代码。 这段代码使用Advice.OnMethodEnter和Advice.OnMethodExit 字节好友建议示例 public class MyAdvice {Advice.OnMethodEnterpublic static void before(ServletRequest request, ServletResponse response) {System.out.println(before serving the request...);}Advice.OnMethodExitpublic static void after(ServletRequest request, ServletResponse response) {System.out.println(after serving the request...);} } Byte Buddy提供了两种检测方法建议如上所示和拦截器。 区别是微妙的有了建议 Advice.OnMethodEnter和Advice.OnMethodExit方法的字节码被复制到被拦截方法的开始和最终块中。 效果与将代码复制并粘贴到要拦截的service()实现中相同。 结果在完成检测之后不再使用类MyAdvice 。 截获的service()方法不需要访问MyAdvice类可以在MyAdvice类不可用的类加载器上下文中执行。 另一方面拦截器是常规方法调用它们在被拦截方法的开始和最终块中执行。 这意味着被拦截的方法必须在拦截器可用的上下文中执行。 在以下各节中我们将看到可能会限制应用程序服务器环境中类的可见性这就是Promagent使用Advices而非Interceptor的原因。 3.添加依赖项 为了使上面的示例有用我们需要用代码维护指标并将指标提供给监视系统来替换System.out.println()消息。 例如 Promagent使用Prometheus客户端库来维护和公开Prometheus指标。 JVM自动将使用-javaagent:命令行参数指定的JAR文件添加到应用程序的系统类加载器。 因此从理论上讲应该可以创建一个包含代理及其所有依赖项的Uber JAR 并在-javaagent:命令行参数中使用它。 但是在应用程序服务器环境中使所有依赖项在系统类加载器上可用都是有问题的原因有两个 某些代理的依赖项可能与应用程序服务器内部使用的库或WAR文件中作为已部署应用程序的一部分提供的库发生冲突。 为了防止冲突应用程序服务器限制了从系统类加载器对类的访问。 例如除非使用jboss.modules.system.pkgs系统属性显式公开了受影响的程序包否则Wildfly模块无法从系统类加载器访问类。 跟踪所有依赖关系并相应地配置模块系统并非易事。 更好的方法是只公开几个Java类而无需外部依赖系统类加载器并使用自定义类加载器加载实际的度量实现。 这样可以最大程度地减少潜在的冲突以及运行代理所需的配置。 4.从自定义类加载器加载钩子 在Java中实现自定义类加载器很容易因为我们可以简单地使用java.net.URLClassLoader并使用指向我们的类所在的JAR文件的路径对其进行初始化。 为了使代理易于使用 Promagent随包含其他JAR文件的JAR文件一起提供。 内部JAR文件在启动时被复制到临时目录并且使用临时路径配置了自定义类加载器。 这样用户将获得一个单一的代理JAR而该代理在内部区分系统类加载器上的类这些类直接包含在代理JAR中和定制类加载器上的类这些类是从JAR中加载的临时目录。 实际的工具在称为hook的类中实现。 挂钩是从自定义类加载器加载的。 这样只要自定义类加载器能够提供这些依赖关系钩子就可以引用其所需的任何依赖关系。 例如 ServletHook如下所示 自定义钩子类示例 public class ServletHook {public void before(ServletRequest request, ServletResponse response) {// ...}public void after(ServletRequest request, ServletResponse response) {// ...} } 该钩子看起来与Byte Buddy建议类似。 区别在于Byte Buddy建议仅是几行代码这些代码具有最小的依赖性以便从自定义类加载器加载相应的钩子并通过反射将其委派给钩子的before()和after()方法。 字节好友建议对检测库没有任何依赖关系因为实际的检测库仅在自定义类加载器中可见。 但是在加载钩子时有一个细微的陷阱参数ServletRequest和ServletResponse将从已检测的Servlet传递。 这意味着挂钩中的ServletRequest和ServletResponse类必须使用与拦截的Servlet相同的类加载器进行加载否则我们无法将Servlet的参数传递到挂钩的before()和after()方法中。 解决方案是使用Thread.currentThread().getContextClassLoader()作为自定义类加载器的父级。 这样可以从上下文类加载器加载的所有类都将从上下文类加载器加载。 这包括ServletRequest和ServletResponse 。 只有当前上下文中不可用的类例如钩子本身及其依赖项才会从自定义JAR文件中加载。 这意味着我们每个上下文需要一个自定义类加载器因为每个自定义类加载器都委托给另一个上下文类加载器作为其父代。 5.实施全球指标注册 使用到目前为止描述的实现可以检测单个Web应用程序。 但是如果应用程序服务器上有多个部署则每个工具将具有自己的类加载器。 从不同的类加载器加载指标库时部署无法共享在该指标库中定义的全局静态变量。 例如不可能跨多个部署使用Prometheus客户端库随附的全局度量标准注册表。 缺少全局注册表每个部署都需要独立维护和公开其指标。 解决此问题的一种方法是扩展自定义类加载器并使其委托将共享度量库加载到另一个共享的自定义类加载器。 但是JVM还附带有一个内置的全局注册表我们可以将其用作VM范围的指标存储JMX平台MBean服务器。 将度量标准注册为MBean具有以下好处 全局注册表JMX平台MBean服务器提供了VM范围的注册表使我们能够维护一组全局指标以对应用程序服务器上的所有部署进行检测。 监视系统的单个导出器易于实现一个小型Web应用程序该应用程序从MBean服务器读取所有度量并将其提供给监视系统。 例如 Promagent包含用于将指标导出到Prometheus服务器的WAR部署。 JMX工具由于所有指标都可以作为MBean使用因此可以使用任何JMX客户端来了解指标的状态。 JMX平台MBean服务器是Java SE的一部分可以通过静态方法ManagementFactory.getPlatformMBeanServer()进行访问。 在MBean服务器上注册的Java对象称为MBean。 MBean必须在一个接口中定义其公共可访问的API按照惯例该接口的名称类似于Java类并附加了后缀MBean 。 例如要将Counter类注册为MBean该类必须实现一个名为CounterMBean的接口。 每个MBean均可通过唯一的ObjectName寻址。 可以使用MBeanServer.invoke()来调用MBean接口中定义的方法。 6.总结 本文概述了如何在不修改Java Web应用程序源代码的情况下对其进行检测。 它基于Promagent 该工具使用Prometheus指标对Java应用程序进行检测。 但是本文重点介绍了诸如Java代理 字节好友字节码操作库之类的基础技术在诸如Wildfly之类的应用服务器环境中的类加载以及JMX平台MBean服务器。 最好从Promagent示例代码中总结出一些松散的结局例如如何避免HTTP请求经过多个Servlet链时重复计数。 有关更多示例值得研究相关项目例如inspectIT或stagemonitor 。 翻译自: https://www.javacodegeeks.com/2017/07/instrumenting-java-web-applications-without-modifying-source-code.htmljava web源代码

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

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

相关文章

江门移动网站建设多少钱网站虚拟主机建设

Spring的了解与特性 简单介绍:快速开发Spring项目的脚手架。简化Spring应用的初始搭建以及开发过程。 特性 提供了很多内置的Starter结合自动配置,对主流框架的无配置集成、开箱即用。即不需要自己去引入很多依赖。 并且管理了常用的第三方依赖的版本&…

找加工订单的网站足球哪个网站做的比较好

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/52996965 在本系列教程当中,我们将学习如何从零开始进行Android SDK开发。我们已经熟悉了Android应用程序的结构与基本组成元素,…

中山做网站的公司哪家好建设系统网站全名

一 系统简介 智能充电(新能源电动车,电单车)云管理系统 是一套能够实现对充电站/桩的实时通讯、状态监控、故障检测、运营分析、数据统计、策略设置的智能化多任务管理系统。 二 平台概览 智能充电云管理系统 https://chongdianzhuang.itg…

做网站都是需要什么备案 个人网站建设方案书

SPI概述Serial Peripheral interface 通用串行外围设备接口是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高…

icp备案单位网站我也要投放广告

首先在Ubuntu安装宝塔面板 在官网可以找到脚本一键安装 安装GitLab社区版 然后在宝塔面板的“软件商店”里面找到GitLab最新社区版 12.8.1一键安装 安装过程中可能出现以下问题: 1.卡在ruby_block[wait for logrotate service socket] action run 解决办法&…

vps 做网站网站建设便宜不可信

苹果iOS的一大优点就是软件生态,第三方APP都会主动适配新的iOS系统以及手机。虽然说Android的开放性是也是一大优点,但是第三方软件参差不齐的优化适配水平也让安卓的用户非常头疼。不过谷歌每年都在致力于让Android的软件生态更好。根据XDA的报道&#…

公司注册地址可以是家庭地址吗seo网站建站

容器编排工具的比较与选择 Kubernetes 介绍 Kubernetes,是目前最流行和功能强大的容器编排平台之一。强调 Kubernetes 的自动化、高可用、扩展性和灵活的特点。讨论 Kubernetes 的主要组件和架构,如 Master 节点、Node 节点、控制器和调度器等。分析 Ku…

网站的流程建设部设计院网站

很多公司老板都会把利润放在第一位,照理说这是没错的,公司要盈利才能继续经营下去。我国有很多针对小微企业的政策,盈利不高的情况下,基本不会去考虑纳税问题,也没有多少税收压力。但是对一些暴利的服务型行业、软件设…

c2c网站功能模块设计自动优化网站建设咨询

推荐原因 1.5MHZ的开关频率,可以使用小电感,1.2A满足多数应用,价格感人,只要0.16元 产品概述 LN3435是一款电流模COT架构同步降压开关稳压器。 输入范围为 2.7V-6.0V,可提供 1.2A 的连续输出电流。 内部集成了低内阻…

香奈儿网站建设策划书怎么做网站的域名解析

3. 深入探究文件 IO 1. Linux 系统如何管理文件1.1 静态文件与inode1.2 文件打开时的状态 2. 返回错误处理与errno2.1 strerror 函数2.2 perror 函数 3. 空洞文件4. O_APPEND 和 O_TRUNC5. 多次打开同一个文件6. 复制文件描述符6.1 dup6.2 dup2 7. 文件共享7.1 同一个进程中多次…

昆山建设信息网站地图 添加到网站

在信息技术飞速发展的今天,企业对软件系统的需求不断增加。然而,如何在保证高质量的前提下快速构建系统成为了一个关键问题。本文将深入探讨低代码(Low-Code)开发与传统代码编程的区别,并探讨如何利用这两种方法快速高…

建设网站前端洛阳网电脑版

Failed to load sql modules into the database cluster 原因 在windows10上安装PostgreSQL时报错:Failed to load sql modules into the database cluster 这是因为在安装时,安装包无法自动创建postgres用户 解决方法 将安装失败的软件删除,并将文件夹也一并删除主动创…

举报企业网站用个人信息备案公司网站功能

转http://www.iteye.com/problems/69457Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程(暂定为Thread-3)发起Socket连接。我们项目中使用mina作为socket通信框架,用过mina的同志们应该熟悉&#xff0c…

零基础学网站建设网络服务商分为哪几类

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十一天【通讯录的实现】_高高的胖子的博客-CSDN博客 1 . 为什么存在动态内存分配 学到现在认识的内存开辟方式有两种: 创建变量: int val …

公司网站建设系统淘宝网站的内容建设

1源码共读大家好,我是若川。众所周知。从8月份开始,我组织了源码共读活动,至今已经有5个月了,每周一期,进行到了第18期。每周坚持写源码解读文章,每天坚持答疑解惑,帮助了很多人学会看源码&…

免费网站统计做兼职网站有哪些

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

网站开发人员岗位职责宁夏建设投资集团公司网站

24 双非硕的秋招总结 结果: 运气捡漏去了腾讯 想想自己整个研究生学习过程,还是挺坎坷的,记录一下,也给未来的同学提供一些参考。 研一 我是研一上开始学前端的,应该是21年10月份左右,我们实验室是专门…

公司网址网站最好的优化是什么

在Windows 11上,Android的Windows子系统(WSA)是一个集成,允许你在笔记本电脑或台式机上与Windows应用程序一起运行Android应用程序,在本指南中,我将向你展示入门步骤。官方规定,你只能从亚马逊应用商店安装应用程序,但也可以使用安卓调试桥(ADB)工具侧载安卓应用程序…

网站没有问题但是一直做不上首页松岗网站建设公司

我永远忘记了OSIF插件和功能的 MANIFEST.MF和feature.xml中的依赖项声明的规则是什么。 谷歌搜索经常导致沮丧而不是答案。 所以,因为今天我实际上找到了这些规则的简要列表,所以我想在这里重新发布它们,并进行一些小的修改以帮助阐明。 OSGi…

网站建设课程设计实训心得网站欢迎页模板

AssetBundles 简介 什么是AssetBundles? AssetBundles是Unity中一种用于打包和存储资源(如模型、纹理、声音等)的文件格式。它允许你将游戏或应用程序中的资源以可独立加载的方式打包,使其在运行时动态加载而不是静态内置在应用中。这种动态加载的方式让你能够优化资源使…