Skip to content

Latest commit

 

History

History

ep04 - 20240516

EP04: Spring 백엔드와 Aspire 통합하기

Link: https://aka.ms/aspire-in-the-belly/ep04

#dotnetaspire #blazor #cloudnative #apireinthebelly

.NET Aspire는 과연 .NET 앱만 오케스트레이션 할 수 있을까요?

클라우드 네이티브 애플리케이션 개발을 하다보면 다양한 언어로 애플리케이션을 개발하고 이를 서로 엮어야 하는 경우도 많습니다.

그렇다면, 백엔드를 ASP.NET Core Web API 대신 Java를 사용한 SpringBoot 앱으로 개발한다면 .NET Aspire는 과연 어떤 역할을 할 수 있을까요?

이번 세션을 통해 .NET Aspire의 오케스트레이션 능력을 다른 언어로도 확장할 수 있는 가능성에 대해 알아보시죠.

🔗 링크: https://aka.ms/aspire-in-the-belly 🎙️ 진행: 김진석 (Microsoft MVP), 박구삼 (Microsoft MVP), 유저스틴 (Microsoft)

Source Code 설명

JAVA SpringBoot의 Backend와 Blazor Frontend를 연결하여 오케스트레이션 하는 Aspire 데모입니다.

Demo

Aspire 프로젝트 생성

  • aspire start application 생성

  • https 설정 해제, http로 실행하려면 ASPIRE_ALLOW_UNSECURED_TRANSPORT 설정을 추가

      {
        "$schema": "https://json.schemastore.org/launchsettings.json",
        "profiles": {
          "http": {
            "commandName": "Project",
            "dotnetRunMessages": true,
            "launchBrowser": true,
            "applicationUrl": "http://localhost:15056",
              "environmentVariables": {
                  "ASPNETCORE_ENVIRONMENT": "Development",
                  "DOTNET_ENVIRONMENT": "Development",
                  "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19294",
                  "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20297",
                  "ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"
              }
          }
        }
      }
  • 필요시 로그인 토큰 입력

JAVA Spring Boot 생성

  • springboot extension으로 실행

    • springboot : 3.2.5
    • language : JAVA
    • group id : kr.blazorstudy
    • artifact id : weather
    • package type : jar
    • java version : 17
      • 개인 PC에 설치된 것이 17
    • dependencies : Spring Web
    • 완료되면 새로 오픈
  • Controller 생성 : Blazor web api Project에서와 같이 반환하도록 구현

    • WeatherController 파일 생성

      @RestController
      public class WeatherController {
      
        @GetMapping("/hello")
        public String hello() {
            return "Hello, Aspire Java!";
        }
      
        @GetMapping("/weatherforecast")
        public WeatherForecast[] weatherforecast() {
      
          var random = new Random();
          
          return new WeatherForecast[] {
              new WeatherForecast("2021-10-01", random.nextInt(45), "서울"),
              new WeatherForecast("2021-10-02", random.nextInt(45), "대구"),
              new WeatherForecast("2021-10-03", random.nextInt(45), "부산"),
              new WeatherForecast("2021-10-04", random.nextInt(45), "광주"),
              new WeatherForecast("2021-10-05", random.nextInt(45), "인천")
          };
        }
      }
    • WeatherForecast.java 파일 생성 : 클래스 자료형

      public class WeatherForecast {
        public String date;
        public int TemperatureC;
        public String Summary;
        public int TemperatureF;
      
        public WeatherForecast(String date, int TemperatureC, String Summary) {
          this.date = date;
          this.TemperatureC = TemperatureC;
          this.Summary = Summary;
          this.TemperatureF = 32 + (int)(TemperatureC / 0.5556);
        }
      }
    • gradle build assemble 이후 실행해 보기(동작여부 확인을 위해)

      java -jar ./build/libs/weather-0.0.1-SNAPSHOT.jar

Java Agent 다운로드

JAVA에서 OTEL을 손쉽게 사용하기 위해 해당 Java Agent를 사용합니다. 자세한 사항은 아래 참고 문서를 확인하시기 바랍니다.

Docker 이미지 생성

  • 아래와 같이 Dockerfile 생성

    # 베이스 이미지 설정
    FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu
    
    # 작업 디렉토리 설정
    WORKDIR /app
    
    # 빌드 파일 복사
    COPY ./build/libs/aspire-java-0.0.1-SNAPSHOT.jar /app/app.jar
    COPY ./opentelemetry-javaagent.jar /app
    
    ENV OTEL_BLRP_SCHEDULE_DELAY=OTEL_BLRP_SCHEDULE_DELAY
    ENV OTEL_BSP_SCHEDULE_DELAY=OTEL_BSP_SCHEDULE_DELAY
    ENV OTEL_DOTNET_EXPERIMENTAL_ASPNETCORE_DISABLE_URL_QUERY_REDACTION=OTEL_DOTNET_EXPERIMENTAL_ASPNETCORE_DISABLE_URL_QUERY_REDACTION
    ENV OTEL_DOTNET_EXPERIMENTAL_HTTPCLIENT_DISABLE_URL_QUERY_REDACTION=OTEL_DOTNET_EXPERIMENTAL_HTTPCLIENT_DISABLE_URL_QUERY_REDACTION
    ENV OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES=OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES
    ENV OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES=OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES
    ENV OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY=OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY
    ENV OTEL_EXPORTER_OTLP_ENDPOINT=OTEL_EXPORTER_OTLP_ENDPOINT
    ENV OTEL_EXPORTER_OTLP_HEADERS=OTEL_EXPORTER_OTLP_HEADERS
    ENV OTEL_EXPORTER_OTLP_PROTOCOL=OTEL_EXPORTER_OTLP_PROTOCOL
    ENV OTEL_METRIC_EXPORT_INTERVAL=OTEL_METRIC_EXPORT_INTERVAL
    ENV OTEL_RESOURCE_ATTRIBUTES=OTEL_RESOURCE_ATTRIBUTES
    ENV OTEL_SERVICE_NAME=OTEL_SERVICE_NAME
    ENV OTEL_TRACES_SAMPLER=OTEL_TRACES_SAMPLER
    
    # 포트 노출
    EXPOSE 8080
    
    # 애플리케이션 실행
    ENTRYPOINT ["java","-javaagent:/app/opentelemetry-javaagent.jar", "-jar","/app/app.jar"]
    
  • docker image 만들기

    docker build -t aspire-weather:0.0.1 .
    

Aspire 프로젝트에서 JAVA Backend 추가

  • AppHost Project의 Program.cs 파일
    • java spring 생성 코드 추가
      var javaService = builder.AddContainer("aspire-weather", "aspire-weather", "0.0.1")
                              .WithHttpEndpoint(name: "http", port: 8080, targetPort: 8080)
                              .WithOtlpExporter();
    • blazor frontend 연결 코드 변경
      var frontend = builder.AddProject<Projects.aspire_java_Web>("webfrontend")
                              .WithExternalHttpEndpoints()
                              .WithReference(javaService.GetEndpoint("http"));

Web 프로젝트에서 backend 서비스 설정

  • Web Project의 Program.cs 파일
    • backend 서비스 지정
      builder.Services.AddHttpClient<WeatherApiClient>(client => client.BaseAddress = new("http://aspire-weather"));