Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan OpenResty untuk melaksanakan gerbang API berprestasi tinggi dalam Beego

Menggunakan OpenResty untuk melaksanakan gerbang API berprestasi tinggi dalam Beego

王林
王林asal
2023-06-23 09:20:53865semak imbas

Sebagai rangka kerja aplikasi web, Beego telah pun mendapat reputasi tertentu dalam kalangan bahasa Go. Ia menyediakan penghalaan HTTP yang kaya, pengelogan, ORM dan fungsi lain, menjadikannya lebih mudah untuk membangunkan aplikasi web. Jadi, jika kita ingin melaksanakan gerbang API berprestasi tinggi, bolehkah kita menggunakan Beego untuk mencapainya? Jawapannya ya. Artikel ini akan memperkenalkan cara menggunakan OpenResty untuk melaksanakan get laluan API berprestasi tinggi dalam Beego.

Apakah itu get laluan API?

Gerbang API ialah lapisan perantaraan yang terletak di antara port perkhidmatan dan klien Ia digunakan untuk menyambungkan berbilang perkhidmatan bahagian belakang dan menyediakan antara muka API yang mudah kepada dunia luar. Dalam seni bina perkhidmatan mikro, disebabkan bilangan perkhidmatan yang banyak dan protokol perkhidmatan yang tidak konsisten, kami sering memerlukan get laluan API untuk memajukan dan menukar perkhidmatan yang berbeza.

Apabila melaksanakan get laluan API, kita perlu mempertimbangkan tiga aspek berikut:

  1. Sokongan protokol berbilang. Perkhidmatan backend mungkin menggunakan protokol yang berbeza, seperti HTTP, WebSocket, gRPC, dll. Gerbang API perlu menyokong protokol ini dan dapat menukarnya menjadi antara muka API bersatu.
  2. Pengimbangan beban dan toleransi kesalahan. Gerbang API perlu melaksanakan mekanisme pengimbangan beban dan toleransi kesalahan untuk memastikan ketersediaan tinggi dan prestasi tinggi perkhidmatan bahagian belakang.
  3. Pertimbangan keselamatan. Gerbang API perlu menyediakan ciri keselamatan seperti kebenaran, pengesahan dan kawalan akses untuk memastikan kebolehpercayaan dan keselamatan perkhidmatan bahagian belakang.

Pengenalan kepada OpenResty

OpenResty ialah pelayan aplikasi web berdasarkan Nginx, dibangunkan oleh pengaturcara China Zhang Yichun. Ia memanjangkan Nginx untuk menyokong bahasa skrip Lua, membolehkan pengembangan dinamik berprestasi tinggi. OpenResty dicirikan oleh prestasi tingginya Ia mencapai keselarasan tinggi dan kependaman rendah dengan menyimpan sumber statik dalam memori dan menggunakan teknologi seperti coroutine.

Dalam artikel ini, kami akan menggunakan OpenResty sebagai komponen teras get laluan API, dan Beego untuk melaksanakan penghalaan dan logik kawalan untuk mengurus perkhidmatan bahagian belakang. Ini mempunyai dua faedah: Pertama, anda boleh menggunakan sepenuhnya ciri berprestasi tinggi OpenResty untuk meningkatkan kelajuan tindak balas dan keselarasan get laluan API kedua, anda boleh menggunakan Beego untuk mengurus penghalaan dan konfigurasi perkhidmatan bahagian belakang; mengurangkan kerumitan pembangunan Anda juga boleh memanfaatkan fungsi penghalaan dan pengawal Beego sendiri.

Gunakan OpenResty untuk melaksanakan get laluan API dalam Beego

Pasang OpenResty

Sebelum mula menggunakan OpenResty, kami perlu memasang OpenResty dan pakej perisian yang berkaitan dengannya. OpenResty secara rasmi menyediakan banyak pakej pemasangan binari untuk platform yang berbeza, yang boleh dimuat turun dan dipasang di laman web rasminya. Jika anda menggunakan Ubuntu/Debian, anda boleh menggunakan arahan berikut untuk memasang:

$ sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential
$ wget https://openresty.org/download/openresty-1.19.3.2.tar.gz
$ tar -xzvf openresty-1.19.3.2.tar.gz
$ cd openresty-1.19.3.2
$ ./configure --with-http_realip_module --with-http_stub_status_module --with-luajit --prefix=/usr/local/openresty
$ make && sudo make install

Selepas pemasangan selesai, kita perlu menambah laluan fail binari OpenResty kepada pembolehubah persekitaran PATH sistem supaya ia boleh dipasang pada baris arahan Menggunakan komponen OpenResty secara langsung seperti nginx.

$ export PATH=$PATH:/usr/local/openresty/nginx/sbin

Melaksanakan penghalaan OpenResty

