摘要:前言在生產(chǎn)環(huán)境中,我們比較關(guān)心任意時(shí)刻一個(gè)的運(yùn)行情況。調(diào)用接口返回結(jié)果我們猜測(cè)這個(gè)應(yīng)該是表示應(yīng)用程序正在正常運(yùn)行。調(diào)用接口返回結(jié)果似乎什么都沒(méi)發(fā)生,沒(méi)關(guān)系,我們繼續(xù)進(jìn)行。我們繼續(xù)試了上文列舉的若干接口,發(fā)現(xiàn)大部分返回結(jié)果都是未授權(quán)。
前言
在生產(chǎn)環(huán)境中,我們比較關(guān)心任意時(shí)刻一個(gè)JVM的運(yùn)行情況。SpringBoot為我們提供了一個(gè)方便的功能模塊Actuator。只要簡(jiǎn)單幾步就可以為我們的應(yīng)用添加查詢系統(tǒng)各項(xiàng)指標(biāo)的功能。
準(zhǔn)備工作完成SpringBoot 1024行代碼 - Getting Started(一個(gè)簡(jiǎn)單的web應(yīng)用)
代碼羅列org.springframework.boot spring-boot-starter-actuator
我們可以發(fā)現(xiàn),SpringBoot在控制臺(tái)上輸出了如下幾行內(nèi)容
2017-10-28 15:07:41.538 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/health || /health.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(javax.servlet.http.HttpServletRequest,java.security.Principal) 2017-10-28 15:07:41.539 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/info || /info.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.539 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/configprops || /configprops.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.540 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/beans || /beans.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.541 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/trace || /trace.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.542 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/heapdump || /heapdump.json],methods=[GET],produces=[application/octet-stream]}" onto public void org.springframework.boot.actuate.endpoint.mvc.HeapdumpMvcEndpoint.invoke(boolean,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.io.IOException,javax.servlet.ServletException 2017-10-28 15:07:41.544 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/metrics/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String) 2017-10-28 15:07:41.545 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/metrics || /metrics.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.548 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/mappings || /mappings.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.552 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/auditevents || /auditevents.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public org.springframework.http.ResponseEntity> org.springframework.boot.actuate.endpoint.mvc.AuditEventsMvcEndpoint.findByPrincipalAndAfterAndType(java.lang.String,java.util.Date,java.lang.String) 2017-10-28 15:07:41.554 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.555 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String) 2017-10-28 15:07:41.555 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/env || /env.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.558 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/loggers/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.get(java.lang.String) 2017-10-28 15:07:41.559 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/loggers/{name:.*}],methods=[POST],consumes=[application/vnd.spring-boot.actuator.v1+json || application/json],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.set(java.lang.String,java.util.Map) 2017-10-28 15:07:41.559 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/loggers || /loggers.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2017-10-28 15:07:41.560 INFO 37061 --- [main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/dump || /dump.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
這表示"/health","/info","/configprops"等相對(duì)uri被映射到了一些系統(tǒng)自動(dòng)創(chuàng)建的Bean的成員方法上。
幾個(gè)實(shí)驗(yàn)我們懷著好奇的心情調(diào)用了一個(gè)接口。
調(diào)用接口
curl 127.0.0.1:8080/health
返回結(jié)果
{"status":"UP"}
我們猜測(cè)這個(gè)應(yīng)該是表示應(yīng)用程序正在正常運(yùn)行。我們緊接著又調(diào)用了第二個(gè)接口。
調(diào)用接口
curl 127.0.0.1:8080/info
返回結(jié)果
{}
似乎什么都沒(méi)發(fā)生,沒(méi)關(guān)系,我們繼續(xù)進(jìn)行。
調(diào)用接口
curl 127.0.0.1:8080/configprops
返回結(jié)果
{"timestamp":1509176216111,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource.","path":"/configprops"}
英語(yǔ)過(guò)四級(jí)的朋友們已經(jīng)猜到發(fā)生了什么了,我們沒(méi)有被授權(quán)查看這個(gè)資源。我們繼續(xù)試了上文列舉的若干接口,發(fā)現(xiàn)大部分返回結(jié)果都是未授權(quán)。
知識(shí)點(diǎn)講解 如何訪問(wèn)未授權(quán)接口為什么大部分接口都是未授權(quán)?SpringBoot在設(shè)計(jì)中廣泛采用了“約定優(yōu)于配置(convention over configuration)”的設(shè)計(jì)思想。Actuator中提供的大部分功能都被默認(rèn)配置成需要授權(quán)才可以訪問(wèn),主要原因是這些資源大部分都比較敏感,在web應(yīng)用被部署在直接可以被公網(wǎng)訪問(wèn)的環(huán)境而開(kāi)發(fā)者不是特別清楚Actuator的功能的情況下web應(yīng)用的一些重要數(shù)據(jù)就很容易被輕易獲取。為了保護(hù)我們的web應(yīng)用,Actuator的設(shè)計(jì)者將大部分敏感資源設(shè)計(jì)成默認(rèn)需要授權(quán)才可以訪問(wèn)。
接下來(lái)我們來(lái)看看如何訪問(wèn)到這些資源。
通常有兩種方式
1 將資源配置成無(wú)需授權(quán)
2 給用戶授權(quán)
本文只介紹第一種
要將configprops配置成無(wú)需授權(quán),只需在application.properties(要放到運(yùn)行時(shí)的classpath下)文件中添加
endpoints.configprops.sensitive=false
之后再調(diào)用
curl 127.0.0.1:8080/configprops
就可以看到系統(tǒng)的各種配置屬性信息了。
info接口怎么用info如果開(kāi)發(fā)者想讓?xiě)?yīng)用程序提供一寫(xiě)元數(shù)據(jù)查詢功能,就可以使用info接口。
舉例:
在application.properties文件中配置如下信息
info.project.name=SpringBoot-Demo
之后調(diào)用
curl 127.0.0.1:8080/info
結(jié)果變成了
{"project":{"name":"SpringBoot-Demo"}}
我們可以發(fā)現(xiàn),通過(guò)info接口可以直接查詢第一段為info的配置信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/67957.html
摘要:端項(xiàng)目依賴添加是為了使應(yīng)用處于啟動(dòng)狀態(tài),會(huì)自動(dòng)添加相關(guān)依賴。接下來(lái)以作為服務(wù)發(fā)現(xiàn)的示例來(lái)進(jìn)行演示,實(shí)際上也可以使用或者。最后是一個(gè)用方式監(jiān)聽(tīng)的使用連接端 【前情提要】Spring Boot Actuator 提供了對(duì)單個(gè) Spring Boot 應(yīng)用的監(jiān)控,信息包含應(yīng)用狀態(tài)、內(nèi)存、線程、堆棧等,比較全面的監(jiān)控了 Spring Boot 應(yīng)用的整個(gè)生命周期。但是這樣監(jiān)控也有一些問(wèn)題:第一...
摘要:概述之前講過(guò)容器的可視化監(jiān)控,即監(jiān)控容器的運(yùn)行情況,包括使用率內(nèi)存占用網(wǎng)絡(luò)狀況以及磁盤(pán)空間等等一系列信息。實(shí)戰(zhàn)一下中添加依賴啟動(dòng)應(yīng)用程序之后,只要在瀏覽器中輸入端點(diǎn)信息就能獲得應(yīng)用的一些狀態(tài)信息。 showImg(https://segmentfault.com/img/remote/1460000014684947); 概述 之前講過(guò)Docker容器的可視化監(jiān)控,即監(jiān)控容器的運(yùn)行情...
摘要:這里使用的是數(shù)據(jù)庫(kù)啟動(dòng)類上加上注解在啟動(dòng)類中添加對(duì)包掃描掃描多個(gè)包下的可以有以下幾種方法掃描會(huì)自動(dòng)加載相關(guān)配置,數(shù)據(jù)源就會(huì)自動(dòng)注入到中,會(huì)自動(dòng)注入到中,可以直接使用。有配置文件下的使用掃描多個(gè)包下的可以有以下幾種方法掃描 Spring-Boot 學(xué)習(xí)筆記 1 Spring-Boot 介紹 1.1 什么是Spring-Boot Spring-Boot是由Pivotal團(tuán)隊(duì)提供的全新框架...
摘要:除了,還有十余種,有的是特定操作,比如轉(zhuǎn)儲(chǔ)內(nèi)存日志有的是信息展示,比如顯示應(yīng)用健康狀態(tài)。 showImg(http://ww1.sinaimg.cn/large/006tNc79gy1g5qb2coyfoj30u00k0tan.jpg); 前言 隨著線上應(yīng)用逐步采用 SpringBoot 構(gòu)建,SpringBoot應(yīng)用實(shí)例越來(lái)多,當(dāng)線上某個(gè)應(yīng)用需要升級(jí)部署時(shí),常常簡(jiǎn)單粗暴地使用 kil...
摘要:下一代服務(wù)端開(kāi)發(fā)下一代服務(wù)端開(kāi)發(fā)第部門(mén)快速開(kāi)始第章快速開(kāi)始環(huán)境準(zhǔn)備,,快速上手實(shí)現(xiàn)一個(gè)第章企業(yè)級(jí)服務(wù)開(kāi)發(fā)從到語(yǔ)言的缺點(diǎn)發(fā)展歷程的缺點(diǎn)為什么是產(chǎn)生的背景解決了哪些問(wèn)題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級(jí)服務(wù)開(kāi)發(fā)在移動(dòng)開(kāi)發(fā)領(lǐng)域 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開(kāi)發(fā) 》 Kotlin + Spring Boot : 下一代 Java...
閱讀 833·2021-11-22 11:59
閱讀 3251·2021-11-17 09:33
閱讀 2320·2021-09-29 09:34
閱讀 1949·2021-09-22 15:25
閱讀 1967·2019-08-30 15:55
閱讀 1330·2019-08-30 15:55
閱讀 540·2019-08-30 15:53
閱讀 3353·2019-08-29 13:55