宿主(C# Keelson.Net.Server 的 KeelsonServer,N-02):绑地址、挂 Ring 处理器、起、停。只有这个 ns 认识 Jetty —— 路由(routing)、访问守卫(guard)、SSE(sse)、WebSocket(websocket)、请求体上限(http)都是普通的 Ring 处理器 / 中间件, 换一个 Ring 服务端(http-kit …)照样能挂。
宿主是 Jetty 12(ring/ring-jetty-adapter,ee9 servlet + Ring 的 WebSocket 规范),线程池是 Jetty 的 VirtualThreadPool
(每个请求一条虚拟线程)。Jetty 那边适配器没开口的(localhost 第二个连接器、URI 合规、请求行上限)经它的 :configurator 钩子
或一层宿主自己的中间件补,都在这个 ns 里。
(def s (server/start [["GET" "/hello" (fn [req] {:status 200 :body "hi"})]] {:port 0}))
(server/base-address s) ;; => "http://127.0.0.1:54321/"
(server/stop! s)
第一个参数是 Ring 处理器或路由表(im.ttalk.agent.server.routing)。选项:
:host IP 字面量(缺省 "127.0.0.1",只给本机)或 "localhost"(IPv4 + IPv6 回环两个连接器,端口不能是 0)
:port 0 = 内核分配(测试常用),启动后读 port
:unix-socket-path 给了就只在这个 Unix 域套接字上监听(:host / :port 不用)。路径上已有文件:连得上 ⇒ 有人在服务,抛
server/unix-socket-in-use;连不上 ⇒ 上次的残留,删掉再绑。停机时删掉
:shutdown-timeout-ms 优雅停机最多等多久(在飞的请求 —— 包括 SSE 长连接 —— 收尾的时间)。缺省 5000
:ssl-context javax.net.ssl.SSLContext ⇒ 走 HTTPS;base-address 随之是 https://
:key-store / :key-password 代替 :ssl-context:java.security.KeyStore(要带私钥条目,否则 server/certificate-no-private-key)
:max-request-body-size 请求体上限(字节)。Content-Length 超了 ⇒ 413;处理器里 http/read-body 也守这个数
:max-request-headers-total-size 请求头总大小上限(缺省 32 KiB,同 Kestrel;超了 Jetty 回 431)
:max-request-line-size 请求行(方法 + 目标 + 版本)上限;超了回 414(Jetty 没有单独这一格:宿主中间件判)
:ws-max-message-bytes 服务端对一条 WebSocket 消息的总上限(缺省 64 MiB;端点自己的 :max-message-bytes 在它之内再判)
:ws-idle-timeout-ms WebSocket 空闲多久断(缺省 1 小时;端点的保活 ping 会刷新它)
:idle-timeout-ms HTTP 连接空闲多久断(缺省 200000;SSE 长连接靠心跳保活)
:guard 本机访问守卫选项(im.ttalk.agent.server.guard);包在最外层。给了而 :host 不是回环、:token 又为空
⇒ create 抛 server/bind-needs-token(Unix 域套接字不算网络绑定,不查)
:middleware [(fn [handler] handler) …],由内到外包在路由外面(守卫仍在最外层)
:on-stopping [(fn [] …) …],停机开始时调(C# ApplicationStopping.Register)。路由表的元数据
:im.ttalk.agent.server/on-stopping 里的也会登记(im.ttalk.agent.server.agui 的路由靠它在停机时按停在飞的 run)
处理器抛 server/body-too-large ⇒ 413;抛别的 ⇒ 500(正文为空)。
与 C# 的差别:对端断开只在写的时候发现(见 im.ttalk.agent.server.sse);不清空 / 不接管日志(Jetty 走 SLF4J)。
宿主(C# Keelson.Net.Server 的 KeelsonServer,N-02):绑地址、挂 Ring 处理器、起、停。**只有这个 ns 认识 Jetty** ——
路由(routing)、访问守卫(guard)、SSE(sse)、WebSocket(websocket)、请求体上限(http)都是普通的 Ring 处理器 / 中间件,
换一个 Ring 服务端(http-kit …)照样能挂。
宿主是 Jetty 12(`ring/ring-jetty-adapter`,ee9 servlet + Ring 的 WebSocket 规范),线程池是 Jetty 的 VirtualThreadPool
(每个请求一条虚拟线程)。Jetty 那边适配器没开口的(localhost 第二个连接器、URI 合规、请求行上限)经它的 :configurator 钩子
或一层宿主自己的中间件补,都在这个 ns 里。
```clojure
(def s (server/start [["GET" "/hello" (fn [req] {:status 200 :body "hi"})]] {:port 0}))
(server/base-address s) ;; => "http://127.0.0.1:54321/"
(server/stop! s)
```
第一个参数是 Ring 处理器或路由表(im.ttalk.agent.server.routing)。选项:
:host IP 字面量(缺省 "127.0.0.1",只给本机)或 "localhost"(IPv4 + IPv6 回环两个连接器,端口不能是 0)
:port 0 = 内核分配(测试常用),启动后读 `port`
:unix-socket-path 给了就只在这个 Unix 域套接字上监听(:host / :port 不用)。路径上已有文件:连得上 ⇒ 有人在服务,抛
`server/unix-socket-in-use`;连不上 ⇒ 上次的残留,删掉再绑。停机时删掉
:shutdown-timeout-ms 优雅停机最多等多久(在飞的请求 —— 包括 SSE 长连接 —— 收尾的时间)。缺省 5000
:ssl-context javax.net.ssl.SSLContext ⇒ 走 HTTPS;`base-address` 随之是 https://
:key-store / :key-password 代替 :ssl-context:java.security.KeyStore(要带私钥条目,否则 `server/certificate-no-private-key`)
:max-request-body-size 请求体上限(字节)。Content-Length 超了 ⇒ 413;处理器里 `http/read-body` 也守这个数
:max-request-headers-total-size 请求头总大小上限(缺省 32 KiB,同 Kestrel;超了 Jetty 回 431)
:max-request-line-size 请求行(方法 + 目标 + 版本)上限;超了回 414(Jetty 没有单独这一格:宿主中间件判)
:ws-max-message-bytes 服务端对一条 WebSocket 消息的总上限(缺省 64 MiB;端点自己的 :max-message-bytes 在它之内再判)
:ws-idle-timeout-ms WebSocket 空闲多久断(缺省 1 小时;端点的保活 ping 会刷新它)
:idle-timeout-ms HTTP 连接空闲多久断(缺省 200000;SSE 长连接靠心跳保活)
:guard 本机访问守卫选项(im.ttalk.agent.server.guard);包在最外层。给了而 :host 不是回环、:token 又为空
⇒ `create` 抛 `server/bind-needs-token`(Unix 域套接字不算网络绑定,不查)
:middleware [(fn [handler] handler) …],由内到外包在路由外面(守卫仍在最外层)
:on-stopping [(fn [] …) …],停机开始时调(C# ApplicationStopping.Register)。路由表的元数据
`:im.ttalk.agent.server/on-stopping` 里的也会登记(im.ttalk.agent.server.agui 的路由靠它在停机时按停在飞的 run)
处理器抛 `server/body-too-large` ⇒ 413;抛别的 ⇒ 500(正文为空)。
与 C# 的差别:对端断开只在写的时候发现(见 im.ttalk.agent.server.sse);不清空 / 不接管日志(Jetty 走 SLF4J)。(base-address server)基址,如 "http://127.0.0.1:54321/"(Unix 域套接字上是 http://localhost/)。
基址,如 "http://127.0.0.1:54321/"(Unix 域套接字上是 http://localhost/)。
(create handler-or-routes)(create handler-or-routes options)建一台、挂路由,但不启动(地址 / 证书 / 守卫 / 套接字路径在这里就校验)。见 ns 文档。
建一台、挂路由,但不启动(地址 / 证书 / 守卫 / 套接字路径在这里就校验)。见 ns 文档。
(start handler-or-routes)(start handler-or-routes options)建一台、挂路由、启动。
建一台、挂路由、启动。
(start! server)启动(bind 失败原样抛)。回来时端口已经绑好。返回 server。
启动(bind 失败原样抛)。回来时端口已经绑好。返回 server。
(stop! server)优雅停机:先触发停机(钩子、长连接自己收尾),再等在飞的请求(含正在写的流式正文),最多 :shutdown-timeout-ms, 然后停 Jetty(余下的连接、WebSocket 会话随之断开)。幂等。
优雅停机:先触发停机(钩子、长连接自己收尾),再等在飞的请求(含正在写的流式正文),最多 :shutdown-timeout-ms, 然后停 Jetty(余下的连接、WebSocket 会话随之断开)。幂等。
(stopping server)开始停机时完成的 CompletableFuture(请求 map 的 :im.ttalk.agent.server/stopping 也是它)。
开始停机时完成的 CompletableFuture(请求 map 的 :im.ttalk.agent.server/stopping 也是它)。
(unix-socket-path server)在 Unix 域套接字上监听时的路径(否则 nil)。
在 Unix 域套接字上监听时的路径(否则 nil)。
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |