Java Chassis 3技術解密,流式響應如何簡化AI應用開發

华为云开发者联盟發表於2024-07-01

本文分享自華為雲社群《Java Chassis 3技術解密:流式響應和人工智慧應用開發》,作者:liubao68。

隨著生成式人工智慧技術的發展,應用程式開發者對於流式響應(Streaming Responses)的訴求越來越多。伺服器事件推送(Server Push Events)技術能夠在使用HTTP協議的前提下,提供流式響應能力。然而,在微服務架構下使用流式響應並不是那麼方便,現有的各個微服務開發框架都需要使用不同於響應應答的普通REST介面額外能力,採用新的技術或者API來滿足流式響應的開發訴求,增加了技術成本。

Java Chassis 3基於伺服器事件推送和響應式流(reactive streams)標準,提供了非常簡潔的流式響應開發能力,簡化人工智慧應用開發體驗。

使用流式響應

首先,看看微服務架構下一個簡單的呼叫場景。

  前端(瀏覽器) -> 應用閘道器(edge service) -> 消費者微服務 -> 提供者微服務
  • 提供者微服務:定義流式響應服務和生成流式響應

定義流式響應服務非常簡單,只需要將響應型別宣告為 Publisher。 業務邏輯可以使用 RxJava 或者 Reactor 等框架生成流式響應。 在下面的例子中,使用 RxJava3 的API來實現流式響應。

@RestSchema(schemaId = "ReactiveStreamController")
@RequestMapping(path = "/")
public class ReactiveStreamController {
  @GetMapping("/sseString")
  public Publisher<String> sseString() {
    return Flowable.fromArray("a", "b", "c");
  }

  @GetMapping("/sseModel")
  public Publisher<Model> sseModel() {
    return Flowable.intervalRange(0, 5, 0, 1, TimeUnit.SECONDS)
        .map(item -> new Model("jack", item.intValue()));
  }
}
  • 消費者微服務: 消費流式響應,並對外提供新的流式響應服務

消費者可以像呼叫普通REST介面一樣呼叫流式響應服務,開發起來非常簡單。

@RestSchema(schemaId = "ReactiveStreamController")
@RequestMapping(path = "/")
public class ConsumerReactiveStreamController {
  interface ProviderReactiveStreamController {
    Publisher<String> sseString();

    Publisher<Model> sseModel();
  }

  @RpcReference(microserviceName = "provider", schemaId = "ReactiveStreamController")
  ProviderReactiveStreamController controller;

  @GetMapping("/sseString")
  public Publisher<String> sseString() {
    return controller.sseString();
  }

  @GetMapping("/sseModel")
  public Publisher<Model> sseModel() {
    return controller.sseModel();
  }
}
  • 應用閘道器:透明轉發

應用閘道器無需做額外配置,能夠實現流式響應的透明轉發。

  • 前端(瀏覽器):消費訊息

大部分瀏覽器都支援透過 EventSource 消費流式響應。下面是簡單的程式碼片段:

<script>
    var sse = new EventSource("http://localhost:9090/sseModel");

    sse.onmessage = function (ev) {
        var elementById = document.getElementById("ssediv");
        elementById.innerHTML = elementById.innerHTML + "\n" + ev.data;
    }

    sse.onerror = function (){
        sse.close()
    }

    sse.onopen = function (){
    }
</script>

相關的技術實現

Spring Boot採用SseEmitter來定義伺服器事件推送,如果需要使用流式響應,則必須使用WebFlux,在微服務場景下,則需要使用WebClient來消費。這些使用方式與WebMvc整合和註冊發現整合都會帶來非常大的開發麻煩。 Java Chassis 3給開發者提供了非常棒的統一一致的開發體驗。

小藝 人工智慧應用中,需要大量使用流式響應,包括微服務之間。為了實現這些功能,需要額外開發大量程式碼,並且與現有的REST框架沒有實現統一一致的服務治理規範,給應用的可維護性和質量帶來了隱患。 透過新的流式響應API能夠極大的簡化小藝場景的開發。

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章