【流式传输】使用Spring Boot实现ChatGpt流式传输

打印 上一主题 下一主题

主题 883|帖子 883|积分 2649

引言

    在ChatGpt火了这么久,他的那种单字单字返回的格式可能让很多朋友感到好奇,在之前我用c#写了一个版本的,同时支持IAsyncEnumerable以及SSE,今天把之前写的Java版本的也发出来,和大家一起学习,有不对的地方,欢迎各位大佬指正。
Code

    我这边用的是JDK21版本,可以看到下面,我们实现了两种方式一种是WebFlux实现响应式返回,另外一种就是SSE的标准写法,有关SSE,大家可以百度去看看他的一些规则,需要设置一些Header,以及返回的数据格式都有特别的讲究。第一种,我们需要在Pom.xml里面引入WebFlux的包,然后才能在代码使用,
  1.    <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-webflux</artifactId>
  4.         </dependency>
  5.         <dependency>
复制代码
  1. @RestController
  2. @RequestMapping("Hello")
  3. public class HelloController {
  4.     @Autowired
  5.     private RestTemplate template;
  6.     public HelloController() {
  7.     }
  8.    private String Appid="408035";
  9.     private String Appsecret="PgZgD80aWLrQUxlhVD452aJl";
  10.     @GetMapping(value = "/GetHello", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  11.     public Flux<String> GetHello() {
  12.         return Flux.interval(Duration.ofSeconds(1))
  13.                 .map(sequence -> "Event " + sequence);
  14.     }
  15.     @PreAuthorize()
  16.     @GetMapping(value = "/GetHellos", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  17.     public void GetHellos(HttpServletResponse response) throws Exception
  18.     {
  19.         if (response.containsHeader("Content-Type"))
  20.         {
  21.             response.setHeader("Content-Type","text/event-stream");
  22.         }
  23.         else
  24.         {
  25.             response.setHeader("Content-Type","text/event-stream");
  26.             response.setHeader("Cache-Control", "no-cache");
  27.             response.setHeader("Connection", "keep-alive");
  28.         }
  29.         String data ="id:"+new Random().nextInt() +" \n" +
  30.             "retry: "+new Random().nextInt(0,100)*30+"\n" +
  31.             "event: message\n" +
  32.             "data: "+new Random().nextInt()+"\n\n";
  33.         response.setCharacterEncoding("UTF-8");
  34.         response.getWriter().write(data);
  35.     }
  36.   
  37. }
复制代码
    下面是我们使用WebFlux实现流式传输的一种方式。

     下面是使用SSE实现流式传输的一种,同时前端代码如下。
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>SSE Example</title>
  5.    
  6. </head>
  7. <body>
  8. </body>
  9. </html>
复制代码
 

 结束

    以上便是今天的所有内容,使用WebFlux以及原始SSE实现流式传输的效果。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表