Micronaut 創(chuàng)建 Endpoints

2023-03-14 14:28 更新

除了內(nèi)置端點之外,管理依賴項還提供對創(chuàng)建自定義端點的支持。這些可以像內(nèi)置端點一樣啟用和配置,并可用于檢索和返回任何指標(biāo)或其他應(yīng)用程序數(shù)據(jù)。

端點注解

可以通過使用端點注釋對類進行注釋并為其提供(至少)端點 ID 來創(chuàng)建端點。

FooEndpoint.java

@Endpoint("foo")
class FooEndpoint {
    ...
}

如果向注解提供了單個字符串參數(shù),則將其用作端點 ID。

可以為注釋提供額外的(命名的)參數(shù)。 @Endpoint 的其他可能參數(shù)如下表所述:

表 1. 端點參數(shù)
參數(shù) 描述 端點示例

String id

端點 ID(或名稱)

@Endpoint(id = "foo")

String prefix

用于配置端點的前綴

@Endpoint(prefix = "foo")

boolean defaultEnabled

設(shè)置在未設(shè)置配置時是否啟用端點

@Endpoint(defaultEnabled = false)

boolean defaultSensitive

如果未設(shè)置配置,則設(shè)置端點是否敏感

@Endpoint(defaultSensitive = false)

自定義端點示例

以下示例端點類創(chuàng)建一個可在 /date 訪問的端點:

CurrentDateEndpoint

 Java Groovy  Kotlin 
import io.micronaut.management.endpoint.annotation.Endpoint;

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
public class CurrentDateEndpoint {

//.. endpoint methods

}
import io.micronaut.management.endpoint.annotation.Endpoint

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
class CurrentDateEndpoint {

//.. endpoint methods

}
import io.micronaut.management.endpoint.annotation.Endpoint

@Endpoint(id = "date", prefix = "custom", defaultEnabled = true, defaultSensitive = false)
class CurrentDateEndpoint {

//.. endpoint methods

}

端點方法

端點響應(yīng) GET(“讀取”)、POST(“寫入”)和 DELETE(“刪除”)請求。要從端點返回響應(yīng),請使用以下注釋之一對其公共方法進行注釋:

表 1. 端點方法注解
注解 描述

Read

響應(yīng) GET 請求

Write

響應(yīng) POST 請求

Delete

響應(yīng) DELETE 請求

讀取方法

使用 Read 注釋注釋方法會導(dǎo)致它響應(yīng) GET 請求。

CurrentDateEndpoint

 Java Groovy  Kotlin 
import io.micronaut.management.endpoint.annotation.Endpoint;

