RSocket

All lectures for KY purposes
Деңгээл , Сабак
жеткиликтүү

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 негизделген кошулууларды колдойт.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION