Düzenle | Xiyan
Üretildi | AI Teknolojisi Ana Kampı (ID: rgznai100)
20 Kasım'da Baidu'nun trilyon trafik yönlendirme motoru BFE, GitHub Trending Top 3'te listelendi ve bugün Star 270'i geçti. Aslında, 2019 Bahar Şenliği Galasında kırmızı zarf kapmaya direnen yönlendirme motoru, 2019 yazında GitHub'da açık kaynaklı hale geldi ve bugün aniden tekrar tetiklendi. Dikkat , O halde bu projeyi de gözden geçirebiliriz.
Önce GitHub açık kaynak adresini sunun: https: // github .com / baidu / bfe, Apache 2.0 lisansı.
BFE (Baidu Ön Ucu), Baidunun Bir yedi Katmanlı trafik yönlendirme platformu. BFE platformu şu anda Baidu'nun ürünlerinin çoğunu kapsıyor, günlük yönlendirme talepleri 1 trilyona yaklaşıyor ve en yüksek QPS 10 milyonu aşıyor. 2019 Baidu Bahar Festivali Gala kırmızı zarf etkinliğinde, BFE platformu süper kullanıcı baskısı ve birkaç trafik zirvesi altında sorunsuz bir şekilde çalışarak Bahar Festivali Gala kırmızı zarf etkinliğinin sorunsuz ilerlemesini sağladı.
Kapsamlı bir trafik yönlendirme platformu olarak ifşa edilen bilgilerden, BFE platformunun ana hizmetleri dört ana alanı içerir:
Trafik erişimi ve iletimi: HTTP, HTTPS, HTTP / 2, QUIC ve diğer protokolleri destekler ve güçlü uygulama katmanı yönlendirme yeteneklerini destekler
Global trafik planlama: harici ağ trafiği planlama ve intranet trafiği planlamadan oluşan global trafik planlama sistemini destekler
Güvenlik ve saldırı önleme: kara liste engelleme, ince akım sınırlaması ve uygulama katmanı güvenlik duvarı (WAF) gibi birden çok saldırı önleme özelliğini destekler
Gerçek zamanlı veri analizi: dakika düzeyinde ultra yüksek boyutlu zaman serisi raporlarını destekler
BFE platformunun temel bir bileşeni olan BFE yönlendirme motoru, 2012'den beri geliştirildi ve Go dili kullanılarak 2014'te yeniden düzenlendi.
BFE şu anda açık kaynaklıdır ve aşağıdaki önemli yetenekleri destekler:
1. Ana akım ağ protokol erişimi
Destek HTTP / HTTPS / SPDY / HTTP2 / WebSocket vb.
TLS / HTTP / WebSocket ters proxy modunu destekleyin
2. Genişletilebilir eklenti çerçevesi
Genişletilebilir eklenti çerçevesi aracılığıyla, işletme özelleştirme ihtiyaçlarını karşılamak için uzantı modüllerini hızla özelleştirin ve geliştirin
Yeniden yazma, yeniden yönlendirme, trafik değişikliği ve engelleme gibi yerleşik zengin eklentiler
3. Talep edilen içeriğe göre yönlendirme
Karmaşık iş senaryolarında özelleştirilmiş trafik iletimini karşılamak için etki alanına özel dillere dayalı dağıtılmış kurallar
İstek içeriğine (URI / Header / Cookie, vb.) Ve talep bağlamına (IP, protokol, etiket, zaman, vb.) Dayalı koşul temelleri dahil olmak üzere eksiksiz bir boşaltma koşulu ilkelleri setini destekler.
4. Esnek yük dengeleme stratejisi
Birden çok erişilebilirlik bölgesinde olağanüstü durumdan kurtarma ve aşırı yük koruması elde etmek için küme düzeyinde yük dengeleme ve bulut sunucusu düzeyinde yük dengelemeyi destekleyin
IP veya istek içeriğine dayalı, oturumu bekletmeyi başarmak için kullanıcıları tanımlayan yerleşik ağırlıklı döngüsel, ağırlıklı minimum bağlantı sayısı stratejisi
BFE'yi Go diliyle yeniden düzenlemek, Baidu ekibi tarafından C, Python ve Go ile karşılaştırıldıktan sonra yapılan seçimdir. Önceki ikisi ile karşılaştırıldığında, Go aşağıdaki özelliklere sahiptir:
C'ye yakın performans
Eşzamanlılık
Rutine gidin: CPU kaynaklarından tam olarak yararlanmak için temel mekanizmayı koruyun
Çok iş parçacıklı mod: düşünmesi kolay
Geliştirme verimliliği
Tanımlama yeteneği Python'a benzer
Zengin kitaplık (sistem kitaplığı, üçüncü taraf kitaplığı)
Büyük programların organizasyonu
paket
Veri erişim kısıtlamaları (ilk harfin durumu arasındaki fark)
Test edilebilir yetenek
Dahili tek taraflı ve kapsam denetim araçları, kolay TDD
teste git
Hata kontrol yeteneği
Sıkı derleme aşaması kontrolleri: güçlü yazma, dosya dahil etme, ...
Panik, sorunları bulmak kolay
Canlı yayına geç ve operasyon
Bağımsız bir yürütülebilir programda derlenebilir
Go dilini temel aldığından ve endüstride yaygın olarak kullanılan Nginx açık kaynak yazılımıyla karşılaştırıldığında, BFE'nin öğrenme maliyetleri, geliştirme maliyetleri ve performans açısından avantajları vardır:
Yüksek araştırma ve geliştirme verimliliği: Go dilinin geliştirme verimliliği C dilinden (ve Lua'dan) çok daha yüksektir ve ayrıca kod sürdürülebilirliği açısından da büyük bir avantaja sahiptir.
Sistemin yüksek güvenlik ve kararlılığı vardır: Go dili, C dilinin doğasında bulunan arabellek taşmasının gizli tehlikelerine sahip değildir ve çok sayıda kararlılık ve güvenlik riskini önler; ayrıca, programın yinelemeli olarak başlatıldığında bile çökmemesini sağlamak için istisnalar yakalanabilir.
Uzun vadeli bir trendden, yüksek seviyeli programlama dillerine dayalı yazılım sistemleri kademeli olarak rekabet avantajı kazanacaktır. CPU'lar gibi donanım kaynaklarının fiyatı hızla düşmeye devam edecek ve geliştirme insan gücü maliyetleri, proje geliştirme riskleri ve sistem kararlılığı / güvenliği daha önemli karar verme konuları haline gelecektir. Bu açıdan bakıldığında, esas olarak C diline dayalı olan Nginx, kademeli olarak azalırken, BFE gibi daha yüksek seviyeli programlama dillerine dayalı yazılımlar yavaş yavaş ana akım haline gelecektir.
Ek olarak, BFE tasarımında, kurumsal düzeyde uygulama senaryolarının dikkate alınması özel olarak eklenmiştir:
Yönlendirme senaryoları için doğrudan destek: Web Sunucusundan Proxy'ye dönüşen Nginx'in evrimsel yolunun aksine, BFE doğrudan senaryoları iletmek için tasarlanmıştır ve yönlendirme modeli ve yönlendirme yapılandırması açısından yönlendirme senaryolarının ihtiyaçlarını daha iyi karşılayabilir.
Çoklu kiracı desteği: Bulut bilişim senaryosunda, çok kiracılı yeniden kullanım yaygın bir gerekliliktir. BFE'nin tasarımında, çok kiracılı destek yerleşiktir
Yapılandırılmış yapılandırma: BFE yapılandırma tasarımı, ilgili yapılandırma yönetim sistemleriyle bağlantı kurmak için uygun olan JSON gibi çok sayıda yapılandırılmış yöntem kullanır
Bol izleme probları: Endüstriyel düzeyde bir yazılım olarak, çevrimiçi izleme gereksinimleri, BFE'nin tasarımında tamamen dikkate alınmıştır.BFE programı, HTTP aracılığıyla binlerce dahili durum değişkenini ortaya çıkarır.
Daha sonra, kısaca BFE'nin belirli adımlarını ve teknik ayrıntılarını tanıtacağım, ancak alan sınırlıdır.Proje hakkında daha ayrıntılı bilgi için lütfen https: // github'a bakın .com / baidu / bfe
golang 1.12+
Golang yacc
git
BFE kodu aşağıdaki depoda bulunabilir:
https: // github .com / baidu / bfe
Ana BFE deposunu klonlayın:
Kaynak koddan oluştur
Bfe'de (src / github .com / baidu / bfe) derleme komut dosyasını kaynak dizinde çalıştırmak için:
Testi çalıştırın:
BFE ikili dosyası aşağıdaki gibi oluşturulur:
Çalıştırmak
Bfe'yi örnek yapılandırmayla çalıştırın: conf
Kümeler arasında yönlendirme isteyin
BFE konfigürasyonunda, "ürün" birden fazla kümeden oluşabilir. Kullanıcılar, istekleri kümeler arasında nasıl yönlendireceklerini tanımlayabilir. İstek yönlendirme, HTTP isteğinin içeriğine bağlıdır.
Kural yapılandırması
HTTP başlığındaki alanlar, trafiği küme düzeyinde dağıtmak için yönlendirme kurallarını tanımlamak için kullanılır, örneğin:
Ana bilgisayar, yol, sorgu, çerez, yöntem vb.
BFE, özel başlıklar kullanarak mesajların nasıl yönlendirileceğini tanımlamak için bir "koşul" ifadesi sağlar. Bu, küme düzeyinde yük dengelemede yönlendirme kuralıdır.
Birden fazla kural yapılandırılırsa, BFE bu kuralları sırayla eşleştirir. Bir kural eşleşirse, eşleştirme işlemi durur.
misal
Bir ürün "demosunun" üç tür trafiği işlemesi gerekir: statik içerik trafiği, "post" trafiği ve diğer trafik. Buna dayanarak, üç küme tanımlayabiliriz:
Statik sunum: Statik içerik sağlayın
demo-gönderi: mesaj gönder
demo-main: diğer trafiğe hizmet etme
BFE yapılandırmasında, aşağıdaki yönlendirme kurallarını ekleyebilirsiniz:
Kural 1: req_path_prefix_in ("/ statik", yanlış) - > demo-statik, yani "/ statik" yol önekine sahip mesajların demo-statik kümeye yönlendirileceği anlamına gelir.
Kural 2: req_method_in ("POST") req_path_prefix_in ("/ setting", false) - > demo-post, yani "POST" yöntemini kullanan ve önünde "/ setting" bulunan mesajların "demo-post" kümesine yönlendirileceği anlamına gelir.
Kural 3: Varsayılan- > demo-main, yani yukarıdaki kurallara uymayan tüm mesajlar "demo-main" kümesine gönderilecektir.
Alt küme düzeyinde, yük dengeleme kuralları da yapılandırılabilir. Kural, her bir alt kümeye atanan trafik ağırlığını tanımlar.
Trafiği atmak için özel bir sanal alt küme "BLACKHOLE" kullanılabilir.
misal
Aşağıdaki yapılandırmayı düşünün:
İki IDC: IDC1, IDC2
İki BFE kümesi: BFE1, BFE2
İki arka terminal kümesi: alt küme-1, alt küme-2
BFE kümesinde (BFE1 ve BFE2):
BFE1: {alt küme-1: w11, alt küme-2: w12, Kara delik: w1B}
BFE2: {alt küme-1: w21, alt küme-2: w22, Kara delik: w2B}
Yapılandırılan ağırlığa göre BFE, trafiği arka terminal kümesine dağıtır.
Örneğin, ağırlık yapılandırması {w11, w12, w1B} = {45, 45, 10} ise, alt kümeye gelen trafik yüzdesi alt küme-1, alt küme-2 ve Kara delik% 45,% 45 ve % 10.
Genellikle, bir alt küme birden çok örnekten oluşur. Alt kümelerde, mesajları örnekler arasında dağıtmak için WRR (Weighted Round Robin) kullanılır.
Örneklere kapasitelerine göre farklı ağırlıklar atanabilir.
BFE, her arka uç örneğinde durum kontrolleri gerçekleştirir. Örnek aşağıdaki iki duruma sahiptir:
Normal durum: Örnek, iletileri normal şekilde işler.
Durum kontrol ediliyor: Örnek anormal ve mesaj işlenemiyor. Bu durumda, BFE düzenli sağlık kontrolleri yapacaktır.
Devlet geçişi:
Aşağıdaki koşullarda normal olarak kontrol edin:
Örneğe bağlanırken veya mesaj gönderirken sürekli hatalar eşiği aştı.
Aşağıdaki koşullar altında normaldir:
BFE, arka uç bulut sunucusundan doğru durum denetimi isteği yanıtını alır.
Mesaj yeniden denenemedi
Mesaj yönlendirme başarısız olursa, BFE mesajı iki seviyede yeniden denemeyi destekler:
Aynı alt küme içindeki iletileri yeniden yönlendirin.
İletileri diğer alt kümelere yeniden yönlendirin.
bağlantı havuzu
BFE ve arka uç örneği arasında TCP bağlantı desteği:
Kısa süreli bağlantı: BFE, her istek mesajını arka uç sunucuya yönlendirmek için yeni kurulan TCP bağlantısını kullanır.
bağlantı havuzu:
BFE, örneğe olan bağlantı havuzunu korur.
Gelen talep için:
Mevcut bir bağlantı varsa, lütfen yeniden kullanın.
Aksi takdirde yeni bir TCP bağlantısı kurulur.
Bağlantı üzerinden talep işlemeyi tamamladıktan sonra:
Bağlantı havuzunun geçerli boyutu yapılandırılan sayıdan küçükse, bağlantı havuza eklenir.
Aksi takdirde, bağlantıyı doğrudan kapatın.
Oturum yapışkanlığı
BFE, istek mesajının aşağıdaki tanımlamasına dayalı olarak oturum yapışkanlığını destekler:
Kaynak IP
İstek başlıklarındaki, çerezlerdeki vb. Alanlar
Oturumları farklı yönlendirme seviyelerinde tutun:
Alt küme seviyesi: oturumun mesajları aynı alt kümeye gönderilir (bu alt kümedeki örnekler farklı olabilir).
Örnek seviyesi: Oturum mesajları aynı örneğe gönderilir.
BFE, BFE örneğinin erişim izleme bağlantı noktası aracılığıyla elde edilebilen çok sayıda yerleşik göstergeyi destekler.
BFE yapılandırma dosyasında, izleme bağlantı noktasını ayarlayın:
monitorPort = < Liman >
adres
Çalışan BFE örneğinden tam bir gösterge listesi almak için aşağıdaki URL'yi ziyaret edin:
http: // < ip a gg r > : < Liman > / monitor
Projenin sayısız konusu altında, birinin BFE'nin şu anda yalnızca Linux'u desteklediği sorununu gündeme getirdiğini belirtmek gerekir.Projeye katkıda bulunanlar, ileride Windows'u destekleyeceklerini söyleyerek yanıt verdiler.
Son