Awọn apoti, microservices ati awọn meshes iṣẹ

Ninu Intanẹẹti opo kan ìwé о apapo iṣẹ (apapo iṣẹ), ati pe eyi ni ọkan miiran. Hooray! Ṣugbọn kilode? Lẹhinna, Mo fẹ lati ṣalaye ero mi pe yoo ti dara julọ ti awọn meshes iṣẹ ba han ni ọdun 10 sẹhin, ṣaaju dide ti awọn iru ẹrọ eiyan bii Docker ati Kubernetes. Emi ko sọ pe oju-iwoye mi dara tabi buru ju awọn miiran lọ, ṣugbọn niwọn igba ti awọn meshes iṣẹ jẹ ẹranko ti o ni eka pupọ, awọn iwoye pupọ yoo ṣe iranlọwọ lati loye wọn daradara.

Emi yoo sọrọ nipa pẹpẹ dotCloud, eyiti a kọ sori awọn iṣẹ microservices ọgọrun ati atilẹyin ẹgbẹẹgbẹrun awọn ohun elo ti a fi sinu apoti. Emi yoo ṣe alaye awọn italaya ti a dojuko ni idagbasoke ati ifilọlẹ, ati bii awọn meshes iṣẹ ṣe le (tabi ko le) ṣe iranlọwọ.

Itan ti dotCloud

Mo ti kọ nipa awọn itan ti dotCloud ati awọn aṣayan faaji fun yi Syeed, sugbon Emi ko ti sọrọ Elo nipa awọn nẹtiwọki Layer. Ti o ko ba fẹ lati besomi sinu kika kẹhin article nipa dotCloud, eyi ni gist ni kukuru: o jẹ ipilẹ-iṣẹ PaaS-bi-iṣẹ kan ti o fun laaye awọn alabara lati ṣiṣẹ ọpọlọpọ awọn ohun elo (Java, PHP, Python…), pẹlu atilẹyin fun titobi data lọpọlọpọ. awọn iṣẹ (MongoDB, MySQL, Redis...) ati ṣiṣiṣẹsẹhin bii Heroku: O gbe koodu rẹ sori pẹpẹ, o kọ awọn aworan apoti ati gbe wọn lọ.

Emi yoo sọ fun ọ bi a ti ṣe itọsọna ijabọ si pẹpẹ dotCloud. Kii ṣe nitori pe o tutu pupọ (botilẹjẹpe eto naa ṣiṣẹ daradara fun akoko rẹ!), Ṣugbọn ni akọkọ nitori pẹlu awọn irinṣẹ ode oni iru apẹrẹ le ni irọrun ni imuse ni akoko kukuru nipasẹ ẹgbẹ ti o niwọnwọn ti wọn ba nilo ọna lati ṣe ipa ọna ijabọ laarin opo kan. ti awọn iṣẹ microservices tabi opo awọn ohun elo. Ni ọna yii, o le ṣe afiwe awọn aṣayan: kini o ṣẹlẹ ti o ba ṣe agbekalẹ ohun gbogbo funrararẹ tabi lo apapo iṣẹ ti o wa tẹlẹ. Aṣayan boṣewa: ṣe funrararẹ tabi ra.

Gbigbe ipa ọna fun awọn ohun elo ti o gbalejo

Awọn ohun elo lori dotCloud le ṣe afihan HTTP ati awọn aaye ipari TCP.

HTTP opin dynamically fi kun si fifuye iwontunwonsi iṣupọ iṣeto ni Hipache. Eyi jẹ iru si ohun ti awọn orisun ṣe loni Ingress ni Kubernetes ati ki o kan fifuye iwontunwonsi bi Traefik.

Awọn alabara sopọ si awọn aaye ipari HTTP nipasẹ awọn ibugbe ti o yẹ, ti a pese pe orukọ ìkápá naa tọka si awọn iwọntunwọnsi fifuye dotCloud. Ko si ohun pataki.

Awọn aaye ipari TCP ni nkan ṣe pẹlu nọmba ibudo, eyiti o kọja si gbogbo awọn apoti inu akopọ yẹn nipasẹ awọn oniyipada ayika.

Awọn onibara le sopọ si awọn aaye ipari TCP nipa lilo orukọ olupin ti o yẹ (nkankan bi gateway-X.dotcloud.com) ati nọmba ibudo.

Orukọ ogun yii pinnu si iṣupọ olupin “nats” (kii ṣe ibatan si NATS), eyi ti yoo ṣe awọn ọna asopọ TCP ti nwọle si apoti ti o tọ (tabi, ninu ọran ti awọn iṣẹ ti o ni iwọntunwọnsi, si awọn apoti to tọ).

Ti o ba faramọ pẹlu Kubernetes, eyi yoo ṣee ṣe leti rẹ ti Awọn iṣẹ NodePort.

Ko si awọn iṣẹ deede lori pẹpẹ dotCloud Àkópọ̀ IP: Fun ayedero, awọn iṣẹ wọle ni ọna kanna mejeeji lati inu ati ita pẹpẹ.

Ohun gbogbo ti ṣeto ni irọrun: awọn imuṣẹ ibẹrẹ ti HTTP ati awọn nẹtiwọọki ipa ọna TCP jẹ boya awọn laini ọgọrun diẹ ti Python ọkọọkan. Awọn algoridimu ti o rọrun (Emi yoo sọ pe o rọrun) ti a ti sọ di mimọ bi pẹpẹ ti dagba ati awọn ibeere afikun ti han.

Atunse titobi ti koodu to wa ko nilo. Gegebi bi, 12 ifosiwewe apps le taara lo adirẹsi ti o gba nipasẹ awọn oniyipada ayika.

Bawo ni eyi ṣe yatọ si apapo iṣẹ ode oni?

Lopin hihan. A ko ni awọn metiriki eyikeyi fun apapo ipa ọna TCP rara. Nigbati o ba wa si ipa ọna HTTP, awọn ẹya nigbamii ṣafihan awọn metiriki HTTP alaye pẹlu awọn koodu aṣiṣe ati awọn akoko idahun, ṣugbọn awọn meshes iṣẹ ode oni lọ paapaa siwaju, pese isọpọ pẹlu awọn eto ikojọpọ awọn metiriki bii Prometheus, fun apẹẹrẹ.

Hihan jẹ pataki kii ṣe lati irisi iṣẹ nikan (lati ṣe iranlọwọ fun awọn iṣoro laasigbotitusita), ṣugbọn paapaa nigba idasilẹ awọn ẹya tuntun. O jẹ nipa ailewu bulu-alawọ ewe imuṣiṣẹ и canary imuṣiṣẹ.

Iṣiṣẹ ipa ọna tun ni opin. Ninu apapo afisona dotCloud, gbogbo awọn ijabọ ni lati lọ nipasẹ iṣupọ kan ti awọn apa ipa ọna iyasọtọ. Eyi tumọ si pe o le kọja ọpọlọpọ awọn aala AZ (Agbegbe Wiwa) ati jijẹ lairi ni pataki. Mo ranti koodu laasigbotitusita ti o n ṣe diẹ sii ju ọgọrun awọn ibeere SQL fun oju-iwe kan ati ṣiṣi asopọ tuntun si olupin SQL fun ibeere kọọkan. Nigbati o ba n ṣiṣẹ ni agbegbe, oju-iwe naa n gbera lesekese, ṣugbọn ni dotCloud o gba iṣẹju-aaya diẹ lati fifuye nitori asopọ TCP kọọkan (ati ibeere SQL ti o tẹle) gba awọn mewa ti milliseconds. Ni ọran yii pato, awọn asopọ ti o tẹsiwaju yanju iṣoro naa.

Awọn meshes iṣẹ ode oni dara julọ ni ṣiṣe pẹlu iru awọn iṣoro bẹ. Ni akọkọ, wọn ṣayẹwo pe awọn asopọ ti wa ni ipalọlọ ninu orisun. Sisan ọgbọn jẹ kanna: клиент → меш → сервис, ṣugbọn nisisiyi apapo ṣiṣẹ ni agbegbe ati kii ṣe lori awọn apa jijin, nitorina asopọ naa клиент → меш jẹ agbegbe ati iyara pupọ (microseconds dipo milliseconds).

Awọn meshes iṣẹ ode oni tun ṣe awọn algoridimu iwọntunwọnsi fifuye ijafafa. Nipa mimojuto ilera ti awọn ẹhin, wọn le firanṣẹ awọn ijabọ diẹ sii si awọn ẹhin ẹhin yiyara, ti o mu ilọsiwaju dara si iṣẹ ṣiṣe gbogbogbo.

Aabo dara ju. Apapọ afisona dotCloud ṣiṣẹ patapata lori Ayebaye EC2 ati pe ko ṣe ifipamọ ijabọ (da lori ero pe ti ẹnikan ba ṣakoso lati fi sniffer sori ijabọ nẹtiwọọki EC2, o ti wa ninu wahala nla tẹlẹ). Awọn meshes iṣẹ ode oni ṣe aabo aabo gbogbo awọn ijabọ wa, fun apẹẹrẹ, pẹlu ijẹrisi TLS ti ara ẹni ati fifi ẹnọ kọ nkan ti o tẹle.

Ijabọ ipa ọna fun awọn iṣẹ Syeed

O dara, a ti jiroro ijabọ laarin awọn ohun elo, ṣugbọn kini nipa pẹpẹ dotCloud funrararẹ?

Syeed funrararẹ ni bii ọgọrun awọn iṣẹ microservices ti o ni iduro fun awọn iṣẹ lọpọlọpọ. Diẹ ninu awọn gba awọn ibeere lati ọdọ awọn miiran, ati diẹ ninu awọn jẹ oṣiṣẹ abẹlẹ ti o sopọ si awọn iṣẹ miiran ṣugbọn ko gba awọn asopọ funrararẹ. Ni eyikeyi idiyele, iṣẹ kọọkan gbọdọ mọ awọn aaye ipari ti awọn adirẹsi ti o nilo lati sopọ si.

Ọpọlọpọ awọn iṣẹ ipele giga le lo apapo ipa ọna ti a ṣalaye loke. Ni otitọ, ọpọlọpọ awọn dotCloud's diẹ sii ju ọgọrun microservices ti wa ni ransogun bi awọn ohun elo deede lori pẹpẹ dotCloud funrararẹ. Ṣugbọn nọmba kekere ti awọn iṣẹ ipele kekere (paapaa awọn ti o ṣe imuse apapo ipasọtọ yii) nilo nkan ti o rọrun, pẹlu awọn igbẹkẹle diẹ (nitori wọn ko le dale lori ara wọn lati ṣiṣẹ - adie atijọ ati iṣoro ẹyin).

Awọn ipele kekere wọnyi, awọn iṣẹ pataki-pataki ni a gbe lọ nipasẹ ṣiṣiṣẹ awọn apoti taara lori awọn apa bọtini diẹ. Ni ọran yii, awọn iṣẹ pẹpẹ boṣewa ko lo: ọna asopọ, oluṣeto ati olusare. Ti o ba fẹ ṣe afiwe si awọn iru ẹrọ eiyan ode oni, o dabi ṣiṣe ọkọ ofurufu iṣakoso pẹlu docker run taara lori awọn apa, dipo ti a fi awọn iṣẹ-ṣiṣe to Kubernetes. O ni lẹwa iru ni Erongba awọn modulu aimi (pods), ti o nlo kubeadm tabi batakube nigbati booting a standalone iṣupọ.

Awọn iṣẹ wọnyi ti farahan ni ọna ti o rọrun ati robi: faili YAML ti ṣe akojọ awọn orukọ ati adirẹsi wọn; ati pe alabara kọọkan ni lati mu ẹda faili YAML yii fun imuṣiṣẹ.

Ni ọna kan, o jẹ igbẹkẹle pupọ nitori ko nilo atilẹyin ti bọtini ita / ile itaja iye bii Zookeeper (ranti, ati bẹbẹ lọ tabi Consul ko si ni akoko yẹn). Ni apa keji, o jẹ ki o nira lati gbe awọn iṣẹ. Nigbakugba ti gbigbe kan, gbogbo awọn alabara yoo gba faili YAML imudojuiwọn (ati agbara atunbere). Ko itura pupọ!

Lẹhinna, a bẹrẹ lati ṣe imuse ero tuntun kan, nibiti alabara kọọkan ti sopọ mọ olupin aṣoju agbegbe kan. Dipo adirẹsi ati ibudo, o nilo lati mọ nọmba ibudo ti iṣẹ naa, ati sopọ nipasẹ localhost. Aṣoju agbegbe n ṣakoso asopọ yii ati firanṣẹ siwaju si olupin gangan. Ni bayi, nigbati o ba n gbe ẹhin pada si ẹrọ miiran tabi fifẹ, dipo mimu gbogbo awọn alabara dojuiwọn, iwọ nikan nilo lati ṣe imudojuiwọn gbogbo awọn aṣoju agbegbe wọnyi; ati atunbere ko si ohun to nilo.

(O tun gbero lati ṣafikun ijabọ ni awọn asopọ TLS ki o fi olupin aṣoju miiran si ẹgbẹ gbigba, ati rii daju awọn iwe-ẹri TLS laisi ikopa ti iṣẹ gbigba, eyiti o tunto lati gba awọn asopọ nikan lori localhost. Diẹ sii lori eyi nigbamii).

Eleyi jẹ gidigidi iru si SmartStack lati Airbnb, ṣugbọn awọn significant iyato ni wipe SmartStack ti wa ni imuse ati ki o ran lọ si gbóògì, nigba ti dotCloud ká ti abẹnu afisona eto ti a shelved nigba ti dotCloud di Docker.

Mo tikalararẹ ro SmartStack lati jẹ ọkan ninu awọn iṣaaju si awọn eto bii Istio, Linkerd ati Consul Connect nitori gbogbo wọn tẹle ilana kanna:

  • Ṣiṣe aṣoju kan lori ipade kọọkan.
  • Awọn onibara sopọ si aṣoju.
  • Ọkọ ofurufu iṣakoso ṣe imudojuiwọn iṣeto aṣoju nigbati awọn ẹhin ẹhin yipada.
  • ... Èrè!

Modern imuse ti a iṣẹ apapo

Ti a ba nilo lati lo iru akoj loni, a le lo awọn ilana kanna. Fun apẹẹrẹ, tunto agbegbe agbegbe DNS inu nipasẹ ṣiṣe awọn orukọ iṣẹ aworan si awọn adirẹsi ni aaye 127.0.0.0/8. Lẹhinna ṣiṣẹ HAProxy lori ipade kọọkan ninu iṣupọ, gbigba awọn asopọ ni adirẹsi iṣẹ kọọkan (ni inu subnet yẹn 127.0.0.0/8) ati atunṣe / iwọntunwọnsi fifuye si awọn ẹhin ti o yẹ. Iṣeto HAProxy le jẹ iṣakoso confd, gbigba ọ laaye lati tọju alaye ẹhin ni etcd tabi Consul ati titari atunto imudojuiwọn laifọwọyi si HAProxy nigbati o nilo.

Eleyi jẹ lẹwa Elo bi Istio ṣiṣẹ! Ṣugbọn pẹlu diẹ ninu awọn iyatọ:

  • Nlo Aṣoju Aṣoju dipo HAProxy.
  • Awọn ile itaja atunto ẹhin nipasẹ Kubernetes API dipo etcd tabi Consul.
  • Awọn iṣẹ ti wa ni sọtọ awọn adirẹsi lori awọn ti abẹnu subnet (Kubernetes ClusterIP adirẹsi) dipo ti 127.0.0.0/8.
  • Ni afikun paati (Citadel) lati ṣafikun ijẹrisi TLS laarin alabara ati olupin.
  • Ṣe atilẹyin awọn ẹya tuntun bii fifọ Circuit, wiwa kaakiri, imuṣiṣẹ canary, ati bẹbẹ lọ.

Jẹ ki a yara wo diẹ ninu awọn iyatọ.

Aṣoju Aṣoju

Aṣoju Aṣoju ti kọ nipasẹ Lyft [oludije Uber ni ọja takisi - isunmọ. ona]. O jẹ iru ni ọpọlọpọ awọn ọna si awọn aṣoju miiran (fun apẹẹrẹ HAProxy, Nginx, Traefik ...), ṣugbọn Lyft kowe tiwọn nitori wọn nilo awọn ẹya ara ẹrọ ti awọn aṣoju miiran ko ni, ati pe o dabi ẹnipe o ni imọran lati ṣe titun kan ju ki o fa eyi ti o wa tẹlẹ.

Aṣoju le ṣee lo lori ara rẹ. Ti Mo ba ni iṣẹ kan pato ti o nilo lati sopọ si awọn iṣẹ miiran, Mo le tunto rẹ lati sopọ si Aṣoju, ati lẹhinna tunto ni agbara ati tunto Aṣoju pẹlu ipo ti awọn iṣẹ miiran, lakoko ti n gba ọpọlọpọ awọn iṣẹ ṣiṣe afikun nla, bii hihan. Dipo ile ikawe alabara aṣa tabi itasi awọn itọpa ipe sinu koodu, a firanṣẹ ijabọ si Aṣoju, ati pe o gba awọn metiriki fun wa.

Ṣugbọn Envoy tun lagbara lati ṣiṣẹ bi data ofurufu (ọkọ ofurufu data) fun apapo iṣẹ. Eyi tumọ si pe Aṣoju ti wa ni tunto fun apapo iṣẹ yii ofurufu Iṣakoso (ọkọ ofurufu iṣakoso).

Iṣakoso ofurufu

Fun ọkọ ofurufu iṣakoso, Istio gbarale Kubernetes API. Eyi ko yatọ pupọ si lilo confd, eyiti o da lori etcd tabi Consul lati wo ṣeto awọn bọtini ni ile itaja data. Istio nlo Kubernetes API lati wo akojọpọ awọn orisun Kubernetes.

Laarin eyi ati lẹhinna: Mo ti tikalararẹ ri yi wulo Kubernetes API apejuweti o ka:

Olupin API Kubernetes jẹ “olupin odi” ti o funni ni ibi ipamọ, ikede, afọwọsi, imudojuiwọn, ati awọn itumọ-ọrọ fun awọn orisun API.

Istio jẹ apẹrẹ lati ṣiṣẹ pẹlu Kubernetes; ati pe ti o ba fẹ lo ni ita Kubernetes, lẹhinna o nilo lati ṣiṣẹ apẹẹrẹ ti olupin Kubernetes API (ati iṣẹ oluranlọwọ etcd).

Awọn adirẹsi iṣẹ

Istio gbarale awọn adirẹsi ClusterIP ti Kubernetes pin, nitorinaa awọn iṣẹ Istio gba adirẹsi inu (kii ṣe ni sakani). 127.0.0.0/8).

Gbigbe si adiresi ClusterIP fun iṣẹ kan pato ninu iṣupọ Kubernetes laisi Istio ni idaduro nipasẹ kube-aṣoju ati firanṣẹ si ẹhin aṣoju yẹn. Ti o ba nifẹ si awọn alaye imọ-ẹrọ, kube-proxy ṣeto awọn ofin iptables (tabi awọn iwọntunwọnsi fifuye IPVS, da lori bii o ṣe tunto) lati tunkọ awọn adirẹsi IP opin irin ajo ti awọn asopọ ti n lọ si adirẹsi ClusterIP.

Ni kete ti Istio ti fi sori ẹrọ lori iṣupọ Kubernetes, ko si ohun ti o yipada titi yoo fi muu ṣiṣẹ ni gbangba fun alabara ti a fun, tabi paapaa gbogbo aaye orukọ, nipa iṣafihan apoti kan sidecar sinu aṣa pods. Eiyan yii yoo yika apẹẹrẹ ti Aṣoju ati ṣeto ṣeto ti awọn ofin iptables lati ṣe idiwọ ijabọ ti n lọ si awọn iṣẹ miiran ati tun-dari ijabọ yẹn si Aṣoju.

Nigbati o ba ṣepọ pẹlu Kubernetes DNS, eyi tumọ si pe koodu wa le sopọ nipasẹ orukọ iṣẹ ati ohun gbogbo "o kan ṣiṣẹ." Ni awọn ọrọ miiran, koodu wa n ṣalaye awọn ibeere bii http://api/v1/users/4242lẹhinna api yanju ìbéèrè fun 10.97.105.48, Awọn ofin iptables yoo ṣe idilọwọ awọn asopọ lati 10.97.105.48 ati firanṣẹ wọn si aṣoju Aṣoju agbegbe, ati pe aṣoju agbegbe yoo firanṣẹ ibeere naa si API ẹhin gangan. Phew!

Afikun frills

Istio tun pese fifi ẹnọ kọ nkan ipari-si-opin ati ijẹrisi nipasẹ mTLS (TLS ibajọpọ). A paati ti a npe ni Ṣuṣani.

