1.1 Arkitektura ng aplikasyon

Ang kursong ito ay idinisenyo para sa mga nagsisimula, dahil hindi ka magdidisenyo ng arkitektura ng isang seryosong aplikasyon sa mahabang panahon. Ngunit huwag mag-alala, ang mahusay na arkitektura ay ang pagbubukod sa halip na ang panuntunan. Napakahirap piliin ang tamang arkitektura ng application bago buuin ang application.

Mga halimbawa ng mga sikat na arkitektura para sa malalaking application ng server:

  • Layered architecture (Layered Architecture).
  • Tiered Architecture.
  • Arkitekturang Nakatuon sa Serbisyo (SOA).
  • Microservice architecture (Microservice Architecture).

Ang bawat isa sa kanila ay may mga kalamangan at kahinaan. Ngunit ang pag-aaral sa kanila ay hindi magbibigay sa iyo ng anuman. Ang arkitektura ay ang sagot sa tanong na "kung paano ayusin ang pakikipag-ugnayan ng libu-libong mga bagay sa loob ng system" . At hanggang sa maranasan mo ang buong pagiging kumplikado ng problema, hindi mo mauunawaan ang buong kagalingan ng solusyon.

Ang lahat ng mga application ay gumagamit ng ilang uri ng arkitektura, o hindi bababa sa pagpapanggap. Samakatuwid, ang kaalaman sa mga sikat na diskarte sa disenyo ng application ay magbibigay-daan sa iyo upang mabilis at mas mahusay na maunawaan kung paano gumagana ang application. At nangangahulugan iyon ng paggawa ng mga pagbabago nang eksakto kung saan mo ito kailangan.

Ano ang ibig sabihin ng "gumawa ng mga pagbabago kung kinakailangan"? Mayroon bang mga lugar kung saan hindi mo kailangang gumawa ng mga pagbabago? Eksakto.

Upang maging partikular, sabihin nating gumagawa ka ng isang medium na backend na proyekto . Ito ay isinulat sa loob ng 5 taon ng isang pangkat ng 20 katao. Ang proyekto ay tumagal ng 100 taong-taon at naglalaman ng halos 100 libong linya ng code. Sa kabuuan, binubuo ito ng dalawang libong klase, na nahahati sa 10 mga module na may iba't ibang laki.

At magdagdag ng isang malupit na katotohanan. Ang lohika ng ilang mga gawain ay nakakalat sa ilang mga module. Gayundin, ang lohika ng negosyo ay maaaring nasa frontend (nakasulat sa JavaScript) at / o nakasulat bilang isang naka-imbak na pamamaraan nang direkta sa database. Sigurado ka pa ba na matutukoy mo kaagad ang lugar kung saan eksaktong gagawa ng mga pagbabago ?

Hindi ito isang bangungot na ginawa ko para takutin ka. Ito ay isang tipikal na proyekto. Mas malala pa ang nangyayari. Bakit ito nangyayari? Maaaring mayroong anumang bilang ng mga kadahilanan, ngunit halos palaging may mga ganito:

  • Maraming tao ang nagtatrabaho sa proyekto - ang bawat isa sa kanila ay nakikita ito nang kaunti sa ibang paraan.
  • Sa loob ng 5 taon, 10 tao ang nagbago sa proyekto, hindi ito gaanong naintindihan ng mga bagong dating.
  • Ang paglikha ng software ay isang patuloy na paggawa ng mga pagbabago na patuloy na nagbabago sa lahat.
  • Limang taon na ang nakalilipas, nang magpasya kami sa arkitektura, ang ideya ng proyekto ay medyo naiiba.

Ngunit ang pangunahing bagay ay na anuman ang arkitektura ng proyekto, ang lahat ng mga programmer na nagtatrabaho dito ay sumunod sa parehong pag-unawa sa kung paano gumagana ang proyektong ito. Magsimula tayo sa pinakasimpleng konsepto - arkitektura ng client-server.

1.2 Ang konsepto ng pakikipag-ugnayan ng client-server