Untuk menggunakan OpenResty dalam Beego, anda perlu menyepadukan penghalaan OpenResty dan penghalaan Beego. Khususnya, konfigurasi penghalaan Beego semuanya dikendalikan oleh OpenResty, dan Beego hanya perlu menyediakan pengawal yang sepadan dengan penghalaan. Dalam proses ini, kita perlu menggunakan skrip Lua OpenResty untuk melaksanakan pengedaran laluan.

Berikut ialah pelaksanaan penghalaan OpenResty yang mudah:

location /api/ {
    content_by_lua_block {
        local args = ngx.req.get_uri_args()
        if args['service'] == 'user' then
            ngx.exec('/user' .. ngx.var.request_uri)
        elseif args['service'] == 'order' then
            ngx.exec('/order' .. ngx.var.request_uri)
        else
            ngx.say('Unknown service')
            ngx.exit(400)
        end
    }
}

Dalam kod di atas, kami menentukan laluan dengan awalan URL /api/ melalui konfigurasi lokasi Laluan ini akan memajukan permintaan ke Perkhidmatan khusus. Peraturan pemajuan khusus bergantung pada parameter service dalam permintaan Kami boleh memilih perkhidmatan yang berbeza berdasarkan nilai parameter yang berbeza untuk mencapai pengedaran laluan.

Untuk OpenResty melaksanakan skrip Lua yang serupa dengan yang di atas, kita perlu menyimpan fail skrip ini dalam direktori yang ditentukan dan mengkonfigurasi laluan skrip Lua dalam nginx.conf:

lua_package_path "/etc/nginx/conf.d/lua/?.lua;;";

nota yang diperlukan kerana kami menggunakan ngx.exec untuk melaksanakan pemajuan perkhidmatan sebenar, kami perlu menentukan laluan yang lebih khusus dalam kod perkhidmatan yang sepadan supaya OpenResty boleh memadankan dan memajukan dengan betul. Sebagai contoh, kita boleh menentukan /user dan /order sebagai awalan penghalaan khusus, dan kemudian menggunakan ngx.exec dalam konfigurasi penghalaan untuk pemajuan, seperti berikut:

location /user/ {
    content_by_lua_block {
        ngx.exec('@user_service')
    }
}

location /order/ {
    content_by_lua_block {
        ngx.exec('@order_service')
    }
}

Di sini, @user_service dan @order_service Kesemuanya menunjukkan lokasi Nginx bagi perkhidmatan tertentu Takrifan mereka adalah serupa dengan yang berikut:

location @user_service {
    proxy_pass http://127.0.0.1:8080;
    # ...
}

location @order_service {
    proxy_pass http://127.0.0.1:8081;
    # ...
}

Dengan cara ini, kami telah melaksanakan penghalaan dan pemajuan yang mudah. Walau bagaimanapun, ini hanya sebahagian kecil daripada fungsi OpenResty Ia juga mempunyai banyak fungsi dan ciri yang berkuasa, seperti caching, proksi terbalik, pengehadan semasa, dll. Dalam pembangunan gerbang API sebenar, kita boleh memilih ciri yang sesuai untuk digunakan mengikut keperluan khusus.

Melaksanakan pengawal Beego

Selain penghalaan OpenResty, kami juga perlu melaksanakan pengawal dan logik perniagaan dalam Beego. Di sini, kita boleh mencapai pemuatan dinamik skrip Lua dengan menggunakan fungsi http.ServeFile terbina dalam Beego dalam pengawal untuk memuatkan skrip Lua yang ditentukan.

Berikut ialah contoh pengawal mudah:

import (
    "strings"
    "github.com/astaxie/beego"
)

type ApiController struct {
    beego.Controller
}

func (this *ApiController) Handle() {
    uri := this.Ctx.Request.RequestURI
    scriptPath := "/etc/nginx/conf.d/lua" + strings.TrimSuffix(uri, ".lua") + ".lua"
    this.Ctx.Output.ServeFile(scriptPath)
}

在上述代码中,我们首先获取请求的URI,然后根据URI构造出对应的Lua脚本路径,并调用http.ServeFile函数将脚本内容返回给OpenResty,从而实现动态加载脚本的目的。需要注意的是,我们需要对请求的后缀进行进一步处理,将.lua后缀去掉,并在路径中添加相应的前缀,才能正确地加载脚本文件。

总结

在本文中,我们介绍了如何在Beego中使用OpenResty实现高性能API网关。通过整合Beego和OpenResty的特性,我们实现了分布式路由、负载均衡和容错等核心功能,并为了实现安全性考虑,提供了授权、认证、访问控制等安全特性。在实际应用中,API网关还需要考虑缓存、反向代理、限流等特性,我们需要根据实际需要进行选取。

总的来说,Beego和OpenResty都是非常优秀的Web应用框架,它们的优势互补,可以帮助我们快速构建高性能和高可靠的Web应用。如果你还没有尝试过使用这两个框架,不妨想一想如何将它们应用到自己的项目中,相信会为你带来不少启示。

Atas ialah kandungan terperinci Menggunakan OpenResty untuk melaksanakan gerbang API berprestasi tinggi dalam Beego. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn