Apakah ini normal untuk sepenuhnya memisahkan aplikasi web backend dan frontend dan memungkinkan mereka untuk berkomunikasi dengan (JSON) REST API?

21

Saya membuat aplikasi web bisnis baru dan saya ingin mencapai:

  • Gunakan teknologi terbaik dari bidangnya masing-masing. Saya ingin kerangka backend yang andal dengan ORM solid. Dan saya ingin kerangka SPA (aplikasi halaman tunggal) paling canggih dengan penggunaan fitur HTML dan Javascript paling mutakhir untuk aplikasi frontend
  • Mengekspos entitas backend dan layanan bisnis untuk penggunaan dari berbagai jenis aplikasi - mis. Aplikasi web, seluler (Android) dan mungkin jenis lainnya (perangkat pintar, dll.)

Jadi - untuk memenuhi kedua persyaratan, saya cenderung benar-benar memisahkan aplikasi saya di aplikasi backend dan frontend dan mengatur komunikasi di antara mereka menggunakan REST API (JSON). Apakah pendekatan ini masuk akal?

Pemisahan seperti itu bukanlah solusi desain yang jelas, karena banyak teknologi aplikasi web memiliki lapisan tampilan terintegrasi di mana aplikasi sisi server lebih atau kurang mengontrol pembuatan tampilan dan sebagian menangani respons dari tampilan (misalnya SpringMVC dengan lapisan tampilan, PHP Yii dengan tampilan layer, Java JSF / Facelets benar-benar menyimpan status komponen mereka di server). Jadi - ada banyak teknologi di sekitar yang mengusulkan kopling yang lebih kuat dan menjanjikan waktu pengembangan yang lebih cepat dan perjalanan jalur yang lebih standar. Jadi - saya harus berhati-hati ketika mulai menggunakan teknologi dengan cara yang tidak banyak digunakan.

Seperti yang saya pahami maka frontend SPA yang sepenuhnya terpisah biasanya muncul dari keharusan untuk menggunakan API pihak ketiga. Tapi apakah desain suara decoupling seperti itu ketika backend dan frontend dikembangkan oleh satu perusahaan?

Pilihan teknologi saya saat ini adalah Java / Spring backend dan Angular2 / Web Components / Polymer untuk frontend - jika saya boleh mengatakan ini. Tetapi itu tidak relevan untuk pertanyaan ini, karena pertanyaan ini adalah tentang desain umum dan bukan tentang pilihan teknologi konkret?

Untuk Tuan
sumber
8
(1) Iya nih. Itu normal sekarang hari untuk pergi ke sana.
Laiv
5
(2) So - I must be cautious when starting to use technologies in manner which is not widely used.Ya, Anda harus berhati-hati jika Anda berencana menggunakan palu untuk melempar sutra. Mungkin itu bukan alat yang tepat.
Laiv
3
Sadarilah bahwa decoupling dengan cara yang sedemikian ketat menciptakan biaya pengembangan dimuka yang signifikan. Anda perlu mendapatkan nilai konkret dari itu.
usr
2
Perhatikan juga bahwa Anda tidak pernah dapat secara langsung mengekspos domain Anda ke browser. Ini menciptakan masalah keamanan dan data tidak akan diformat untuk ditampilkan. Anda perlu membuat antarmuka tujuan khusus (REST) ​​hanya untuk panggilan JavaScript. Dan itu digabungkan.
usr
1
Spring memiliki anotasi PathVariable, ResponseBody, RequestBody dan RestController (Anda harus memeriksanya). Mereka membuat pengembangan aplikasi web JSON / REST berbasis Ajax sangat, sangat mudah, yang menjadikan Spring backend yang bagus untuk SPA. Saya sangat percaya bahwa memisahkan frontend dan backend dengan cara itu adalah pilihan yang lebih baik: Aplikasi JSF klasik yang membuat saya "senang" bekerja sama berantakan.
Traubenfuchs

Jawaban:

14

Apakah ini normal untuk sepenuhnya memisahkan aplikasi web backend dan frontend dan memungkinkan mereka untuk berkomunikasi dengan (JSON) REST API?

Ya itu normal. Tapi itu normal hanya jika Anda perlu memiliki semacam pemisahan dan Anda tidak memaksa pengaturan ini ke dalam aplikasi Anda secara keseluruhan.