Ngayon ay mauunawaan na namin ang konsepto na sumasailalim sa arkitektura ng client-server at magbibigay-daan sa iyo na mas maunawaan kung paano inayos ang pakikipag-ugnayan ng milyun-milyong programa sa Internet.

Gaya ng ipinahihiwatig ng pangalan, ang konseptong ito ay nagsasangkot ng dalawang partido: client at server . Ang lahat ay tulad sa buhay dito: ang kliyente ay ang customer ng ito o ang serbisyong iyon, at ang server ay ang service provider. Ang kliyente at server ay pisikal na mga programa , halimbawa ang karaniwang kliyente ay isang browser .

Ang mga sumusunod na halimbawa ay maaaring ibigay bilang isang server:

  • Mga web server tulad ng Tomcat.
  • Mga server ng database tulad ng MySQL.
  • Mga gateway ng pagbabayad tulad ng Stripe.

Ang kliyente at ang server ay karaniwang nakikipag-usap sa pamamagitan ng Internet (bagaman maaari silang magtrabaho sa parehong lokal na network ng lugar at sa pangkalahatan sa anumang iba pang mga uri ng network). Nagaganap ang komunikasyon sa mga karaniwang protocol gaya ng HTTP, FTP, o mga mas mababang antas ng protocol gaya ng TCP o UDP.

Karaniwang pinipili ang protocol ayon sa uri ng serbisyo na ibinibigay ng mga server. Halimbawa, kung ito ay isang video call, kadalasang ginagamit ang UDP.

Tandaan kung paano gumagana ang Tomcat at ang mga servlet nito? Ang server ay tumatanggap ng isang HTTP na mensahe, i-unpack ito, kinukuha ang lahat ng kinakailangang impormasyon mula doon at ipinapasa ito sa servlet para sa pagproseso. Pagkatapos ang resulta ng pagpoproseso ay ibinabalik sa isang HTTP-response at ipinadala sa kliyente.

Ito ang karaniwang pakikipag-ugnayan ng client-server. Ang browser ay ang web client at ang Tomcat ay ang web server. Ang Tomcat ay tinatawag na isang web server.

Ngunit kung iisipin, hindi ang pangalan ang mahalaga, kundi ang esensya - ang pamamahagi ng mga tungkulin sa pagitan ng mga programa. Ang iyong JS script na tumatakbo sa isang HTML na pahina ay matatawag na client , at ang iyong servlet ay isang server . Pagkatapos ng lahat, nagtatrabaho sila nang pares sa loob ng balangkas ng konsepto ng client-server .

1.3 Isang mahalagang nuance

Dapat ding tandaan na ang pakikipag-ugnayan ng kliyente-server ay batay sa prinsipyo na ang naturang pakikipag-ugnayan ay pinasimulan ng kliyente : sinasagot lamang ng server ang kliyente at nag-uulat kung maibibigay nito ang serbisyo sa kliyente at, kung gayon, sa anong mga kundisyon .

Hindi mahalaga kung saan pisikal na matatagpuan ang kliyente at kung nasaan ang server. Ang client software at server software ay karaniwang naka-install sa iba't ibang machine, ngunit maaari din silang tumakbo sa parehong computer.

Ang konseptong ito ay binuo bilang unang hakbang patungo sa pagpapasimple ng isang komplikadong sistema. Mayroon siyang mga kalakasang ito:

  • Logic simplification : walang alam ang server tungkol sa client at kung paano nito gagamitin ang data nito sa hinaharap.
  • Maaaring may mahinang mga kliyente : lahat ng gawaing masinsinang mapagkukunan ay maaaring ilipat sa server.
  • Malayang pag-unlad ng client code at server code.
  • Maraming iba't ibang mga kliyente, halimbawa Tomcat at iba't ibang mga browser.

Ang pinakapangunahing bersyon ng pakikipag-ugnayan sa pagitan ng kliyente at ng server ay ipinapakita sa larawan:

client-server

Mahalagang tandaan ang dalawang detalye dito. Una, ipinapakita ng larawan na maraming mga kliyente ang maaaring ma-access ang isang server. Pangalawa, maaari nilang ma-access ito nang sabay. Ito rin ay isang mahalagang bahagi ng server.

