天天看點

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

作者:華為雲開發者聯盟

本文分享自華為雲社群《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能夠極大的簡化小藝場景的開發。

關注#華為雲開發者聯盟# 點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

繼續閱讀