App Configuration-Server-SDK für Java
Der App Configuration-Service stellt SDKs für die Integraion in Ihre Anwendungen, Microservices und verteilten Umgebungen bereit.
Server-SDK für Java integrieren
Der App Configuration-Service bietet SDKs für die Integration mit Ihrer Java-Anwendung an. Sie können die Werte für Ihr Feature-Flag auswerten, indem Sie das App Configuration-SDK integrieren.
-
Installieren Sie das SDK auf eine der folgenden Arten.
Maven verwenden
<dependency> <groupId>com.ibm.cloud</groupId> <artifactId>appconfiguration-java-sdk</artifactId> <version>0.3.3</version> </dependency>Rufen Sie das Paket über Gradle ab, indem Sie Folgendes hinzufügen:
implementation group: 'com.ibm.cloud', name: 'appconfiguration-java-sdk', version: '0.3.3' -
Schließen Sie in Ihren Java-Microservice oder Ihre Java-Anwendung das SDK ein mit:
import com.ibm.cloud.appconfiguration.sdk.AppConfiguration; -
Initialisieren Sie das SDK, um eine Verbindung zu Ihrer App Configuration-Serviceinstanz herzustellen.
String region = AppConfiguration.REGION_US_SOUTH; String guid = "guid"; String apikey = "apikey"; String collectionId = "airlines-webapp"; String environmentId = "dev"; AppConfiguration appConfigClient = AppConfiguration.getInstance(); appConfigClient.init(region, guid, apikey); appConfigClient.setContext(collectionId, environmentId);Dabei gilt Folgendes:
region: Name der Region, in der die Dienstinstanz App Configuration erstellt wird. Eine Liste der unterstützten Standorte finden Sie hier. Zum Beispiel:us-south,au-sydusw.guid: GUID des Dienstes App Configuration. Rufen Sie dies aus dem Abschnitt für Serviceberechtigungsnachweise des App Configuration-Servicedashboards ab.apiKey: ApiKey des Dienstes App Configuration. Rufen Sie dies aus dem Abschnitt für Serviceberechtigungsnachweise des App Configuration-Servicedashboards ab.collectionId: ID der Sammlung, die in der Dienstinstanz App Configuration unter dem Abschnitt Sammlungen erstellt wurde.environmentId: Die ID der Umgebung, die in der Serviceinstanz für die App-Konfiguration unter dem Abschnitt "Umgebungen" erstellt wurde.
Die init() und setContext() sind die Initialisierungsklassen und dürfen nur einmal mit appConfigClient aufgerufen werden. Der appConfigClient, wenn er
initialisiert ist, kann klassenübergreifend mit AppConfiguration.getInstance() bezogen werden. Weitere Informationen finden Sie unter Abrufen des appConfigClient über andere Klassen.
Private Endpunkte verwenden
Legen Sie das SDK für die Verbindung zum Service App Configuration fest, indem Sie einen privaten Endpunkt verwenden, auf den nur über das private Netz IBM Cloud zugegriffen werden kann.
appConfigClient.usePrivateEndpoint(true);
Dies muss vor dem Aufruf der Funktion init im SDK erfolgen.
Option zur Verwendung eines persistenten Caches für die Konfiguration
Damit Ihre Anwendung und Ihr SDK auch im unwahrscheinlichen Fall eines Ausfalls des App Configuration-Dienstes über den Neustart Ihrer Anwendung hinweg weiterarbeiten können, können Sie das SDK so konfigurieren, dass es mit einem dauerhaften Cache arbeitet. Das SDK verwendet den persistenten Cache zum Speichern der App Configuration-Daten, die bei den Neustarts Ihrer Anwendung verfügbar sind.
// 1. default (without persistent cache)
appConfigClient.setContext(collectionId, environmentId);
// 2. optional (with persistent cache)
ConfigurationOptions configOptions = new ConfigurationOptions();
configOptions.setPersistentCacheDirectory("/var/lib/docker/volumes/");
appConfigClient.setContext(collectionId, environmentId, configOptions);
Dabei gilt:
persistentCacheDirectory: Absoluter Pfad zu einem Verzeichnis, für das der Benutzer Lese- und Schreibrechte besitzt. Das SDK erstellt eine Datei -appconfiguration.json- in dem angegebenen Verzeichnis, die als dauerhafter Cache zum Speichern der App Configuration Dienstinformationen verwendet wird.
Wenn der persistente Cache aktiviert ist, speichert das SDK die letzte bekannte gute Konfiguration im persistenten Cache. Wenn der App Configuration Server nicht erreichbar ist, werden die neuesten Konfigurationen aus dem persistenten Cache in die Anwendung geladen, damit diese weiterarbeiten kann.
Stellen Sie sicher, dass die Cachedatei in keinem Fall verloren geht oder gelöscht wird. Beispiel: Angenommen, ein Kubernetes-Pod wird erneut gestartet und die Cachedatei (appconfiguration.json) wurde auf einem ephemeren Datenträger
des Pods gespeichert. Wenn ein Pod erneut gestartet wird, löscht Kubernetes den ephermal-Datenträger im Pod, sodass die Cachedatei gelöscht wird. Stellen Sie sicher, dass die vom SDK erstellte Cachedatei immer im persistenten Datenträger
gespeichert wird, indem Sie den richtigen absoluten Pfad des persistenten Verzeichnisses angeben.
Offline-Optionen
Das SDK ist auch für die Bereitstellung von Konfigurationen und die Durchführung von Feature-Flag-und Eigenschaftsauswertungen ohne Verbindung zum App Configuration-Service konzipiert.
ConfigurationOptions configOptions = new ConfigurationOptions();
configOptions.setBootstrapFile("saflights/flights.json");
configOptions.setLiveConfigUpdateEnabled(false);
appConfigClient.setContext(collectionId, environmentId, configOptions);
Dabei gilt:
bootstrapFile: Absoluter Pfad der JSON-Datei, die Konfigurationsdetails enthält. Stellen Sie sicher, dass eine korrekte JSON-Datei bereitgestellt wird. Sie können diese Datei mit dem Befehlibmcloud ac exportder Befehlszeilenschnittstelle von IBM Cloud App Configuration generieren.liveConfigUpdateEnabled: Live-Konfigurationsaktualisierung vom Server. Setzen Sie diesen Wert auffalse, wenn die neuen Konfigurationswerte nicht vom Server geholt werden sollen. Standardmäßig ist dieser Wert auftrueeingestellt.
Beispiele für die Verwendung von Feature-und Eigenschaftenbezogenen APIs
Siehe die folgenden Beispiele für die Verwendung der APIs für Features und Eigenschaften.
Einzelnes Feature abrufen
Feature feature = appConfigClient.getFeature("online-check-in");
if (feature != null) {
System.out.println("Feature Name : " + feature.getFeatureName());
System.out.println("Feature Id : " + feature.getFeatureId());
System.out.println("Feature Type : " + feature.getFeatureDataType());
System.out.println("Is feature enabled? : " + feature.isEnabled());
}
Alle Features abrufen
HashMap<String, Feature> features = appConfigClient.getFeatures();
Feature-Auswertung
Sie können die Methode feature.getCurrentValue(entityId, entityAttributes) verwenden, um den Wert des Feature-Flags zu bewerten. Sie müssen eine eindeutige entityId als Parameter für die Feature-Flag-Auswertung
übergeben. Wenn das Feature-Flag im App Configuration-Service mit Segmenten konfiguriert ist, können Sie die Attributwerte als JSON-Objekt festlegen.
String entityId = "john_doe";
JSONObject entityAttributes = new JSONObject();
entityAttributes.put("city", "Bangalore");
entityAttributes.put("country", "India");
String value = (String) feature.getCurrentValue(entityId, entityAttributes);
-
entityId: ID der Entität. Dies ist eine Zeichenfolgekennung, die sich auf die Entität bezieht, für die das Feature ausgewertet wird. Eine Entität kann beispielsweise eine Instanz einer App sein, die auf einem mobilen Gerät ausgeführt wird, einen Mikroservice, der in der Cloud ausgeführt wird, oder eine Komponente der Infrastruktur, die diesen Mikroservice ausführt. Damit eine Entität mit App Configuration interagieren kann, muss sie eine eindeutige Entitäts-ID angeben -
entityAttributes: Ein JSON-Objekt, das aus dem Attributnamen und ihren Werten besteht, die die angegebene Entität definieren. Dies ist ein optionaler Parameter, wenn das Feature-Flag nicht mit einer Zieldefinition konfiguriert ist. Wenn das Ziel konfiguriert ist, sollteentityAttributesfür die Regelauswertung angegeben werden. Ein Attribut ist ein Parameter, der zum Definieren eines Segments verwendet wird. Das SDK verwendet die Attributwerte, um festzustellen, ob die angegebene Entität die Zielregeln erfüllt, und gibt den entsprechenden Feature-Flag-Wert zurück.
Einzeleigenschaft abrufen
Property property = appConfigClient.getProperty("check-in-charges");
if (property != null) {
System.out.println("Property Name : " + property.getPropertyName());
System.out.println("Property Id : " + property.getPropertyId());
System.out.println("Property Type : " + property.getPropertyDataType());
}
Alle Eigenschaften abrufen
HashMap<String, Property> property = appConfigClient.getProperties();
Auswertung der Eigenschaft
Sie können die Methode property.getCurrentValue(entityId, entityAttributes) verwenden, um den Wert der Eigenschaft auszuwerten. Diese Methode gibt basierend auf der Auswertung den Standardeigenschaftswert oder den überschriebenen
Wert zurück.
String entityId = "john_doe";
JSONObject entityAttributes = new JSONObject();
entityAttributes.put("city", "Bangalore");
entityAttributes.put("country", "India");
String value = (String) property.getCurrentValue(entityId, entityAttributes);
-
entityId: ID der Entität. Dies ist eine Zeichenfolgekennung, die sich auf die Entität bezieht, für die die Eigenschaft ausgewertet wird. Eine Entität kann beispielsweise eine Instanz einer App sein, die auf einem mobilen Gerät ausgeführt wird, einen Mikroservice, der in der Cloud ausgeführt wird, oder eine Komponente der Infrastruktur, die diesen Mikroservice ausführt. Damit eine Entität mit App Configuration interagieren kann, muss sie eine eindeutige Entitäts-ID angeben -
entityAttributes: Ein JSON-Objekt, das aus dem Attributnamen und ihren Werten besteht, die die angegebene Entität definieren. Dies ist ein optionaler Parameter, wenn die Eigenschaft nicht mit einer Zieldefinition konfiguriert ist. Wenn das Ziel konfiguriert ist, sollteentityAttributesfür die Regelauswertung angegeben werden. Ein Attribut ist ein Parameter, der zum Definieren eines Segments verwendet wird. Das SDK verwendet die Attributwerte, um zu bestimmen, ob die angegebene Entität die Zielregeln erfüllt, und gibt den entsprechenden Eigenschaftswert zurück.
Abruf der appConfigClient über andere Klassen
Wenn das SDK initialisiert ist, kann die appConfigClient wie gezeigt über andere Klassen bezogen werden:
// **other classes**
import com.ibm.cloud.appconfiguration.sdk.AppConfiguration;
AppConfiguration appConfigClient = AppConfiguration.getInstance();
Feature feature = appConfigClient.getFeature("string-feature");
boolean enabled = feature.isEnabled();
String featureValue = (String) feature.getCurrentValue(entityId, entityAttributes);
Unterstützte Datentypen
Der App Configuration-Service ermöglicht Ihnen, Feature-Flags und Eigenschaften mit den folgenden Datentypen zu konfigurieren: Boolesche, Numerisch, Zeichenfolge. Der Zeichenfolgedatentyp kann das Format einer TEXT-Zeichenfolge, JSON oder YAML haben. Das SDK verarbeitet jedes format wie in Tabelle 1 dargestellt.
| Feature oder Eigenschaftswert | Datentyp | Datenformat | Typ der von GetCurrentValue() zurückgegebenen Daten |
Beispielausgabe |
|---|---|---|---|---|
true |
BOOLEAN | nicht zutreffend | bool |
true |
25 |
NUMERIC | nicht zutreffend | float64 |
25 |
| "ein Zeichenfolgetext" | STRING | TEXT | string |
a string text |
{"firefox": {"name": "Firefox","pref_url": "about:config"}} |
STRING | JSON | map[string]interface{} |
map[browsers:map[firefox:map[name:Firefox pref_url:about:config]]] |
men:- John Smith- Bill Joneswomen:- Mary Smith- Susan Williams |
STRING | YAML | java.lang.String |
`"men:
|
Feature-Flag
Feature feature = appConfigClient.getFeature("json-feature");
if (feature != null) {
feature.getFeatureDataType(); // STRING
feature.getFeatureDataFormat(); // JSON
feature.getCurrentValue(entityId, entityAttributes); // JSONObject or JSONArray is returned
}
// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"
JSONArray tar_val = (JSONArray) feature.get_current_value(entityId, entityAttributes);
String expected_output = (String) ((JSONObject) tar_val.get(0)).get('description');
// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"
JSONObject tar_val = (JSONObject) feature.get_current_value(entityId, entityAttributes);
String expected_output = (String) tar_val.get('role');
Feature feature = appConfigClient.getFeature("yaml-feature");
if (feature != null) {
feature.getFeatureDataType(); // STRING
feature.getFeatureDataFormat(); // YAML
feature.getCurrentValue(entityId, entityAttributes); // Yaml String is returned
}
Eigenschaft
Property property = appConfigClient.getProperty("json-property");
if (property != null) {
property.getPropertyDataType(); // STRING
property.getPropertyDataFormat(); // JSON
property.getCurrentValue(entityId, entityAttributes); // JSONObject or JSONArray is returned
}
// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"
JSONArray tar_val = (JSONArray) property.get_current_value(entityId, entityAttributes);
String expected_output = (String) ((JSONObject) tar_val.get(0)).get('description');
// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"
JSONObject tar_val = (JSONObject) property.get_current_value(entityId, entityAttributes);
String expected_output = (String) tar_val.get('role');
Property property = appConfigClient.getProperty("yaml-property");
if (property != null) {
property.getPropertyDataType(); // STRING
property.getPropertyDataFormat(); // YAML
property.getCurrentValue(entityId, entityAttributes); // Yaml String is returned
}
Listener für Feature-oder Eigenschaftsänderungen festlegen
Das SDK bietet einen Mechanismus, der Sie in Echtzeit benachrichtigt, wenn sich die Konfiguration eines Feature-Flags oder einer Eigenschaft ändert. Sie können Konfigurationsänderungen über die gleiche Adresse appConfigClient abonnieren.
appConfigClient.registerConfigurationUpdateListener(new ConfigurationUpdateListener() {
@Override
public void onConfigurationUpdate() {
System.out.println("Received updated configurations");
// **add your code**
// To find the effect of any configuration changes, you can call the feature or property related methods
// Feature feature = appConfigClient.getFeature("numeric-feature");
// Integer newValue = (Integer) feature.getCurrentValue(entityId, entityAttributes);
}
});
Neueste Daten abrufen
appConfigClient.fetchConfigurations();