SPA hadir dengan beberapa masalah yang terkait dengannya. Berikut adalah beberapa yang muncul di pikiran saya sekarang:

  • sebagian besar JavaScript. Satu kesalahan di bagian aplikasi Anda mungkin mencegah bagian lain dari aplikasi untuk bekerja karena kesalahan Javascript itu. Dengan halaman-halaman yang disajikan dari server (SpringMVC, PHP, dll) Anda memuat ulang bagian baru;
  • CORS . Tidak harus wajib tetapi sering kali back-end menggunakan nama domain yang berbeda dari front-end. Jadi sekarang Anda harus berurusan dengan masalah keamanan browser;
  • SEO . Apakah Anda memerlukan ini? Apakah situs Anda publik? Google dapat memahami Javascript dan mencoba masuk akal dari situs Anda, tetapi pada dasarnya Anda memberi kontrol pada bot dan berharap yang terbaik. Mengambil kembali kendali mungkin berarti harus mengandalkan alat lain seperti PhantomJS .
  • aplikasi front-end yang terpisah berarti proyek-proyek terpisah, jaringan pipa penyebaran, tooling tambahan, dll;
  • keamanan lebih sulit dilakukan ketika semua kode ada di klien;

Tentu, ada keuntungan SPA juga:

  • sepenuhnya berinteraksi di front-end dengan pengguna dan hanya memuat data yang diperlukan dari server. Jadi, respons dan pengalaman pengguna yang lebih baik;
  • tergantung pada aplikasi, beberapa pemrosesan yang dilakukan pada klien berarti Anda mengampuni server dari perhitungan tersebut.
  • memiliki fleksibilitas yang lebih baik dalam mengembangkan back-end dan front-end (Anda dapat melakukannya secara terpisah);
  • jika back-end Anda pada dasarnya adalah API, Anda dapat memiliki klien lain di depannya seperti aplikasi Android / iPhone asli;
  • pemisahan mungkin membuat lebih mudah bagi pengembang front-end untuk melakukan CSS / HTML tanpa perlu memiliki aplikasi server yang berjalan di mesin mereka.

Jadi masalahnya adalah bahwa ada kelebihan dan kekurangan untuk kedua pendekatan (SPA vs halaman server). Luangkan waktu untuk meneliti kedua opsi dan kemudian pilih berdasarkan situasi Anda.

Bogdan
sumber
11
"Keamanan lebih sulit dilakukan ketika semua kode ada pada klien;" ehm, bukankah keuntungan besar sebaliknya, keamanan lebih mudah dilakukan, karena ini adalah lapisan yang sangat jelas yang harus Anda lindungi yang dirancang secara logis dan mudah dipahami.
David Mulder
3
@ Davidvidul: dengan keamanan lapisan yang jelas lebih sulit untuk dilakukan sama sekali, tetapi lebih mudah dilakukan dengan benar. Tanpa pembagian yang jelas Anda dapat menyiapkan sesuatu yang masuk akal tetapi salah dalam waktu singkat ;-)
Steve Jessop
1

Jawaban atas pertanyaan Anda sederhana. Iya nih. Apa yang Anda usulkan adalah pendekatan yang masuk akal . Tapi kemudian, yang saya pikir ingin Anda tanyakan adalah apakah ini pendekatan yang lebih baik , dan sayangnya, tidak ada dari kita yang bisa menjawabnya untuk Anda. Faktor-faktor yang terlibat mencakup terlalu banyak aspek yang tanpa membocorkan segalanya tentang organisasi Anda dan persyaratan produk, tidak ada kesimpulan nyata yang dapat dibuat. Saya pikir Anda sudah tahu apa yang harus dilakukan.

samazi
sumber
0

Normal dengan peringatan.

kerangka kerja javascript front end terbatas pada apa yang dapat mereka lakukan. Jika Anda membuat apis mentah untuk digunakan oleh banyak aplikasi, mereka biasanya memerlukan pemrosesan sisi server dari panggilan api mentah menjadi model tampilan yang berfungsi dengan aplikasi tertentu.

Maka arsitektur 'normal' mungkin:

database
business logic services (dll)
api exposing business logic
server side website exposing viewmodels and functionality via json rest endpoints
client side javascript implementing ui

Sekarang jika Anda hanya memiliki satu aplikasi web, Anda dapat memotong lapisan 'api mengekspos logika bisnis' dan hanya memiliki kode web sisi server memanggil logika bisnis secara langsung.

Karena Anda telah memisahkan logika bisnis ke perpustakaannya sendiri, itu masih dipisahkan dari logika ui dan Anda selalu dapat menambahkan lapisan layanan nanti.

Demikian pula, karena layanan api dipanggil oleh kode sisi server, Anda tidak dibatasi komunikasi http. (Meskipun ini cukup universal sekarang)

Selain itu, memiliki panggilan javascript host yang sama yang dilayani dari berarti Anda tidak perlu bercanda dengan cors

Ewan
sumber