1. 程式人生 > >spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一)

spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一)

SpringBootMonitor


spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一)

spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(二)

spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(三)

1.spring-boot-admin簡介


spring-boot-admin為springboot提供一套視覺化監控頁面,spring-boot-admin可以方便監控叢集各節點的使用及訪問情況。單機使用spring-boot-admin,需要同時引入spring-boot-admin-server和spring-boot-admin-client。

2.spring-boot-monitor


瞭解了 spring-boot-admin之後,我們可以仿照spring-boot-admin寫一個簡單的單機監控工具,不需要既用server又用client。
 

3.程式入口


spring-boot-admin通過註解@EnableAdminServer啟用spring-boot-admin的相關功能,@EnableAdminServer是程式唯一入口,它的原始碼是這樣的:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AdminServerImportSelector.class)
public @interface EnableAdminServer {

}

重點是@Import(AdminServerImportSelector.class),使用@Import註解可以引入三種類

   a.使用了@Configuration註解的類

       這個比較簡單,如果明確知道需要引入哪個配置類,直接引入就可以。

   b.ImportSelector的子類

       如果並不確定引入哪個配置類,需要根據@Import註解所標識的類或者另一個註解(通常是註解)裡的定義資訊選擇配置類的話,用這種方式。 

   c.註解@EnableTransactionManagement


參考:http://weiqingfei.iteye.com/blog/2361152


4. ImportSelector


AdminServerImportSelector實現了DeferredImportSelector,DeferredImportSelector繼承ImportSelector,SpringBoot裡的ImportSelector是通過SpringBoot提供的 @EnableAutoConfiguration這個註解裡完成的。這個@EnableAutoConfiguration註解可以顯式地呼叫,否則它會在 @SpringBootApplication註解中隱式地被呼叫。 AdminServerImportSelector實現了selectImports方法,引入了NotifierConfiguration、 HazelcastStoreConfiguration、AdminServerCoreConfiguration、AdminServerWebConfiguration、 DiscoveryClientConfiguration、 RevereseZuulProxyConfiguration。這些類都有@Configuration註解。 而監控頁面的配置,主要是 AdminServerCoreConfiguration和AdminServerWebConfiguration這兩個類完成配置的。
至此,我們可以仿照實現自己的註解:
註解:
package com.cff.boot.monitor.config;


import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import org.springframework.context.annotation.Import;


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MonitorConfigImportSelector.class)
public @interface EnableMonitorServer {
	
}
ImportSelector:
package com.cff.boot.monitor.config;

import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MonitorConfigImportSelector implements DeferredImportSelector {

	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		return new String[] { MonitorConfiguration.class.getCanonicalName(),
				MonitorWebConfiguration.class.getCanonicalName()};
	}

}


專案git地址: https://gitee.com/xiaoyaofeiyang/SpringBootMonitor