本文揭秘了Java Chassis 3流式響應的使用場景和技術背景,它基於伺服器事件推送和響應式流(reactive streams)標準,提供了非常簡潔的流式響應開發能力,簡化人工智慧應用開發體驗。 ...
本文分享自華為雲社區《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能夠極大的簡化小藝
場景的開發。