Karaniwang nakikipag-ugnayan ang isang kliyente sa isang user, kaya madalas kahit na ang pahintulot ay hindi kailangan doon. Gayunpaman, pinoproseso ng server ang mga kahilingan mula sa libu-libong kliyente, at kapag bumubuo ng code para dito, kailangan mong matukoy ang pagkakaiba sa pagitan ng awtorisasyon at pagpapatunay.

Mahalaga rin na ang server ay nagpoproseso ng libu-libong mga kahilingan nang magkatulad. At nangangahulugan ito na kapag bumubuo ng backend code, kailangan mong palaging isipin ang gawain ng kasabay na pag-access sa mga mapagkukunan. Gayundin, ang code ng server ay may napakataas na posibilidad ng kundisyon ng lahi (lahi ng thread), deadlock (mutual blocking ng mga thread).

Ang ikot ng buhay ng mahahalagang bagay ay dapat subaybayan:

Hindi ka maaaring magsimula ng isang bagong thread sa server sa pamamagitan ng new Thread().start(). Sa halip, kailangan mong magkaroon ng ThreadPool na magbabahagi sa lahat ng mga thread ng serbisyo.

Gayundin, hindi ka maaaring magsimula ng isang asynchronous na gawain, dahil ang mga ito ay isinasagawa din sa magkahiwalay na mga thread. Kapag gumagawa ng ganoong gawain, dapat mong laging malaman kung aling pool ng mga thread ang nagpapatupad nito at kung ano ang mangyayari kung ang naturang pool ay umapaw.

Ang lahat ng trabaho sa mga file at mga direktoryo ay dapat gawin sa pamamagitan ng try-with-resources. Kung sa isang normal na application ay nakalimutan mong isara ang isang stream o isang file, problema ba iyon? Isasara nito ang sarili nito kapag lumabas ka sa programa. Ngunit kung nakalimutan mong isara ang isang file sa server sa isang lugar sa code, at ang iyong server ay tumatakbo nang maraming buwan ... Sa lalong madaling panahon, libu-libong mga hindi nakasara na mga file ang maipon at ang OS ay hihinto sa pagbubukas ng mga bagong file para sa pagbabasa (gumana sa mga file ay kinokontrol ng OS). Hindi ka papatulan ng teamlead sa ulo...

1.4 Arkitektura ng Client-server

isa pang mahalagang punto. Ang arkitektura ng client-server ay tumutukoy lamang sa mga pangkalahatang prinsipyo ng pakikipag-ugnayan sa pagitan ng mga computer , ang mga detalye ng pakikipag-ugnayan ay tinutukoy ng iba't ibang mga protocol.

Sinasabi sa atin ng konseptong ito (client-server) na kailangan nating hatiin ang mga machine sa network sa mga client machine, na palaging nangangailangan ng isang bagay, at mga server machine, na nagbibigay ng kailangan nila. Sa kasong ito, palaging sinisimulan ng kliyente ang pakikipag-ugnayan, at ang mga patakaran kung saan nangyayari ang pakikipag-ugnayan ay inilalarawan ng protocol.

Mayroong dalawang uri ng arkitektura ng pakikipag-ugnayan ng client-server: ang una ay tinatawag na two-tier client-server architecture , ang pangalawa ay ang multi-tier na arkitektura ng client-server (minsan ay tinatawag na three-tier architecture o three-tier architecture, ngunit ito ay isang espesyal na kaso).

Ang prinsipyo ng pagpapatakbo ng dalawang-tier na arkitektura ng pakikipag-ugnayan ng client-server ay ang pagpoproseso ng isang kahilingan ay nangyayari sa isang server nang hindi tumutukoy sa iba pang mga server sa proseso ng pagproseso na ito.

Ang two-tier na modelo ng pakikipag-ugnayan ng client-server ay maaaring iguhit bilang isang simpleng diagram.

two-tier na arkitektura ng client-server

Dito makikita mo na ang unang antas ay lahat ng bagay na may kinalaman sa kliyente, at ang pangalawang antas ay lahat ng bagay na may kinalaman sa server.