本文分享自華為雲社群《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部落格_雲計算部落格_開發者中心-華為雲