RSocket – бул TCP, WebSocket жана башка байт агымдарын өткөрүү механизмдери аркылуу мультиплексирленген дуплекс байланыш үчүн колдонулган колдонмо протоколу болуп саналат, ал төмөнкү аракет моделдеринин бирин колдонот:
-
Request-Response
– бир билдирүү жиберүү жана ага жооп алуу. -
Request-Stream
– бир билдирүү жиберүү жана ага жооп катары билдирүүлөрдүн агымын алуу. -
Channel
– билдирүүлөрдүн агымдарын эки багытта да өткөрүү. -
Fire-and-Forget
– бир тараптуу билдирүү жиберүү.
Биринчи байланыш орнотулгандан кийин "клиент" менен "сервердин" ортосундагы айырмачылык жоголот, анткени эки тарап тең симметриялуу болуп калышат жана ар бир тарап жогоруда келтирилген аракеттерди баштай алат. Ушул себептен протоколдо катышуучу тараптар "реквестер (суроо берүүчү)" жана "респондер (жооп берүүчү)" деп аталат, ал эми жогорудагы аракеттер "суроо агымдары" же жөн эле "суроолор" деп аталат.
RSocket протоколунун негизги өзгөчөлүктөрү жана артыкчылыктары төмөнкүдөй:
-
Тармак чектериндеги Reactive Streams семантикасы –
Request-Stream
жанаChannel
сыяктуу агымдагы суроолор үчүн, реакция сигналдары реквестер менен респондердин ортосунда өтүп, реквестерге респондерди булагында жайлатууга мүмкүндүк берет, бул тармак деңгээлинде жүктү башкарууга болгон көз карандылыкты азайтат, ошондой эле тармак деңгээлинде же башка деңгээлде буферлөөгө болгон муктаждыкты азайтат. -
Чектөө (суроо берүү дросселин айлантуу) – бул функция
LEASE
фрейминен келип чыккан аталышы боюнча "Leasing (чектелген пайдалануу)" деп аталат, ал эки тараптын биринен белгилүү бир убакыт ичинде экинчи тарапка уруксат берилген бардык суроолордун санын чектөө үчүн жөнөтүлүшү мүмкүн. Чектелген пайдалануу мөөнөттөрү мезгил-мезгили менен узартылат. -
Сессияны кайра жандандыруу – байланыштын үзүлүшү учурларына арналган жана белгилүү бир абалды сактоону талап кылат. Колдонмолор үчүн абалга көз салуу тунук уюштурулган жана реакция менен жакшы иштейт, бул мүмкүн болгондо камсыздоочуну токтото алат жана зарыл болгон абалдын көлөмүн кыскартат.
-
Чоң билдирүүлөрдү бөлүү жана кайра чогултуу.
-
Keepalive (жүрөк соккулары билдирүүлөрү).
RSocketте бир нече тилде ишке ашырылуусу бар. Java китепканасы Project Reactor үстүндө курулган, ал эми өткөрүү үчүн Reactor Netty колдонулат. Бул сиздин колдонмоңуздагы Reactive Streams публикаторлорунан келген сигналдар RSocket аркылуу тармакка тунук өткөрүлөрүн билдирет.
Протокол
RSocketтин бир артыкчылыгы - анын "жолдо" иштөө логикасы так жазылган жана жеңил окула турган спецификациясы, ошондой эле протоколдун кээ бир кеңейтүүлөрү бар. Ошондуктан, тилдин ишке ашырылышына жана жогорку деңгээлдеги API фреймворкторго карабастан, спецификацияны окуу туура болот. Бул бөлүмдө анык бир контекстти түзүү жөнүндө кыскача маалымат берүлгөн.
Кошулуу
Башында, клиент TCP же WebSocket сыяктуу төмөнкү деңгээлдеги агым өткөрүү каражаттары аркылуу серверге кошулуп, серверге байланыш параметрлерин орнотуу үчүн SETUP
фреймин жөнөтөт.
Сервер SETUP
фреймин четке кагышы мүмкүн, бирок, негизинен, ал жөнөтүлгөндөн кийин (клиент үчүн) жана алынган (сервер үчүн), эки тарап тең суроо жөнөтө алышат, эгерде SETUP
уруксаттарды чектөө үчүн чектелген колдонуу семантикасын колдонууга көрсөтмө бербесе, анда эки тарап тең сураныч жасоого уруксат берүү үчүн экинчи тараптан LEASE
фреймин күтүшү керек.
Суроолорду аткаруу
Байланыш орнотулгандан кийин, эки тарап тең REQUEST_RESPONSE
, REQUEST_STREAM
, REQUEST_CHANNEL
же REQUEST_FNF
фреймдеринин бирин колдонуп суроо жасай алышат. Бул фреймдердин ар бири реквестерден респондерге бир билдирүү ташуу менен берилет.
Респондер андан кийин PAYLOAD
фреймдерин жооп билдирүүлөрү менен кайтарышы мүмкүн, ал эми REQUEST_CHANNEL
учурында реквестер дагы PAYLOAD
фреймдерин кошумча суроо билдирүүлөрү менен жөнөтө алат.
Эгерде суроо билдирүүлөр агымын камтыса, мисалы, Request-Stream
жана Channel
, респондер реквестердин суроо сигналдарын аткарууга милдеттүү. Суроо билдирүүлөрдүн саны менен көрсөтүлөт. Баштапкы суроо REQUEST_STREAM
жана REQUEST_CHANNEL
фреймдеринде көрсөтүлөт. Кийинки сурамдар REQUEST_N
фреймдери менен сигнализацияланат.
Ар бир тарап ошондой эле METADATA_PUSH
фрейми аркылуу конкреттүү суроо эмес, кеңири байланыш менен байланышкан метадата билдирүүлөрүн жибере алат.
Билдирүү форматы
RSocket билдирүүлөрү маалыматтарды жана метадаталарды камтыйт. Метадаталар маршрутту, коопсуздук токенин жана башкаларды жөнөтүү үчүн колдонулушу мүмкүн. Маалыматтар жана метадаталар ар кандай форматта болушу мүмкүн. Алардын ар бири үчүн MIME түрлөрү SETUP
фрейминде жарыяланат жана ушул байланыш үчүн бардык суроолорго колдонулат.
Бардык билдирүүлөр метадаталарды камтышы мүмкүн болсо да, адатта суроо боюнча берилген маршрут сыяктуу метадаталар ар бир сурам менен берилет жана, ошону менен биринчи суроо билдирүүдө гана камтылат, тактап айтканда, REQUEST_RESPONSE
, REQUEST_STREAM
, REQUEST_CHANNEL
же REQUEST_FNF
фреймдеринин биринде гана.
Протоколдун кеңейтүүлөрү колдонмолордо колдонуу үчүн жалпы метадата форматтарын аныктайт:
-
Композиттик метадата – бир нече көз карандысыз форматталган метадата жазуулары.
-
Маршруттоо – суроо үчүн маршрут.
Java Ишке Ашырылышы
RSocket үчүн Java ишке ашырылышы Project Reactor үстүндө курулган. TCP жана WebSocket үчүн өткөрүү механизмдери Reactor Netty негизинде курулган. Reactive Streams китепканасы катары, Reactor протоколду ишке ашырууну жеңилдетет. Колдонмолордо Flux
жана Mono
менен декларативдүү операторлорду жана тунук реакция колдоосун колдонуу табигый көрүнүш.
Java үчүн RSocketтеги API махсус жөнөкөйлөштүрүлгөн жана негизги болуп саналат. Протоколдун өзгөчөлүктөрүнө жана колдонмо программалоо моделин (мисалы, башка RPC генератор кодуна салыштырмалуу) жогорку деңгээлдеги көз карандысыз функционалдуулук катары сактоого өзгөчө көңүл бурулат.
Негизги келишим io.rsocket.RSocket төрт суроо аракет түрүн моделдеп, Mono
бир билдирүү убадасын, Flux
билдирүүлөр агымын, ал эми io.rsocket.Payload
билдирүүнүн өзүн байт буферлеринде маалыматтарга жана метадаталарга жетүү менен көрсөтөт. RSocket
келишими симметриялуу колдонулат. Суроо жөнөтүү жагында колдонмо суроолорду аткаруу үчүн RSocket
менен камсыздалган. Жоопторду жөнөтүү жагында, колдонмо суроолорду иштетүү үчүн RSocket
ишке ашырат.
Бул сүрөттөмө толук кандуу киришүү эмес. Көпчүлүк Spring колдонмолорунда анын API түздөн-түз колдонууга туура келбейт. Бирок, RSocket менен Springден тышкаркы көрүү же эксперимент жүргүзүү маанилүү болушу мүмкүн. RSocket үчүн Java репозиторийи протоколдун API жана мүмкүнчүлүктөрүн көрсөтүүчү бир катар колдонмо мисалдарын камтыйт.
Spring колдоо каражаттары
spring-messaging
модулу төмөнкүлөрдү камтыйт:
-
RSocketRequester –
io.rsocket.RSocket
аркылуу суроолорду аткаруу үчүн маалыматтарды жана метадаталарды коддоо/декоддоо менен агымдуу API. -
Аннотацияланган респондерлер – жооп берүү үчүн
@MessageMapping
менен аннотацияланган иштетүүчү ыкмалар.
spring-web
модулу RSocket колдонмолоруна керектүү болушу мүмкүн болгон Jackson CBOR/JSON жана Protobuf сыяктуу Encoder
жана Decoder
ишке ашырууларын камтыйт. Ошондой эле ал маршрутту натыйжалуу салыштыруу үчүн колдонулушу мүмкүн болгон PathPatternParser
камтыйт.
Spring Boot 2.2 TCP же WebSocket аркылуу RSocket серверин түзүүнү колдойт, ошондой эле WebSocket аркылуу RSocket колдонуу мүмкүнчүлүгүн WebFlux серверинде камтыйт. Ошондой эле RSocketRequester.Builder
жана RSocketStrategies
үчүн кардар колдоо жана авто-конфигурация бар. Толугураак маалыматты Spring Boot колдонмо колдонмосундагы RSocket бөлүмүнөн караңыз.
Spring Security 5.2 RSocket колдоосун камсыздайт.
Spring Integration 5.2 RSocket кардарлар жана серверлери менен өз ара аракеттенүү үчүн кирүүчү жана чыгуучу шлюздарды камсыздайт. Толугураак маалыматты Spring Integration Reference Manualда караңыз.
Spring Cloud Gateway RSocket негизделген кошулууларды колдойт.
GO TO FULL VERSION