Ẹya paati tun wa aladapo, eyiti Aṣoju le beere fun ti kọọkan beere lati ṣe ipinnu pataki kan nipa ibeere yẹn ti o da lori ọpọlọpọ awọn ifosiwewe bii awọn akọle, fifuye ẹhin, ati bẹbẹ lọ… (maṣe yọ ara rẹ lẹnu: awọn ọna pupọ lo wa lati jẹ ki Mixer ṣiṣẹ, ati paapaa ti o ba kọlu, Aṣoju yoo tẹsiwaju lati ṣiṣẹ itanran bi aṣoju).

Ati pe, nitorinaa, a mẹnuba hihan: Aṣoju gba iye nla ti awọn metiriki lakoko ti o n pese wiwa kaakiri. Ninu faaji microservices kan, ti ibeere API kan gbọdọ kọja nipasẹ awọn iṣẹ microservices A, B, C, ati D, lẹhinna ni iwọle, wiwa kaakiri yoo ṣafikun idanimọ alailẹgbẹ kan si ibeere naa ati tọju idanimọ yii nipasẹ awọn ibeere si gbogbo awọn iṣẹ microservices wọnyi, gbigba laaye. gbogbo awọn ipe ti o jọmọ lati mu awọn idaduro, ati bẹbẹ lọ.

Dagbasoke tabi ra

Istio ni orukọ rere fun jije eka. Ni idakeji, kikọ apapo ipa-ọna ti Mo ṣapejuwe ni ibẹrẹ ifiweranṣẹ yii jẹ irọrun ni lilo awọn irinṣẹ to wa tẹlẹ. Nitorinaa, ṣe o ni oye lati ṣẹda apapo iṣẹ tirẹ dipo?

Ti a ba ni awọn iwulo iwọntunwọnsi (a ko nilo hihan, fifọ Circuit ati awọn arekereke miiran), lẹhinna awọn ero wa lati ṣe agbekalẹ irinṣẹ tiwa. Ṣugbọn ti a ba lo Kubernetes, o le ma nilo paapaa nitori Kubernetes ti pese awọn irinṣẹ ipilẹ fun wiwa iṣẹ ati iwọntunwọnsi fifuye.

Ṣugbọn ti a ba ni awọn ibeere to ti ni ilọsiwaju, lẹhinna “rira” apapo iṣẹ kan dabi pe o jẹ aṣayan ti o dara julọ. (Eyi kii ṣe “ra nigbagbogbo” nitori Istio jẹ orisun ṣiṣi, ṣugbọn a tun nilo lati ṣe idoko-owo akoko imọ-ẹrọ lati loye, ran lọ, ati ṣakoso rẹ.)

Ṣe Mo yẹ ki o yan Istio, Linkerd tabi Consul Connect?

Nitorinaa a ti sọrọ nikan nipa Istio, ṣugbọn eyi kii ṣe apapo iṣẹ nikan. Olokiki yiyan - Linkerd, ati pe o wa diẹ sii Consul Asopọ.

Kini lati yan?

Nitootọ, Emi ko mọ. Ni akoko Emi ko ro ara mi pe o to lati dahun ibeere yii. Diẹ wa awon ìwé pẹlu lafiwe ti awọn wọnyi irinṣẹ ati paapa awọn aṣepari.

Ọna kan ti o ni ileri ni lati lo irinṣẹ bii SuperGloo. O ṣe imuse Layer abstraction lati jẹ ki o rọrun ati isokan awọn API ti o farahan nipasẹ awọn meshes iṣẹ. Dipo kiko ẹkọ pato (ati, ni ero mi, eka ti o jo) awọn API ti awọn meshes iṣẹ oriṣiriṣi, a le lo awọn itumọ ti o rọrun ti SuperGloo - ati ni irọrun yipada lati ọkan si ekeji, bi ẹnipe a ni ọna atunto agbedemeji ti n ṣapejuwe awọn atọkun HTTP ati awọn ẹhin ti o lagbara. ti ipilẹṣẹ iṣeto gangan fun Nginx, HAProxy, Traefik, Apache ...

Mo ti sọ kekere kan pẹlu Istio ati SuperGloo, ati ninu nkan atẹle Mo fẹ ṣafihan bi o ṣe le ṣafikun Istio tabi Linkerd si iṣupọ ti o wa tẹlẹ nipa lilo SuperGloo, ati bii igbehin ṣe gba iṣẹ naa, iyẹn ni, gba ọ laaye lati yipada lati ọkan iṣẹ apapo si miiran lai ìkọlélórí awọn atunto.

orisun: www.habr.com

Fi ọrọìwòye kun