iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaAgent如何实现http接口发布
  • 867
分享到

JavaAgent如何实现http接口发布

2023-07-05 08:07:38 867人浏览 薄情痞子
摘要

这篇文章主要介绍“JavaAgent如何实现Http接口发布”,在日常操作中,相信很多人在JavaAgent如何实现http接口发布问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaAgent如何实现ht

这篇文章主要介绍“JavaAgent如何实现Http接口发布”,在日常操作中,相信很多人在JavaAgent如何实现http接口发布问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaAgent如何实现http接口发布”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    需求

    公司运维系统想要监控服务是否正常启动,这些服务是k8s部署的,运维人员的要求业务服务提供一个http接口用于监控服务健康监测,要求所有的接口请求的URL,参数等都是相同的,这么做的目的是不需要通过规范来约束开发人员去开一个服务健康监测的接口。

    使用服务接口来检测服务我觉得相比较监控进程启动,端口监听等方式更准确一些。所以,为了满足运维同学的要求,起初想到的方案是提供一个jar,专门集成到项目中用于发布监控接口,但是想了一下,这么做需要涉及到服务的改造,我理想的方式是对应用无侵入的方式实现。

    初步方案

    说到对应用无入侵,首先想到的就是javaagent技术,此前使用该技术实现了无入侵增强程序日志工具,所以对使用javaagent已经没有问题,此时需要考虑的是如何发布接口了。

    基础技术 JavaAgent

    支持的技术 SpringBootdubboX发布的rest服务

    公司服务大致分为两类,一个是使用springboot发布的Spring mvc rest接口,另一种是基于DubboX发布的rest接口,因为公司在向服务网格转,所以按要求是去dubbo化的,没办法还是有其他小组由于一些其他原因没有或者说短期内不想进行服务改造的项目,这些项目比较老,不是springboot的,是使用spring+DubboX发布的rest服务。所以这个agent要至少能支持这两种技术。

    支持SpringBoot

    想要支持SpringBoot很简单,因为SpringBoot支持自动装配,所以,我要写一个spring.factories来进行自动装配。

    支持DubboX

    业务系统是传统spring+DubboX实现的,并不支持自动装配,这是个问题点,还有个问题点就是如何也发布一个DubboX的rest接口,这两个问题实际上就需要对SpringBean生命周期和Dubbo接口发布的流程有一定的了解了,这个一会儿再说。

    技术实现

    pom文件依赖

        <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>            <version>2.3.6.RELEASE</version>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-autoconfigure</artifactId>            <version>2.3.6.RELEASE</version>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-configuration-processor</artifactId>            <version>2.3.6.RELEASE</version>            <optional>true</optional>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastJSON</artifactId>            <version>1.2.70</version>        </dependency>        <dependency>            <groupId>org.apache.ZooKeeper</groupId>            <artifactId>zookeeper</artifactId>            <version>3.4.6</version>            <exclusions>                <exclusion>                    <groupId>log4j</groupId>                    <artifactId>log4j</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>com.101tec</groupId>            <artifactId>zkclient</artifactId>            <version>0.7</version>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>dubbo</artifactId>            <version>2.8.4</version>            <exclusions>                <exclusion>                    <groupId>org.springframework</groupId>                    <artifactId>spring</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>javax.ws.rs</groupId>            <artifactId>javax.ws.rs-api</artifactId>            <version>2.0.1</version>        </dependency>    </dependencies>

    实现一个JavaAgent

    实现一个JavaAgent很容易,以下三步就可以了,这里不细说了。

    定义JavaAgent入口

    public class PreAgent {    public static void premain(String args, Instrumentation inst) {        System.out.println("输入参数:" + args);        // 通过参数控制,发布的接口是DubboX还是springMVC        Args.EXPORT_DUBBOX = args;    }}

    Maven打包配置

            <plugins>            <plugin>                <artifactId>maven-deploy-plugin</artifactId>                <configuration>                    <skip>true</skip>                </configuration>            </plugin>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-shade-plugin</artifactId>                <version>1.4</version>                <executions>                    <execution>                        <phase>package</phase>                        <Goals>                            <goal>shade</goal>                        </goals>                        <configuration>                            <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>                            <promoteTransitiveDependencies>false</promoteTransitiveDependencies>                            <createDependencyReducedPom>true</createDependencyReducedPom>                            <minimizeJar>false</minimizeJar>                            <createSourcesJar>true</createSourcesJar>                            <transfORMers>                                <transformer                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">                                    <manifestEntries>                                        <Premain-Class>com.ruubypay.agent.PreAgent</Premain-Class>                                    </manifestEntries>                                </transformer>                            </transformers>                        </configuration>                    </execution>                </executions>            </plugin>        </plugins>

    MANIFEST.MF编写

    注:该文件在resource/META-INF/目录下

    Manifest-Version: 1.0
    Can-Redefine-Classes: true
    Can-Retransform-Classes: true
    Premain-Class: com.ruubypay.agent.PreAgent

    支持SpringBoot发布的Http接口

    编写Controller

    接口很简单就发布一个get接口,响应pong即可。

    @RestControllerpublic class PingServiceController {    @GetMapping(value = "/agentServer/ping")    public String ping() {        return "pong";    }}

    创建spring.factories

    通过这个配置文件可以实现SpringBoot自动装配,这里不细说SpringBoot自动装配的原理了,该文件的配置内容就是要自动装配的Bean的全路径,代码如下:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.ruubypay.config.WebConfiguration

    WebConfiguration配置类

    这个配置配置类很简单,@Configuration声明这是个配置类,@ComponentScan扫描包。

    @Configuration@ComponentScan(value = "com.ruubypay")public class WebConfiguration {}

    支持DubboX发布的rest接口

    定义API

    使用的是DubboX发布rest接口需要javax.ws.rs包的注解,@Produces({ContentType.APPLICATION_jsON_UTF_8})声明序列化方式,@Pathrest接口的路径,@GET声明为get接口。

    @Produces({ContentType.APPLICATION_JSON_UTF_8})@Path("/agentServer")public interface IPingService {        @GET    @Path("/ping")    String ping();}

    编写API实现类

    @Component("IPingService")public class IPingServiceImpl implements IPingService {    @Override    public String ping() {        return "pong";    }}

    实现发布Dubbo接口

    如何实现发布接口是实现的难点;首先程序并不支持自动装配了,我们就要考虑如何获取到Spring上下文,如果能够注册BeanSpring容器中,如何触发发布Dubbo接口等问题。

    Spring上下文获取及注册Bean到Spring容器中

    触发Bean注册,获取Spring上下文我们通过Spring的Aware接口可以实现,我这里使用的是ApplicationContextAware;注册BeanSpring容器中可以使用BeanDefinition先创建Bean然后使用DefaultListableBeanFactoryreGISterBeanDefinitionBeanDefinition注册到Spring上下文中。

    @Componentpublic class AgentAware implements ApplicationContextAware {    private static final String DUBBOX = "1";    private ApplicationContext applicationContext;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;        // 如果不是DubboX,不用发布接口        if (DUBBOX.equals(Args.EXPORT_DUBBOX)) {            // 注册配置Bean WebConfiguration            webConfiguration();            // 发布DubboX接口            exportDubboxService();        }    }    public void webConfiguration() {        System.out.println("创建WebConfiguration的bean");        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;        DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory();        // 创建WebConfiguration的bean        BeanDefinition webConfigurationBeanDefinition = new RootBeanDefinition(WebConfiguration.class);        // 注册到集合beanFactory中        System.out.println("注册到集合beanFactory中");        listableBeanFactory.registerBeanDefinition(WebConfiguration.class.getName(), webConfigurationBeanDefinition);    }}

    发布Dubbo接口

    通过ApplicationContextAware我们已经能够获取Spring上下文了,也就是说应用程序的Dubbo注册中心,发布接口协议,Dubbo Application等配置都已经存在Spring容器中了,我们只要拿过来使用即可,拿过来使用没问题,我们接下来就需要考虑,如何发布接口,这需要对Dubbo服务发布的流程有一定的了解,这里我不细说了,感兴趣的可以自己了解下,或者看我以前发布的文章;

    首先Dubbo接口的Provider端的核心Bean是com.alibaba.dubbo.config.spring.ServiceBean,使用Spring配置文件中的标签<dubbo:service标签生成的Bean就是ServiceBean,所以,这里我们只需要创建ServiceBean对象并且初始化对象中的必要数据,然后调用ServiceBean#export()方法就可以发布Dubbo服务了。

    这里需要的对象直接通过依赖查找的方式从Spring容器获取就可以了 ApplicationConfig,ProtocolConfig,RegistryConfig,IPingService

        public void exportDubboxService() {        try {            System.out.println("开始发布dubbo接口");            // 获取ApplicationConfig            ApplicationConfig applicationConfig = applicationContext.getBean(ApplicationConfig.class);            // 获取ProtocolConfig            ProtocolConfig protocolConfig = applicationContext.getBean(ProtocolConfig.class);            // 获取RegistryConfig            RegistryConfig registryConfig = applicationContext.getBean(RegistryConfig.class);            // 获取IPingService接口            IPingService iPingService = applicationContext.getBean(IPingService.class);            // 创建ServiceBean            ServiceBean<IPingService> serviceBean = new ServiceBean<>();            serviceBean.setApplicationContext(applicationContext);            serviceBean.setInterface("com.ruubypay.api.IPingService");            serviceBean.setApplication(applicationConfig);            serviceBean.setProtocol(protocolConfig);            serviceBean.setRegistry(registryConfig);            serviceBean.setRef(iPingService);            serviceBean.setTimeout(12000);            serviceBean.setVersion("1.0.0");            serviceBean.setOwner("rubby");            // 发布dubbo接口            serviceBean.export();            System.out.println("dubbo接口发布完毕");        } catch (Exception e) {            e.printStackTrace();        }    }

    使用方式

    • DubboX: java -javaagent:ruubypay-ping-agent.jar=1 -jar 服务jar包

    • springboot的http接口:java -javaagent:ruubypay-ping-agent.jar -jar 服务jar包

    到此,关于“JavaAgent如何实现http接口发布”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: JavaAgent如何实现http接口发布

    本文链接: https://www.lsjlt.com/news/350531.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • JavaAgent如何实现http接口发布
      这篇文章主要介绍“JavaAgent如何实现http接口发布”,在日常操作中,相信很多人在JavaAgent如何实现http接口发布问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaAgent如何实现ht...
      99+
      2023-07-05
    • JavaAgent实现http接口发布方式浅析
      目录需求初步方案技术实现pom文件依赖实现一个JavaAgent支持SpringBoot发布的Http接口支持DubboX发布的rest接口使用方式总结需求 公司运维系统想要监控服务...
      99+
      2023-03-02
      JavaAgent发布http接口 JavaAgent实现http接口
    • springboot怎么实现接口灰度发布
      这篇文章主要介绍“springboot怎么实现接口灰度发布”,在日常操作中,相信很多人在springboot怎么实现接口灰度发布问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot怎么实现接口灰...
      99+
      2023-06-29
    • springboot 实现接口灰度发布的实例详解
      目录前言最小化改造方式springmvc接口请求原理HandlerMapping简介RequestCondition接口定义代码实现过程1、添加一个自定义注解用于标注接口类以及接口方...
      99+
      2024-04-02
    • 如何使用PHP实现转发接口
      随着互联网的发展,越来越多的网站和应用程序需要使用转发接口来实现不同系统之间的数据传递和交流。在这个过程中,PHP技术无疑是最受欢迎的解决方案之一,因为它提供了强大的功能和灵活性,使开发人员能够轻松地实现复杂的转发接口。一、什么是转发接口?...
      99+
      2023-05-14
      php
    • .Net RabbitMQ实现HTTP API接口调用
      RabbitMQ Management插件还提供了基于RESTful风格的HTTP API接口来方便调用。一共涉及4种HTTP方法:GET、PUT、DELETE和POST。GET方法...
      99+
      2024-04-02
    • PHP接口如何实现分布式日志管理?
      在分布式系统中,日志管理是一项非常重要的任务。日志管理可以帮助我们快速定位系统中的问题,排除故障,提高系统的可靠性。在PHP接口中,如何实现分布式日志管理呢?本文将详细介绍。 一、什么是分布式日志管理? 分布式日志管理是指在分布式系统中,...
      99+
      2023-06-27
      接口 分布式 日志
    • Java中接口如何实现并发操作?
      在Java中,接口是一种常用的抽象数据类型,它定义了一组规范,而不是具体的实现。接口可以被类实现,这样类就可以实现接口定义的规范。在Java中,接口也可以用于实现并发操作。本文将介绍Java中接口如何实现并发操作,以及如何使用演示代码来展...
      99+
      2023-10-18
      接口 并发 数组
    • golang接口如何实现
      今天小编给大家分享一下golang接口如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在golang中,可以使用“ty...
      99+
      2023-07-04
    • 如何使用 Python 接口 api 实现高并发?
      在当今互联网时代,高并发已经成为了一种常见的现象。许多网站或者应用程序需要面对大量的请求,而如何保证系统的稳定性和可靠性,成为了一项重要的任务。本文将介绍如何使用 Python 接口 api 实现高并发,帮助你提高系统的性能和响应速度。 一...
      99+
      2023-07-19
      接口 api 并发
    • ASP编程算法如何实现HTTP接口的安全控制?
      在当今的互联网时代,HTTP接口已经成为了各个应用程序之间交互的主要方式。然而,由于HTTP接口的特性,使得其容易受到各种网络攻击的威胁,例如SQL注入、XSS攻击、CSRF攻击等等。因此,实现HTTP接口的安全控制显得尤为重要。 ASP...
      99+
      2023-11-09
      编程算法 http 接口
    • 如何通过PHP实现HTTP接口索引的高效访问?
      PHP是一种流行的服务器端编程语言,常用于Web应用程序的开发。在Web开发中,HTTP接口索引是一个非常重要的组件。它可以让用户更加方便地查找和访问Web API,提高Web应用的性能和用户体验。本文将介绍如何通过PHP实现HTTP接口索...
      99+
      2023-08-12
      http 接口 索引
    • php如何实现多接口
      本篇内容主要讲解“php如何实现多接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何实现多接口”吧!PHP 接口的基本概念接口(interface)是一个非常重要的概念,它是一个类的蓝...
      99+
      2023-07-05
    • 如何在 PHP 和 Django 中实现高并发接口?
      在当今的互联网时代,高并发接口的实现变得越来越重要。无论是电商平台还是社交应用,高并发接口都是必要的。PHP 和 Django 是两种常用的后端开发语言,它们分别有不同的优势和劣势,但都可以实现高并发接口。本文将介绍如何在 PHP 和 D...
      99+
      2023-06-13
      django 并发 接口
    • Java中,如何使用数组实现并发接口?
      在Java编程中,数组是一种非常常见的数据结构。同时,在多线程编程中,并发接口也是必不可少的。那么,在Java中,如何使用数组实现并发接口呢?本文将从以下几个方面进行介绍: Java中的并发接口 在Java中,有很多种并发接口,例如:...
      99+
      2023-06-24
      数组 接口 并发
    • SpringCloud如何实现灰度发布
      这篇文章主要讲解了“SpringCloud如何实现灰度发布”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud如何实现灰度发布”吧!1.什么是灰度发布?灰度发布又称金丝雀发布...
      99+
      2023-06-30
    • java灰度发布如何实现
      Java灰度发布是指在发布新版本时,只将一部分用户引流到新版本,以验证新版本的稳定性和性能,最终再将全部用户引流到新版本。下面是几种...
      99+
      2023-10-27
      java
    • ASP编程算法中,如何使用HTTP接口实现数据传输?
      ASP(Active Server Pages)是一种基于Microsoft的服务器端脚本技术,它可以用来开发动态网站、Web应用程序和Web服务。在ASP编程中,HTTP接口是一种非常重要的数据传输方式。通过HTTP接口,ASP程序可以...
      99+
      2023-11-09
      编程算法 http 接口
    • api接口对接如何实现,php如何对接api
      这篇文章来分享下api接口对接如何实现,还有源码,希望对新手有所帮助。 什么是API 我的回答:API( 应用程序编程接口):一般来说,这是一套明确定义的各种软件组件之间的通信方法。 什么是API?我们不妨用一个小故事展示出来: 研发人员A...
      99+
      2023-09-01
      php 开发语言
    • php如何实现分页接口
      小编给大家分享一下php如何实现分页接口,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php实现分页接口的方法:1、接收页数值;2、计算总条数;3、计算偏移量;4...
      99+
      2023-06-25
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作