{"id":705,"date":"2026-06-30T23:34:44","date_gmt":"2026-06-30T22:34:44","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=705"},"modified":"2026-07-07T23:37:59","modified_gmt":"2026-07-07T22:37:59","slug":"dapr-mit-java-sidecar-basierte-infrastruktur-abstraktion-fuer-verteilte-systeme","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=705","title":{"rendered":"Dapr mit Java \u2013 Sidecar-basierte Infrastruktur-Abstraktion f\u00fcr verteilte Systeme"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Microservices sind produktiv, aber ihre Infrastruktur ist komplex: Service Discovery, mTLS, State Management, Pub\/Sub, Retries, Circuit Breaker, verteiltes Tracing \u2014 das alles muss jede Anwendung selbst oder \u00fcber Bibliotheken integrieren. Genau hier setzt&nbsp;<strong>Dapr<\/strong>&nbsp;(Distributed Application Runtime) an: Es verlagert die gesamte Infrastruktur-Logik in einen Sidecar-Prozess, und dein Java-Code kommuniziert nur noch mit&nbsp;<code>localhost<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel zeigt, wie du Dapr 1.18 mit Spring Boot und dem Java SDK 1.17.4 einsetzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist Dapr?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dapr ist eine Open-Source-Laufzeitumgebung (CNCF Incubating), die als Sidecar neben deiner Anwendung l\u00e4uft. Statt Redis-Client, Kafka-Producer und Service-Discovery-Logik in deine App zu packen, sprichst du die Dapr-API auf&nbsp;<code>http:\/\/localhost:3500<\/code>&nbsp;(HTTP) oder&nbsp;<code>localhost:50001<\/code>&nbsp;(gRPC) an.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Architektur:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  order-svc    \u2502           \u2502  payment-svc  \u2502\n\u2502  (Spring)     \u2502           \u2502  (Spring)     \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2518          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         \u2502 gRPC\/HTTP                \u2502\n  \u250c\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2510            \u250c\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2510\n  \u2502  Dapr      \u2502\u25c4\u2500\u2500 mTLS \u2500\u2500\u25ba\u2502  Dapr     \u2502\n  \u2502  Sidecar   \u2502            \u2502  Sidecar   \u2502\n  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518            \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518\n        \u2502                         \u2502\n  \u250c\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2510            \u250c\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2510\n  \u2502  Redis     \u2502            \u2502  Kafka     \u2502\n  \u2502  State     \u2502            \u2502  Pub\/Sub   \u2502\n  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Installation und erster Start<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># macOS<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\nbrew install dapr\/tap\/dapr-cli\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Dapr initialisieren (startet Redis, Zipkin, Placement)<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ndapr init\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Verifizieren<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ndapr --version   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># CLI 1.18, Runtime 1.18<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Eine Spring-Boot-App mit Dapr starten:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dapr<\/span> <span class=\"hljs-selector-tag\">run<\/span> <span class=\"hljs-selector-tag\">--app-id<\/span> <span class=\"hljs-selector-tag\">order-service<\/span> <span class=\"hljs-selector-tag\">--app-port<\/span> 8080 <span class=\"hljs-selector-tag\">--dapr-http-port<\/span> 3500 \\\n  <span class=\"hljs-selector-tag\">--<\/span> <span class=\"hljs-selector-tag\">mvn<\/span> <span class=\"hljs-selector-tag\">spring-boot<\/span><span class=\"hljs-selector-pseudo\">:run<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Java SDK Setup<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencyManagement<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.dapr<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>dapr-sdk-bom<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.18.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">type<\/span>&gt;<\/span>pom<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">type<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>import<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencyManagement<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.dapr<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>dapr-sdk<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.17.4<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.dapr<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>dapr-sdk-springboot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.17.4<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><code>application.properties<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dapr.client.httpEndpoint=http:<span class=\"hljs-comment\">\/\/localhost<\/span>\ndapr.client.httpPort=<span class=\"hljs-number\">3500<\/span>\ndapr.client.grpcEndpoint=localhost\ndapr.client.grpcPort=<span class=\"hljs-number\">50001<\/span>\ndapr.statestore.name=statestore\ndapr.pubsub.name=pubsub\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">State Management: Persistieren ohne Datenbank-Treiber<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dapr abstrahiert State Stores (Redis, PostgreSQL, CosmosDB, etc.) \u2014 dein Code bleibt datenbank-agnostisch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> io.dapr.client.DaprClient;\n<span class=\"hljs-keyword\">import<\/span> io.dapr.client.DaprClientBuilder;\n<span class=\"hljs-keyword\">import<\/span> io.dapr.client.domain.State;\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Client bauen (in Spring Boot per @Autowired verf\u00fcgbar)<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\nDaprClient client = <span class=\"hljs-keyword\">new<\/span> DaprClientBuilder().build();\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Speichern<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\nclient.saveState(<span class=\"hljs-string\">\"statestore\"<\/span>, <span class=\"hljs-string\">\"order-42\"<\/span>, <span class=\"hljs-keyword\">new<\/span> Bestellung(<span class=\"hljs-string\">\"42\"<\/span>, <span class=\"hljs-string\">\"Monitor\"<\/span>, <span class=\"hljs-number\">349.0<\/span>))\n      .block();\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Lesen<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\nState&lt;Bestellung&gt; state = client.getState(<span class=\"hljs-string\">\"statestore\"<\/span>, <span class=\"hljs-string\">\"order-42\"<\/span>, Bestellung.class)\n      .block();\nBestellung b = state.getValue();\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ L\u00f6schen<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\nclient.deleteState(<span class=\"hljs-string\">\"statestore\"<\/span>, <span class=\"hljs-string\">\"order-42\"<\/span>).block();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Der Standard-Komponenten-Name&nbsp;<code>statestore<\/code>&nbsp;wird in&nbsp;<code>~\/.dapr\/components\/statestore.yaml<\/code>&nbsp;definiert und zeigt auf Redis. In Produktion \u00e4nderst du nur diese YAML-Datei:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">apiVersion: dapr.io\/v1alpha1\nkind: Component\nmetadata:\n  name: statestore\nspec:\n  type: state.redis\n  version: v1\n  metadata:\n  - name: redisHost\n    value: redis-prod.meinefirma.com:6379\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Service Invocation: Services aufrufen ohne Service Discovery<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;em&gt;<span class=\"hljs-comment\">\/\/ Service-Aufruf mit HTTP&lt;\/em&gt;<\/span>\nDaprInvokeHttpClient invoker = client.invokeHttpClient(<span class=\"hljs-string\">\"payment-service\"<\/span>);\n\nHttpRequest request = invoker.newRequestBuilder(<span class=\"hljs-string\">\"pay\"<\/span>)\n    .header(<span class=\"hljs-string\">\"Content-Type\"<\/span>, <span class=\"hljs-string\">\"application\/json\"<\/span>)\n    .POST(DaprBodyPublishers.json(<span class=\"hljs-keyword\">new<\/span> Zahlung(<span class=\"hljs-string\">\"order-42\"<\/span>, <span class=\"hljs-number\">349.0<\/span>)))\n    .build();\n\nHttpResponse&lt;<span class=\"hljs-built_in\">String<\/span>&gt; response = invoker.send(request,\n    HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Der Aufruf geht an&nbsp;<code>payment-service<\/code>&nbsp;\u2014 ohne feste Host\/Port-Konfiguration. Dapr \u00fcbernimmt Service Discovery (via mDNS lokal, Kubernetes-DNS im Cluster), mTLS und automatische Retries.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pub\/Sub: Entkoppelte Services via Events<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;em&gt;<span class=\"hljs-comment\">\/\/ Producer: Event publizieren&lt;\/em&gt;<\/span>\nclient.publishEvent(<span class=\"hljs-string\">\"pubsub\"<\/span>, <span class=\"hljs-string\">\"bestellungen\"<\/span>, <span class=\"hljs-keyword\">new<\/span> BestellungAufgegeben(<span class=\"hljs-string\">\"order-42\"<\/span>))\n      .block();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;em&gt;<span class=\"hljs-comment\">\/\/ Consumer: Event empfangen via REST-Endpunkt&lt;\/em&gt;<\/span>\n<span class=\"hljs-keyword\">import<\/span> io.dapr.Topic;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.*;\n\n@RestController\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BestellungSubscriber<\/span> <\/span>{\n\n    @Topic(name = <span class=\"hljs-string\">\"bestellungen\"<\/span>, pubsubName = <span class=\"hljs-string\">\"pubsub\"<\/span>)\n    @PostMapping(<span class=\"hljs-string\">\"\/bestellungen\"<\/span>)\n    public <span class=\"hljs-keyword\">void<\/span> onBestellung(@RequestBody CloudEvent&lt;BestellungAufgegeben&gt; event) {\n        BestellungAufgegeben data = event.getData();\n        System.out.println(<span class=\"hljs-string\">\"Bestellung empfangen: \"<\/span> + data.bestellnummer());\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Dapr liefert Events im CloudEvents-Format \u2014 sprach- und plattformunabh\u00e4ngig. Der Consumer ist ein simpler REST-Endpunkt; Dapr managed Subscriptions, At-Least-Once-Delivery und Retries.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Secrets Management: Keine Secrets im Code<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Map<\/span>&lt;<span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-built_in\">String<\/span>&gt; secrets = client.getSecret(<span class=\"hljs-string\">\"secretstore\"<\/span>, <span class=\"hljs-string\">\"db-password\"<\/span>).block();\n<span class=\"hljs-built_in\">String<\/span> password = secrets.get(<span class=\"hljs-string\">\"db-password\"<\/span>);\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ App-Code enth\u00e4lt keine Credentials \u2014 sie kommen aus dem Sidecar<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Dapr unterst\u00fctzt AWS Secrets Manager, Azure Key Vault, GCP Secret Manager, Kubernetes Secrets und HashiCorp Vault als Backends.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Komplette Beispiel-Anwendung<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@SpringBootApplication\n@RestController\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">OrderService<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        SpringApplication.run(OrderService.class, args);\n    }\n\n    @Autowired private DaprClient daprClient;\n\n    @PostMapping(<span class=\"hljs-string\">\"\/orders\"<\/span>)\n    public ResponseEntity&lt;<span class=\"hljs-built_in\">String<\/span>&gt; createOrder(@RequestBody NewOrderRequest req) {\n        &lt;em&gt;<span class=\"hljs-comment\">\/\/ 1. State speichern&lt;\/em&gt;<\/span>\n        Bestellung order = <span class=\"hljs-keyword\">new<\/span> Bestellung(UUID.randomUUID().toString(),\n            req.product(), req.amount());\n        daprClient.saveState(<span class=\"hljs-string\">\"statestore\"<\/span>, order.id(), order).block();\n\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ 2. Payment-Service aufrufen<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n        DaprInvokeHttpClient paymentClient =\n            daprClient.invokeHttpClient(<span class=\"hljs-string\">\"payment-service\"<\/span>);\n        HttpRequest paymentReq = paymentClient.newRequestBuilder(<span class=\"hljs-string\">\"pay\"<\/span>)\n            .POST(DaprBodyPublishers.json(<span class=\"hljs-keyword\">new<\/span> ZahlungRequest(order.id(), order.amount())))\n            .build();\n        paymentClient.send(paymentReq, HttpResponse.BodyHandlers.ofString());\n\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ 3. Event publizieren<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n        daprClient.publishEvent(<span class=\"hljs-string\">\"pubsub\"<\/span>, <span class=\"hljs-string\">\"order-created\"<\/span>,\n            <span class=\"hljs-keyword\">new<\/span> OrderCreatedEvent(order.id())).block();\n\n        <span class=\"hljs-keyword\">return<\/span> ResponseEntity.ok(<span class=\"hljs-string\">\"Bestellung \"<\/span> + order.id() + <span class=\"hljs-string\">\" angelegt\"<\/span>);\n    }\n}\n\nrecord Bestellung(<span class=\"hljs-built_in\">String<\/span> id, <span class=\"hljs-built_in\">String<\/span> product, double amount) {}\nrecord NewOrderRequest(<span class=\"hljs-built_in\">String<\/span> product, double amount) {}\nrecord ZahlungRequest(<span class=\"hljs-built_in\">String<\/span> orderId, double amount) {}\nrecord OrderCreatedEvent(<span class=\"hljs-built_in\">String<\/span> orderId) {}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Dapr im Kubernetes-Cluster<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Im Kubernetes-Cluster wird der Dapr-Sidecar automatisch per Annotation injiziert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: apps\/v1\n<span class=\"hljs-attr\">kind<\/span>: Deployment\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: order-service\n  <span class=\"hljs-attr\">annotations<\/span>:\n    dapr.io\/enabled: <span class=\"hljs-string\">\"true\"<\/span>\n    dapr.io\/app-id: <span class=\"hljs-string\">\"order-service\"<\/span>\n    dapr.io\/app-port: <span class=\"hljs-string\">\"8080\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Keine Container-Definition n\u00f6tig \u2014 der Dapr-Sidecar-Container wird per Mutating Webhook angef\u00fcgt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testcontainers f\u00fcr lokale Entwicklung<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> io.dapr.testcontainers.DaprContainer;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Container;\n<span class=\"hljs-keyword\">import<\/span> org.testcontainers.junit.jupiter.Testcontainers;\n\n@Testcontainers\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">OrderServiceTest<\/span> <\/span>{\n\n    @Container\n    <span class=\"hljs-keyword\">static<\/span> DaprContainer dapr = <span class=\"hljs-keyword\">new<\/span> DaprContainer(<span class=\"hljs-string\">\"daprio\/daprd:1.18.0\"<\/span>)\n        .withAppName(<span class=\"hljs-string\">\"order-service\"<\/span>)\n        .withAppPort(<span class=\"hljs-number\">8080<\/span>);\n\n    @Test\n    <span class=\"hljs-keyword\">void<\/span> testWithDapr() {\n        &lt;em&gt;<span class=\"hljs-comment\">\/\/ Dapr-API steht unter dapr.getHttpEndpoint() zur Verf\u00fcgung&lt;\/em&gt;<\/span>\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Wann lohnt sich Dapr?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dapr ist kein Allheilmittel, aber in diesen Szenarien besonders wertvoll:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Multi-Sprache\/Multi-Team<\/strong>\u00a0\u2014 einheitliche Infrastruktur-API f\u00fcr Java, Go, Python, JS<\/li>\n\n\n\n<li><strong>Polyglotte Infrastruktur<\/strong>\u00a0\u2014 Wechsel von Redis zu PostgreSQL \u2192 nur YAML \u00e4ndern<\/li>\n\n\n\n<li><strong>Sicherheitsanforderungen<\/strong>\u00a0\u2014 mTLS, Secrets, kein Credential im App-Code<\/li>\n\n\n\n<li><strong>On-Premise zu Cloud<\/strong>\u00a0\u2014 gleicher Code, andere Komponenten-Konfiguration<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Der Trade-off: Ein zus\u00e4tzlicher Sidecar-Prozess pro Pod, und die Kommunikation l\u00e4uft immer \u00fcber localhost \u2192 Sidecar \u2192 Sidecar \u2192 localhost. F\u00fcr latenzkritische Pfade kann dieser Hop relevant sein.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dapr ist ein Game-Changer f\u00fcr Infrastruktur-lastige Microservice-Landschaften. Es entkoppelt Business-Logik von Infrastruktur-Code und macht deine Services portabel zwischen Cloud-Providern und On-Premise. Das Java SDK 1.17.4 macht die Integration in Spring Boot fast unsichtbar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn dein n\u00e4chstes Projekt mehr als zwei Services und mehr als einen Infrastruktur-Dienst (DB, Queue, Secrets) braucht: Gib Dapr einen Tag Testzeit \u2014 es k\u00f6nnte dir Monate Entwicklungsarbeit sparen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Microservices sind produktiv, aber ihre Infrastruktur ist komplex: Service Discovery, mTLS, State Management, Pub\/Sub, Retries, Circuit Breaker, verteiltes Tracing \u2014 das alles muss jede Anwendung selbst oder \u00fcber Bibliotheken integrieren. Genau hier setzt&nbsp;Dapr&nbsp;(Distributed Application Runtime) an: Es verlagert die gesamte Infrastruktur-Logik in einen Sidecar-Prozess, und dein Java-Code kommuniziert nur noch mit&nbsp;localhost. Dieser Artikel zeigt, wie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5],"tags":[],"class_list":["post-705","post","type-post","status-publish","format-standard","hentry","category-plain_java","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=705"}],"version-history":[{"count":2,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/705\/revisions"}],"predecessor-version":[{"id":707,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/705\/revisions\/707"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}