Mari kita coba menulis pelatihan kecil, tetapi sistem informasi yang cukup lengkap yang terdiri dari bagian server di Go dan aplikasi web klien di Javascript + Vue JS.
Pertama, beberapa kata tentang apa aplikasi ini dan untuk apa. Beberapa waktu yang lalu, muncul pertanyaan di depan saya tentang bagaimana cara menyimpan sejumlah uang yang telah saya bentuk. Bahkan bagi saya, seseorang yang jauh dari dunia keuangan, jelas bahwa memegang uang tunai itu buruk karena setidaknya dua alasan:
- Uang memakan inflasi (risiko inflasi)
- Rubel dapat terdepresiasi (risiko nilai tukar)
Diputuskan untuk mempelajari masalah ini dan memilih alat investasi yang sesuai. Kriteria utama adalah keandalan dan perlindungan tabungan dari risiko di atas.
Saya mempelajari masalah ini dan sebagai hasilnya sampai pada kesimpulan bahwa satu-satunya alat investasi yang memadai untuk Rusia adalah dana perdagangan bursa (ETF), dan yang diperdagangkan di Bursa Moskow.
Jadi, saya mengusulkan untuk menulis aplikasi pelatihan yang akan menunjukkan keuntungan semua ETF yang disajikan di Bursa Moskow.
Anda dapat mengatakan bahwa keuntungan ini dapat dilihat di situs web pertukaran itu sendiri, dan aplikasi, setidaknya untuk pelatihan, harus agak bermanfaat. Saya setuju, oleh karena itu, kami akan mencoba menampilkan beberapa pengembalian stok riil bersyarat. Dengan pengembalian riil bersyarat ini, maksud saya tingkat pengembalian disesuaikan dengan inflasi di Rusia.
Pada bagian pertama artikel kami akan menganalisis bagian server dari aplikasi. Backend kami ditulis dalam Go dan selama pengembangan kami akan mencoba menerapkan fitur bahasa seperti eksekusi kode paralel, antarmuka, pengujian dan banyak lagi.
Persyaratan TK:
- Bagian server dari aplikasi harus menyediakan, berdasarkan permintaan, data tentang harga untuk semua ETF Exchange Moskow dan data inflasi untuk semua bulan perdagangan untuk setiap keamanan
- Bagian server dari aplikasi harus mendukung beberapa penyedia data warehouse, berpindah antar provider tidak memerlukan perubahan kode
- Bagian server dari aplikasi harus menyediakan API melalui protokol http untuk menerima data dari penyimpanan
Jadi, mari kita rancang arsitektur perangkat lunak bagian server dari sistem kita.
Pertama , kami akan datang dengan struktur paket aplikasi. Menurut pernyataan kerja, aplikasi akan terdiri dari server web yang akan menyediakan REST API dan memberikan file aplikasi web kami (nanti kami akan menulis SPA pada Vue). Selain itu, menurut ToR, kita harus membuat beberapa paket untuk penyedia data warehouse.
Pada titik ini, kita harus lebih detail. Bagaimana saya bisa menyediakan kemampuan untuk beralih di antara penyedia beberapa fungsionalitas di Go? Jawab: menggunakan antarmuka. Jadi, kita perlu mengembangkan antarmuka (kontrak) untuk paket, yang masing-masing akan menjalankan kontrak untuk jenis penyimpanannya sendiri. Dalam artikel ini, kami akan mempertimbangkan untuk menyimpan data dalam RAM, tetapi dengan analogi, Anda dapat dengan mudah menambahkan DBMS. Struktur paket akhir adalah sebagai berikut:
Kedua , mari kita putuskan jenis data di mana kita akan menyimpan informasi yang diterima, dan kontrak untuk penyedia penyimpanan.
Kami akan membutuhkan tipe data untuk kuotasi saham dan inflasi. Kami akan mengambil kuotasi dan inflasi per bulan, skala ini cukup cocok untuk instrumen non-spekulatif seperti ETF.
Kontrak akan memerlukan ketersediaan metode untuk mengisi penyimpanan dengan data dari server Mosbirzha (inisialisasi) dan menyediakan data kutipan berdasarkan permintaan. Semuanya sangat sederhana.
Sebagai hasilnya, kami menempatkan jenis untuk menyimpan kutipan dan antarmuka dalam modul penyimpanan:
Untuk mempermudah, kami memberi kode data inflasi di modul server:
var inflation = []struct { Year int Values [12]float64 }{ { Year: 2013, Values: [12]float64{0.97, 0.56, 0.34, 0.51, 0.66, 0.42, 0.82, 0.14, 0.21, 0.57, 0.56, 0.51}, }, { Year: 2014, Values: [12]float64{0.59, 0.70, 1.02, 0.90, 0.90, 0.62, 0.49, 0.24, 0.65, 0.82, 1.28, 2.62}, }, { Year: 2015, Values: [12]float64{3.85, 2.22, 1.21, 0.46, 0.35, 0.19, 0.80, 0.35, 0.57, 0.74, 0.75, 0.77}, }, { Year: 2016, Values: [12]float64{0.96, 0.63, 0.46, 0.44, 0.41, 0.36, 0.54, 0.01, 0.17, 0.43, 0.44, 0.40}, }, { Year: 2017, Values: [12]float64{0.62, 0.22, 0.13, 0.33, 0.37, 0.61, 0.07, -0.54, -0.15, 0.20, 0.22, 0.42}, }, { Year: 2018, Values: [12]float64{0.31, 0.21, 0.29, 0.38, 0.38, 0.49, 0.27, 0.01, 0.16, 0.35, 0.50, 0.84}, }, }
Ketiga , mari kita uraikan titik akhir API kami. Hanya akan ada dua: untuk kutipan dan inflasi. Hanya metode HTTP GET.
Sebenarnya, penerimaan dan pemrosesan data dari situs web Mosbirzi dilakukan dalam metode inisialisasi. Kami mengambil data sesuai dengan
bantuan pada API pertukaran .
Yang harus Anda perhatikan: kami dipaksa untuk menggunakan permintaan terpisah untuk setiap keamanan (dan sudah ada beberapa dari mereka). Menjalankan inisialisasi data secara berurutan, dalam satu utas, akan membutuhkan banyak waktu. Karena itu, kami akan menggunakan kebanggaan Go - goroutine. Perhatikan bagian kode berikut:
Dalam fungsi inisialisasi data, kami memparalelkan permintaan ke server. Dalam praktiknya, penguraian situs tersebut memiliki sejumlah masalah:
- Dapat menyebabkan pemblokiran permintaan secara otomatis karena dugaan DoS
- Anda harus menggunakan modul konteks atau saluran kontrol untuk memaksa goroutin berakhir.
- Anda perlu menggunakan saluran untuk mengembalikan kesalahan dari goroutine
Untuk mempermudah, semua poin ini dihilangkan.
Untuk keperluan kurikulum, router permintaan HTTP bawaan sudah cukup bagi kami. Pada sistem yang lebih kompleks, Anda mungkin ingin menggunakan yang lain. Secara pribadi, saya menggunakan router dari proyek Gorilla, tetapi secara umum ada banyak dari mereka.
Selanjutnya, kami akan menambahkan titik untuk mengunggah file aplikasi web kami. Ke depan, saya akan mengatakan bahwa untuk ini Anda cukup menggunakan pengembalian konten file.
Jadi mari kita tulis server kami:
Saya tidak akan memberikan kode implementasi penyimpanan di memori di sini, semuanya tersedia di
Github .
Untuk menguji API kami:
inflasikutipanIni melengkapi bagian pertama artikel. Pada bagian kedua, kami akan menulis tes dan pengukuran kinerja untuk paket kami. Pada bagian ketiga, kami akan mengembangkan aplikasi web.