import io.micronaut.management.endpoint.annotation.Read;

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
public class CurrentDateEndpoint {

private Date currentDate;

@Read
public Date currentDate() {
    return currentDate;
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Read

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
class CurrentDateEndpoint {

private Date currentDate

@Read
Date currentDate() {
    currentDate
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Read

@Endpoint(id = "date", prefix = "custom", defaultEnabled = true, defaultSensitive = false)
class CurrentDateEndpoint {

private var currentDate: Date? = null

@Read
fun currentDate(): Date? {
    return currentDate
}

}

上述方法響應(yīng)以下請求:

$ curl -X GET localhost:55838/date

1526085903689

Read 注釋接受一個可選的 produces 參數(shù),它設(shè)置從方法返回的媒體類型(默認為 application/json):

CurrentDateEndpoint

 Java Groovy  Kotlin 
import io.micronaut.management.endpoint.annotation.Endpoint;

import io.micronaut.management.endpoint.annotation.Read;

import io.micronaut.http.MediaType;
import io.micronaut.management.endpoint.annotation.Selector;

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
public class CurrentDateEndpoint {

private Date currentDate;

@Read(produces = MediaType.TEXT_PLAIN) //(1)
public String currentDatePrefix(@Selector String prefix) {
    return prefix + ": " + currentDate;
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Read

import io.micronaut.http.MediaType
import io.micronaut.management.endpoint.annotation.Selector

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
class CurrentDateEndpoint {

private Date currentDate

@Read(produces = MediaType.TEXT_PLAIN) //(1)
String currentDatePrefix(@Selector String prefix) {
    "$prefix: $currentDate"
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Read

import io.micronaut.http.MediaType
import io.micronaut.management.endpoint.annotation.Selector

@Endpoint(id = "date", prefix = "custom", defaultEnabled = true, defaultSensitive = false)
class CurrentDateEndpoint {

private var currentDate: Date? = null

@Read(produces = [MediaType.TEXT_PLAIN]) //(1)
fun currentDatePrefix(@Selector prefix: String): String {
    return "$prefix: $currentDate"
}

}
  1. 支持的媒體類型由 MediaType 表示

上述方法響應(yīng)以下請求:

$ curl -X GET localhost:8080/date/the_date_is

the_date_is: Fri May 11 19:24:21 CDT

寫方法

使用 Write 注釋對方法進行注釋會導(dǎo)致它響應(yīng) POST 請求。

CurrentDateEndpoint

 Java Groovy  Kotlin 
import io.micronaut.management.endpoint.annotation.Endpoint;

import io.micronaut.management.endpoint.annotation.Write;

import io.micronaut.http.MediaType;
import io.micronaut.management.endpoint.annotation.Selector;

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
public class CurrentDateEndpoint {

private Date currentDate;

@Write
public String reset() {
    currentDate = new Date();

    return "Current date reset";
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Write

import io.micronaut.http.MediaType
import io.micronaut.management.endpoint.annotation.Selector

@Endpoint(id = "date",
          prefix = "custom",
          defaultEnabled = true,
          defaultSensitive = false)
class CurrentDateEndpoint {

private Date currentDate

@Write
String reset() {
    currentDate = new Date()

    return "Current date reset"
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Write

import io.micronaut.http.MediaType
import io.micronaut.management.endpoint.annotation.Selector

@Endpoint(id = "date", prefix = "custom", defaultEnabled = true, defaultSensitive = false)
class CurrentDateEndpoint {

private var currentDate: Date? = null

@Write
fun reset(): String {
    currentDate = Date()

    return "Current date reset"
}

}

上述方法響應(yīng)以下請求:

$ curl -X POST http://localhost:39357/date

Current date reset

Write 注釋接受一個可選的 consumes 參數(shù),它設(shè)置該方法接受的媒體類型(默認為 application/json):

MessageEndpoint

 Java Groovy  Kotlin 
import io.micronaut.context.annotation.Requires;
import io.micronaut.management.endpoint.annotation.Endpoint;

import io.micronaut.management.endpoint.annotation.Write;

import io.micronaut.http.MediaType;

@Endpoint(id = "message", defaultSensitive = false)
public class MessageEndpoint {

String message;

@Write(consumes = MediaType.APPLICATION_FORM_URLENCODED, produces = MediaType.TEXT_PLAIN)
public String updateMessage(String newMessage) {
    this.message = newMessage;

    return "Message updated";
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Write

import io.micronaut.http.MediaType

@Endpoint(id = "message", defaultSensitive = false)
class MessageEndpoint {

String message

@Write(consumes = MediaType.APPLICATION_FORM_URLENCODED, produces = MediaType.TEXT_PLAIN)
String updateMessage(String newMessage) {  //(1)
    message = newMessage

    return "Message updated"
}

}
import io.micronaut.context.annotation.Requires
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Write

import io.micronaut.http.MediaType

@Endpoint(id = "message", defaultSensitive = false)
class MessageEndpoint {

internal var message: String? = null

@Write(consumes = [MediaType.APPLICATION_FORM_URLENCODED], produces = [MediaType.TEXT_PLAIN])
fun updateMessage(newMessage: String): String {  //(1)
    this.message = newMessage

    return "Message updated"
}

}

上述方法響應(yīng)以下請求:

$ curl -X POST http://localhost:65013/message -H 'Content-Type: application/x-www-form-urlencoded' -d newMessage=A new message'

Message updated

刪除方法

使用 Delete 注釋對方法進行注釋會導(dǎo)致它響應(yīng) DELETE 請求。

MessageEndpoint

 Java Groovy  Kotlin 
import io.micronaut.context.annotation.Requires;
import io.micronaut.management.endpoint.annotation.Endpoint;

import io.micronaut.management.endpoint.annotation.Delete;

@Endpoint(id = "message", defaultSensitive = false)
public class MessageEndpoint {

String message;

@Delete
public String deleteMessage() {
    this.message = null;

    return "Message deleted";
}

}
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Delete

@Endpoint(id = "message", defaultSensitive = false)
class MessageEndpoint {

String message

@Delete
String deleteMessage() {
    message = null

    return "Message deleted"
}

}
import io.micronaut.context.annotation.Requires
import io.micronaut.management.endpoint.annotation.Endpoint

import io.micronaut.management.endpoint.annotation.Delete

@Endpoint(id = "message", defaultSensitive = false)
class MessageEndpoint {

internal var message: String? = null

@Delete
fun deleteMessage(): String {
    this.message = null

    return "Message deleted"
}

}

上述方法響應(yīng)以下請求:

$ curl -X DELETE http://localhost:65013/message

Message deleted

端點敏感度

可以通過端點注釋和配置來控制整個端點的端點敏感性。但是,各個方法可以獨立于端點作為一個整體進行配置。 @Sensitive 注釋可以應(yīng)用于方法以控制它們的敏感性。

AlertsEndpoint

 Java Groovy  Kotlin 
import io.micronaut.http.MediaType;
import io.micronaut.management.endpoint.annotation.Delete;
import io.micronaut.management.endpoint.annotation.Endpoint;
import io.micronaut.management.endpoint.annotation.Read;
import io.micronaut.management.endpoint.annotation.Sensitive;
import io.micronaut.management.endpoint.annotation.Write;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@Endpoint(id = "alerts", defaultSensitive = false) // (1)
public class AlertsEndpoint {

    private final List<String> alerts = new CopyOnWriteArrayList<>();

    @Read
    List<String> getAlerts() {
        return alerts;
    }

    @Delete
    @Sensitive(true)  // (2)
    void clearAlerts() {
        alerts.clear();
    }

    @Write(consumes = MediaType.TEXT_PLAIN)
    @Sensitive(property = "add.sensitive", defaultValue = true) // (3)
    void addAlert(String alert) {
        alerts.add(alert);
    }
}
import io.micronaut.http.MediaType
import io.micronaut.management.endpoint.annotation.Delete
import io.micronaut.management.endpoint.annotation.Endpoint
import io.micronaut.management.endpoint.annotation.Read
import io.micronaut.management.endpoint.annotation.Sensitive
import io.micronaut.management.endpoint.annotation.Write

import java.util.concurrent.CopyOnWriteArrayList

@Endpoint(id = "alerts", defaultSensitive = false) // (1)
class AlertsEndpoint {

    private final List<String> alerts = new CopyOnWriteArrayList<>();

    @Read
    List<String> getAlerts() {
        alerts
    }

    @Delete
    @Sensitive(true) // (2)
    void clearAlerts() {
        alerts.clear()
    }

    @Write(consumes = MediaType.TEXT_PLAIN)
    @Sensitive(property = "add.sensitive", defaultValue = true) // (3)
    void addAlert(String alert) {
        alerts << alert
    }
}
import io.micronaut.http.MediaType
import io.micronaut.management.endpoint.annotation.Delete
import io.micronaut.management.endpoint.annotation.Endpoint
import io.micronaut.management.endpoint.annotation.Read
import io.micronaut.management.endpoint.annotation.Sensitive
import io.micronaut.management.endpoint.annotation.Write
import java.util.concurrent.CopyOnWriteArrayList

@Endpoint(id = "alerts", defaultSensitive = false) // (1)
class AlertsEndpoint {

    private val alerts: MutableList<String> = CopyOnWriteArrayList()

    @Read
    fun getAlerts(): List<String> {
        return alerts
    }

    @Delete
    @Sensitive(true)  // (2)
    fun clearAlerts() {
        alerts.clear()
    }

    @Write(consumes = [MediaType.TEXT_PLAIN])
    @Sensitive(property = "add.sensitive", defaultValue = true)  // (3)
    fun addAlert(alert: String) {
        alerts.add(alert)
    }
}
  1. 端點默認不敏感,使用端點的默認前綴。

  2. 無論任何其他因素如何,此方法始終是敏感的

  3. 屬性值附加到前綴和 id 以查找配置值

如果設(shè)置了配置鍵 endpoints.alerts.add.sensitive,則該值決定了 addAlert 方法的敏感度。

  1. 端點是第一個標(biāo)記,因為它是端點注釋中前綴的默認值,并且未在此示例中明確設(shè)置。

  2. alerts 是下一個標(biāo)記,因為那是端點 ID

  3. add.sensitive 是下一個標(biāo)記,因為它是為 @Sensitive 注釋的屬性成員設(shè)置的值。

如果未設(shè)置配置鍵,則使用 defaultValue(默認為 true)。

端點配置

具有 endpoints 前綴的端點可以通過其默認端點 ID 進行配置。如果存在 ID 為 foo 的端點,則可以通過 endpoints.foo 對其進行配置。此外,可以通過 all 前綴提供默認值。

例如,考慮以下端點。

FooEndpoint.java

@Endpoint("foo")
class FooEndpoint {
    ...
}

默認情況下,端點已啟用。要禁用它,請將 endpoints.foo.enabled 設(shè)置為 false。如果未設(shè)置 endpoints.foo.enabled 且 endpoints.all.enabled 為 false,則端點將被禁用。

端點的配置值覆蓋所有端點的配置值。如果 endpoints.foo.enabled 為 true 而 endpoints.all.enabled 為 false,端點將被啟用。

對于所有端點,可以設(shè)置以下配置值。

 Properties Yaml  Toml  Groovy  Hocon  JSON 
endpoints.<any endpoint id>.enabled=Boolean
endpoints.<any endpoint id>.sensitive=Boolean
endpoints:
  <any endpoint id>:
    enabled: Boolean
    sensitive: Boolean
[endpoints]
  sensitive="Boolean"
endpoints {
  <any endpoint id> {
    enabled = "Boolean"
    sensitive = "Boolean"
  }
}
{
  endpoints {
    <any endpoint id> {
      enabled = "Boolean"
      sensitive = "Boolean"
    }
  }
}
{
  "endpoints": {
    "<any endpoint id>": {
      "enabled": "Boolean",
      "sensitive": "Boolean"
    }
  }
}

默認情況下,所有端點的基本路徑都是 /。如果您希望端點在不同的基本路徑下可用,請配置 endpoints.all.path。例如,如果該值設(shè)置為 /endpoints/,則可以在 /endpoints/foo 相對于上下文路徑訪問 foo 端點。請注意,除非設(shè)置了 micronaut.server.context-path,否則 endpoints.all.path 需要前導(dǎo)和尾隨 /,在這種情況下,前導(dǎo) / 不是必需的。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號