SpringBootAdmin微服務監(jiān)控

創(chuàng)建Server

SpringBootAdmin通過收集actuator暴露出來的服務信息以及通過心跳檢測的機制判斷服務的運行狀況忆蚀。

1.引入依賴

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.2.0</version>
</dependency>

2. 啟動類手動裝配AdminServer

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

3. 配置服務發(fā)現(xiàn)

eureka

eureka:
  instance:
    prefer-ip-address: true
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    fetch-registry: true
    registry-fetch-interval-seconds: 5
    serviceUrl:
      defaultZone: http://10.2.1.5:9001/eureka/,http://10.2.1.6:9001/eureka/

nacos

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.174.137:8848

服務器端配置完畢今缚!

4. 接入SpringSecurity

保證登錄安全瞬项,可以不接

引入依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
指定登錄頁面為SpringBootAdmin
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
 
    private final String adminContextPath;
 
    public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter( "redirectTo" );
 
        http.authorizeRequests()
                .antMatchers( adminContextPath + "/assets/**" ).permitAll()
                .antMatchers( adminContextPath + "/login" ).permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage( adminContextPath + "/login" ).successHandler( successHandler ).and()
                .logout().logoutUrl( adminContextPath + "/logout" ).and()
                .httpBasic().and()
                .csrf().disable();
    }
}
配置登錄密碼
spring:
  security:
    user:
      name: 'admin'
      password: 'admin'

Client接入

1. 引入依賴

該依賴已經(jīng)包含spring-boot-starter-actuator不需要重復引入

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.2.0</version>
</dependency>

2. 配置暴露的端點信息

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS

[注意]
默認會檢查redis的健康狀況,如果你的服務沒有依賴redis何荚,需要額外增加配置囱淋,關掉redis的健康檢查。否則會報異常餐塘。

management:
  health:
    redis:
      enabled: false

依次啟動Server和Client妥衣,瀏覽器登錄{server.ip}:{port}訪問springBootAdmin,此時服務已經(jīng)接入成功


應用詳情可查看應用具體的狀況

Server端使用報警提示功能

接入郵箱報警提示

引入依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置郵箱信息
spring:
  boot:
    admin:
      notify:
        mail:
          to: yuwenbo10@jd.com
          from: 18629015421@163.com
  mail:
    host: smtp.163.com
    password: '******'
    username: 18629015421@163.com

【注意】
此處的郵箱密碼不是我們設定的郵箱密碼,需要登錄到對應的郵箱官網(wǎng)去設置smtp的授權碼戒傻,此處參照百度百科https://jingyan.baidu.com/article/295430f1fc28a60c7e0050f9.html

再次重啟admin Server 如果有服務發(fā)生任何變動會給配置的郵箱發(fā)送郵件
eg:


自定義報警

SpringBootAdmin 發(fā)送郵件的原理是基于事件的監(jiān)聽機制税手,類似于觀察者模式,具體的類
de.codecentric.boot.admin.server.notify.MailNotifier
部分源碼如下:

public class MailNotifier extends AbstractStatusChangeNotifier {
    private final JavaMailSender mailSender;
    private final TemplateEngine templateEngine;
    private String[] to = new String[]{"root@localhost"};
    private String[] cc = new String[0];
    private String from = "Spring Boot Admin <noreply@localhost>";
    private Map<String, Object> additionalProperties = new HashMap();
    @Nullable
    private String baseUrl;
    private String template = "classpath:/META-INF/spring-boot-admin-server/mail/status-changed.html";
 
    public MailNotifier(JavaMailSender mailSender, InstanceRepository repository, TemplateEngine templateEngine) {
        super(repository);
        this.mailSender = mailSender;
        this.templateEngine = templateEngine;
    }
 
    /**
     * 服務發(fā)送變動需纳,會調(diào)用該方法發(fā)送郵件
     */
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> {
            Context ctx = new Context();
            ctx.setVariables(this.additionalProperties);
            ctx.setVariable("baseUrl", this.baseUrl);
            ctx.setVariable("event", event);
            ctx.setVariable("instance", instance);
            ctx.setVariable("lastStatus", this.getLastStatus(event.getInstance()));
 
            try {
                MimeMessage mimeMessage = this.mailSender.createMimeMessage();
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, StandardCharsets.UTF_8.name());
                message.setText(this.getBody(ctx).replaceAll("\\s+\\n", "\n"), true);
                message.setSubject(this.getSubject(ctx));
                message.setTo(this.to);
                message.setCc(this.cc);
                message.setFrom(this.from);
                this.mailSender.send(mimeMessage);
            } catch (MessagingException var6) {
                throw new RuntimeException("Error sending mail notification", var6);
            }
        });
    }
 
 
.....次數(shù)省略若干行
 
 
}

1.自定義郵件模板

可以看出郵件模板的存放路徑是

/META-INF/spring-boot-admin-server/mail/status-changed.html
我們可以在自己項目目錄下創(chuàng)建模板進行替換芦倒。

2. 更改郵件級別

