`

128.Spring Boot 自定义Endpoint【从零开始学Spring Boot】

阅读更多

 

 

【视频&交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

在上一篇博客中已经介绍了Endpoint的一个基本原理,这篇博客中看看如何自定义一个Endpoint,看下本章主要内容:

本章大纲

(1)例子说明
(2)编码分析
(3)谈谈Runtime
(4)引入依赖
(5)编写内存实体类MemInfo
(6)编写EndPoint类
(7)编写EndPoint配置类
(8)编写启动类并且测试
(9)例子延伸

 

       接下来看下具体的内容:

1)例子说明

       这里我们编写一个简单的获取内存的endpoint

2)编码分析

       我们编写endpoint类大体的思路是:

(a)编写一个实体类,用于存储内存信息,比如:占用的总内存,记录内存时间等。
(b)编写一个MyEndpoint实现endpoint,让MyEndpoint具有监控的属性。
(c)配置MyEndpoint。
(d)测试。

 

 

3)谈谈Runtime

       在这个例子中,我们要收集内存信息,那么要用到JDK提供的一个类叫Runtime,在这个类中可以获取到内存的使用情况。

amaxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里获取到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能 从操作系统那里获取到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。

btotalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里获取到时内存大小,也就是java虚拟机这个进程当时所占用的所有内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直 挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖- Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。

cfreeMemory()是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多获取一点的,这些获取而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程序在启动的时候就会无条件的从操作系统中获取-Xms后面定义的内存数,这个时候获取到的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大。

 

4)引入依赖

       我们新建一个项目,取名为:spring-boot-endpoint,在pom.xml文件中引入相关依赖:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

 

  <groupId>com.kfit</groupId>

  <artifactId>spring-boot-endpoint</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>

 

  <name>spring-boot-endpoint</name>

  <url>http://maven.apache.org</url>

 

  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  </properties>

 

     <!--

       spring boot 父节点依赖,

       引入这个之后相关的引入就不需要添加version配置,

       spring boot会自动选择最合适的版本进行添加。

     -->

    <parent>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-parent</artifactId>

       <version>1.3.3.RELEASE</version>

    </parent>

 

  <dependencies>

         <!-- spring boot web支持:mvc,aop... -->

       <dependency>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-starter-web</artifactId>

       </dependency>

   

        <!-- actuatorspring boot提供的对应用系统的自省和监控的集成功能,可以对应用系统进行配置查看、相关功能统计等 -->

        <dependency>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-starter-actuator</artifactId>

       </dependency>

   

  </dependencies>

</project>

 

 

5)编写内存实体类MemInfo

       编写一个实体类用于存储内存的基本信息:

class –-> com.kfit.bean.MenuInfo 

 

package com.kfit.bean;

import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;

public class MemInfo {
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
	private Date recordTime;//记录时间.
	
	private long maxMemory;//能构从操作系统那里挖到的最大的内存,以字节为单位
	private long totalMemory;//进程当时所占用的所有 内存
	public Date getRecordTime() {
		return recordTime;
	}
	public void setRecordTime(Date recordTime) {
		this.recordTime = recordTime;
	}
	public long getMaxMemory() {
		return maxMemory;
	}
	public void setMaxMemory(long maxMemory) {
		this.maxMemory = maxMemory;
	}
	public long getTotalMemory() {
		return totalMemory;
	}
	public void setTotalMemory(long totalMemory) {
		this.totalMemory = totalMemory;
	}
}

 

 

 6)编写EndPoint

       定义一个监控类,主要返回当前的内存信息和对外暴露访问地址。

class à com.kfit.endpoint.MyEndPoint

package com.kfit.endpoint;

import java.util.Date;

import org.springframework.boot.actuate.endpoint.Endpoint;

import com.kfit.bean.MemInfo;

public class MyEndPoint implements Endpoint<MemInfo>{
	
	/**
	 * (1) getId是EndPoint的唯一标识,
	 * (2)MVC接口对外暴露的路径:http://localhost:8080/myendpoint
	 */
	@Override
	public String getId() {
		return "myendpoint";
	}

	@Override
	public boolean isEnabled() {
		return true;
	}

	@Override
	public boolean isSensitive() {
		return false;
	}

	@Override
	public MemInfo invoke() {
		MemInfo memInfo = new MemInfo();
		Runtime runtime = Runtime.getRuntime();
		
		memInfo.setRecordTime(new Date());
		memInfo.setMaxMemory(runtime.maxMemory());
		memInfo.setTotalMemory(runtime.totalMemory());
		return memInfo;
	}

}

         getId()Endpoint唯一的标识,另外也是MVC接口对外暴露的路径,以上代码对外访问路径就是:http://localhost:8080/myendpoint

 

 

7)编写Endpoint配置类

       编写Endpoint配置类EndPointAutoConfig发布MyEndpoint监控。

 

class - com.kfit.endpoint.EndPointAutoConfig

package com.kfit.endpoint;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class EndPointAutoConfig {
	
	 @Bean
     public MyEndPoint myEndPoint() {
         return new MyEndPoint();
     }
}

 

 

8)编写启动类并且测试

 

       启动类没有什么特别之处,正常编码即可:

package com.kfit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

 启动应用程序进行测试,访问:http://localhost:8080/myendpoint ,返回如下信息:

 

{
recordTime: "2017-06-12 03:44:05",
maxMemory: 1817706496,
totalMemory: 198180864
}

  

9)例子延伸

 

       以上只是一个简单实用Endpoint的例子,实际没什么鸟用,在实际中,我们如果要收集内存信息的话,一定是希望想看到内存的一个变化情况,什么时间是20M,什么时候是25M了,最好还能够用折线图展现出来,所以我们可能要用一个List存储每个时间点的内存情况,这个时间点是怎么产生的呢?定时统计,比如我们可以每5秒统计一次。好了,博主就点到为止吧。

 

 

视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

 

 

分享到:
评论

相关推荐

    Spring Boot2.x如何自定义Endpoint

    Spring Boot 2.x 自定义 Endpoint 自定义 Endpoint 是 Spring Boot 2.x 中一个非常有用的功能,它允许开发者根据需要创建自定义的 Endpoint,以满足特定的业务需求。在 Spring Boot 2.x 中,自定义 Endpoint 可以...

    示例代码:spring actuator添加自定义endpoint

    import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.stereotype.Component; @Component public class MyActuator implements Endpoint&lt;String&gt; { @Override public String...

    Spring Boot源码(spring-boot-2.6.2.tar.gz)

    源码中,这些端点的实现位于`org.springframework.boot.actuate.endpoint`包下。 此外,Spring Boot对Spring Data JPA和MyBatis等数据访问技术提供了良好支持。通过`spring-boot-starter-data-jpa`,开发者可以快速...

    spring-boot-reference.pdf

    Spring Boot Documentation 1. About the Documentation 2. Getting Help 3. First Steps 4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. ...

    spring-boot-2.7.0.zip源码

    1. **起步配置**:Spring Boot的核心特性之一就是“零配置”或“少配置”,这得益于`@SpringBootApplication`注解。这个注解包含了`@Configuration`,`@EnableAutoConfiguration`和`@ComponentScan`三个关键元素,它...

    Manning.Spring.in.Action.4th.Edition.2014.11.epub

    16.2. Creating your first REST endpoint 16.2.1. Negotiating resource representation 16.2.2. Working with HTTP message converters 16.3. Serving more than resources 16.3.1. Communicating errors to the ...

    spring boot admin server

    - **自定义监控指标**:可以通过扩展 Spring Boot Actuator 的 HealthIndicator 和 Endpoint 来添加自定义的监控指标。 - **安全保护**:为了保护监控数据的安全,可以集成 Spring Security 或其他安全框架,设置...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    Java_学习如何使用Spring Boot致动器创建RESTful Web服务.zip

    在本文中,我们将深入探讨如何使用Spring Boot Actuator来创建RESTful Web服务。Spring Boot Actuator是Spring Boot框架的一部分,它提供了一套丰富的端点,用于监控和管理应用程序。通过这些端点,开发者可以轻松地...

    使用 Spring Boot Actuator 监控应用.docx

    ### 使用 Spring Boot Actuator 进行应用监控 随着微服务架构的广泛应用,系统变得越来越分散且复杂。在这样的背景下,微服务之间的通信和协作成为常态,这也为问题定位带来了挑战。在这种情况下,如何有效地监控...

    Springboot_endpoint

    import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; @Endpoint(id = "myendpoint") public class MyEndpoint { @ReadOperation public MyInfo info() { // 实现获取自定义信息的逻辑...

    Spring Boot中的单元测试.pdf

    首先,要开始在Spring Boot项目中进行单元测试,你需要引入`spring-boot-starter-test`依赖。这个起步依赖包含了多个测试相关的库,如JUnit、Spring Test、Mockito、AssertJ、Hamcrest、JsonPath和JSONassert。这些...

    Spring Boot面试专题.pdf

    Spring Boot 是一个基于 Spring 框架的高度集成了多种功能的开发工具,旨在简化新 Spring 应用程序的初始搭建以及开发过程。它预设了许多默认配置,使得开发者可以快速地创建一个可运行的应用,而无需编写大量样板...

    Spring Boot 做性能监控的方法.docx

    Spring Boot的性能监控主要借助于其提供的actuator模块,该模块设计目的是为了简化微服务的监控和管理工作。在Spring Boot应用中,引入actuator模块非常简单,只需在`pom.xml`文件中添加对应的依赖: ```xml ...

    word、excel、ppt转pdf,spring boot小demo

    本项目是一个基于Spring Boot框架实现的实用工具,用于将Microsoft Office的三种常见文件格式——Word(.docx)、Excel(.xlsx)和PowerPoint(.pptx)转换为PDF格式。这个小Demo提供了完整的功能,无需任何水印,...

    spring-boot-webservice例子

    在标签中,我们看到"spring boot spring boot spring",这可能意味着项目中涉及了多个Spring Boot组件或者其他Spring框架的集成,例如Spring MVC或Spring Data,它们可以帮助处理HTTP请求、数据库交互等。...

    Spring.Boot.in.Action.2015.12.pdf

    Spring.Boot.in.Action.2015.12.pdfFor online information and ordering of this and other manning books, please visit www.manning.com.thepublisheroffersdiscountsonthisbookwhenorderedinquantity For more ...

    Spring Boot 文档

    Spring Boot提供了命令行界面(CLI),方便开发者快速开始项目。开发者可以通过手动安装,也可以使用SDKMAN!、OSX Homebrew或MacPorts等工具安装CLI。CLI提供了快速启动示例,这可以帮助初学者快速入门。 开发第一...

    SpringBoot2.0-Actuator监控参数说明 - 最全文档.docx

    端点(Endpoint)是Spring Boot Actuator的核心概念之一,它提供了对应用内部状态的访问。在Spring Boot 2.0.2.RELEASE中,Actuator提供了多种端点,包括但不限于`health`、`info`、`metrics`等。这些端点对于构建微...

    spring boot 源码

    Spring Boot是Spring框架的一个扩展,它为开发人员提供了一种快速构建独立的、生产级别的基于Spring的应用程序的方式。它的核心特性包括自动配置、起步依赖、命令行界面、内嵌Web服务器以及可执行JARs。在Spring ...

Global site tag (gtag.js) - Google Analytics