不知道標題寫啥,就寫級別吧候齿,默認情況下服務的上線熙暴,下線,離線慌盯,未知周霉,等等狀態(tài)都會發(fā)郵件,服務的狀態(tài)在類Instance的StatusInfo里面使用6個String類型的常量來進行描述

部分源碼:

public final class StatusInfo implements Serializable {
 
   public static final String STATUS_UNKNOWN = "UNKNOWN";
 
   public static final String STATUS_OUT_OF_SERVICE = "OUT_OF_SERVICE";
 
   public static final String STATUS_UP = "UP";
 
   public static final String STATUS_DOWN = "DOWN";
 
   public static final String STATUS_OFFLINE = "OFFLINE";
 
   public static final String STATUS_RESTRICTED = "RESTRICTED";
 
   .....
}

我們可以繼承抽象類AbstractStatusChangeNotifier并重寫doNotify方法亚皂,定制化郵件發(fā)送俱箱。

3. 做點別的?

有時候我們想既發(fā)送郵件灭必,也發(fā)送短信的形式來保證服務出現(xiàn)問題第一時間感知狞谱,我們可以自己編寫一個類繼承AbstractStatusChangeNotifier實現(xiàn)onNotify方法具體寫自己的短信邏輯就可以了,但是我們會發(fā)現(xiàn)禁漓,這樣操作的話跟衅,每次只會發(fā)送短信,不會發(fā)送默認的郵件了播歼,這是由于mailNotifier使用自動裝配機制(不了解自動裝配的可以查看這篇文章http://www.reibang.com/p/c56c34c1c876
)伶跷,并通過@ConditionOnMissingBean注解控制,如果Spring容器中有AbstractStatusChangeNotifier實例了,就不會注入mailNotifier,具體的解決方案可以是這樣的叭莫,復制他的代碼蹈集,然后去掉@ConditionOnMissingBean注解就可以了。

@Configuration
public class BeanFactory {
 
 
    @AutoConfigureBefore({AdminServerNotifierAutoConfiguration.NotifierTriggerConfiguration.class, AdminServerNotifierAutoConfiguration.CompositeNotifierConfiguration.class})
    @ConditionalOnBean({MailSender.class})
    public static class MailNotifierConfiguration {
        private final ApplicationContext applicationContext;
 
        public MailNotifierConfiguration(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
 
        @Bean
        @ConfigurationProperties("spring.boot.admin.notify.mail")
        public MailNotifier mailNotifier(JavaMailSender mailSender, InstanceRepository repository) {
            return new MailNotifier(mailSender, repository, this.mailNotifierTemplateEngine());
        }
 
        @Bean
        public TemplateEngine mailNotifierTemplateEngine() {
            SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
            resolver.setApplicationContext(this.applicationContext);
            resolver.setTemplateMode(TemplateMode.HTML);
            resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
            SpringTemplateEngine templateEngine = new SpringTemplateEngine();
            templateEngine.addTemplateResolver(resolver);
            return templateEngine;
        }
    }
}

4.分布式監(jiān)控

這里只說一點點雇初,就是我們生產(chǎn)環(huán)境拢肆,一般SpringBootAdmin Server也需要進行集群部署,但是如果服務發(fā)生問題靖诗,相同的郵件會發(fā)送多份郭怪,所以需要使用分布式鎖的機制,如果你的分布式鎖是基于AOP實現(xiàn)刊橘,不能直接放在onNotify方法上移盆,因為這個方法的訪問權限是protected,需要將方法的訪問級別提升為public,可能也不好使,還是使用編碼的形式吧~

參考鏈接:
https://www.cnblogs.com/forezp/p/10242004.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伤为,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子据途,更是在濱河造成了極大的恐慌绞愚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颖医,死亡現(xiàn)場離奇詭異位衩,居然都是意外死亡,警方通過查閱死者的電腦和手機熔萧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門糖驴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佛致,你說我怎么就攤上這事贮缕。” “怎么了俺榆?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵感昼,是天一觀的道長。 經(jīng)常有香客問我罐脊,道長定嗓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任萍桌,我火速辦了婚禮宵溅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘上炎。我一直安慰自己恃逻,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辛块,像睡著了一般畔派。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上润绵,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天线椰,我揣著相機與錄音,去河邊找鬼尘盼。 笑死憨愉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的卿捎。 我是一名探鬼主播配紫,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼午阵!你這毒婦竟也來了躺孝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤底桂,失蹤者是張志新(化名)和其女友劉穎植袍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體籽懦,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡于个,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了暮顺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厅篓。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捶码,靈堂內(nèi)的尸體忽然破棺而出羽氮,到底是詐尸還是另有隱情,我是刑警寧澤惫恼,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布乏苦,位于F島的核電站,受9級特大地震影響尤筐,放射性物質(zhì)發(fā)生泄漏汇荐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一盆繁、第九天 我趴在偏房一處隱蔽的房頂上張望掀淘。 院中可真熱鬧,春花似錦油昂、人聲如沸革娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拦惋。三九已至匆浙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厕妖,已是汗流浹背首尼。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留言秸,地道東北人软能。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像举畸,于是被迫代替她去往敵國和親查排。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容