Günlük blog"Bir tekerlek inşa et" - ağustosböceği (hafif WEB çerçevesi)

Açık kaynaklı Çin OSC manşetlerine dikkat edin ve en son teknik bilgileri alın

önsöz

"Tekerleği yeniden icat etmeyin" denildiği gibi, gerekli olup olmadığını tartışmaya gerek yok.

Bu projeyi oluşturmanın temel amacı kendinizi geliştirmek, bilinen açık kaynak projeleriyle olan açığı görmek ve mükemmel açık kaynak yöntemlerini öğrenmektir.

Şimdi ağustosböceği projesinin temel işlevlerine odaklanalım.

Bunu hızlı, hafif bir WEB çerçevesi olarak tanımlıyorum; çok fazla bağımlılık olmadan, çekirdek kavanoz paketi sadece 30KB'dir.

Ayrıca bir HTTP hizmetini başlatmak için yalnızca bir kod satırı gerekir.

karakteristik

Şimdi birkaç önemli özellikten bahsedelim.

Mevcut sürüm temel olarak temel istek, yanıt, özel parametreler ve önleme işlevlerini uygular.

Birkaç işlevi olmasına rağmen, tüm iç organlara sahiptir.

Gelecekteki yineleme sürecinde, yukarıdaki işlev kademeli olarak geliştirilecektir.İyi bir fikriniz varsa, https://github.com/crossoverJie/cicada/issues gönderebilirsiniz.

Hızlı başlangıç

Şimdi bir HTTP hizmetinin nasıl hızlı bir şekilde başlatılacağına bir göz atalım.

Sadece bir Maven projesi oluşturun ve çekirdek paketi içe aktarın.

< bağımlılık > < Grup kimliği > top.crossoverjie.opensource < /Grup kimliği > < yapı kimliği > ağustosböceği çekirdeği < /artifactId > < versiyon > 1.0.0 < /sürüm > < /bağımlılık >

Yukarıdaki şekilde gösterildiği gibi, başka bir başlangıç sınıfı yapılandırın.

genel sınıf MainStart { public static void main(String args) InterruptedException { öğesini atar CicadaServer.start(MainStart.class,"/cicada-example"); } }

İş eylemlerini yapılandırın

Elbette iş mantığını uygulayacak bir yere de ihtiyacımız var. ağustosböceği bir arabirim sağlar, yalnızca belirli mantığı uygulamak için arabirimi uygulamanız gerekir.

top.crossoverjie.cicada.server.action.WorkAction arabirimini uygulamak için bir iş eylemi oluşturun.

@CicadaAction(değer = "demoAction") public class DemoAction, WorkAction'ı uygular { özel statik final Logger LOGGER = LoggerBuilder.getLogger(DemoAction.class) ; özel statik AtomicLong dizini = yeni AtomicLong() ; @Geçersiz kıl kamu çalışmasıRes < DemoResVO > yürütmek(Param paramMap) İstisna { Dize adı = paramMap.getString("isim"); Tamsayı kimliği = paramMap.getInteger("id"); LOGGER.info("isim=,id=" , isim,kimlik); DemoResVO demoResVO = yeni DemoResVO() ; demoResVO.setIndex(index.incrementAndGet()); İş Çözünürlüğü < DemoResVO > res = yeni WorkRes(); res.setCode(StatusEnum.SUCCESS.getCode()); res.setMessage(StatusEnum.SUCCESS.getMessage()); res.setDataBody(demoResVO) ; dönüş res; } }

Aynı zamanda, özel sınıfa @CicadaAction ek açıklamasını eklemeniz ve esas olarak yönlendirme istenirken işletme sınıfını bulmak için bir değer belirtmeniz gerekir.

Uygulamayı bu şekilde başlatın ve erişin

İş mantığını çalıştırabilir ve aynı anda sunucudan geri dönüş alabilirsiniz.

Şu anda, json yanıtı varsayılan olarak desteklenmektedir ve şablon ayrıştırma daha sonra eklenecektir.

İlgili günlükler de hizmette yazdırılır.

Esnek parametre yapılandırması

Buradaki tüm istek parametreleri Param'da kapsüllenmiştir ve istek verilerini elde etmek için çeşitli API'ler kullanılabilir.

Esnek olmanın nedeni: Hatta şöyle de talep edebiliriz:

{ "yaş": 22, "isim": "zhangsan" }

Bu şekilde, iş işleme sırasında ayrıştırıldığı sürece herhangi bir yapıya ait veriler iletilebilir.

özel önleyici

Interceptor, günlük kaydı ve işlem gönderimi gibi ortak görevleri uygulamak için kullanılabilen bir çerçevenin temel işlevidir.

Cicada bunun için bir arayüz sağlar: top.crossoverjie.cicada.server.intercept.CicadaInterceptor.

Engelleme işlevini yazmak için yalnızca bu arabirimi uygulamamız gerekir:

@Interceptor(değer = "executeTimeInterceptor") public class ExecuteTimeInterceptor, CicadaInterceptor'ı uygular { özel statik final Logger LOGGER = LoggerBuilder.getLogger(ExecuteTimeInterceptor.class); özel Uzun başlangıç; özel Uzun uç; @Geçersiz kıl public void Before(Param param) { start = System.currentTimeMillis(); } @Geçersiz kıl public void after(Param param) { bitiş = System.currentTimeMillis(); LOGGER.info("yayın süreleri", bitiş - başlangıç); } }

Buradaki gösteri, tüm eylemlerin yürütme süresini kaydetmektir.

Şu anda, varsayılan olarak yalnızca eylem müdahalesi uygulanmaktadır ve özel önleyiciler daha sonra eklenecektir.

kesişme adaptörü

Durdurucuda önce/sonra yöntemleri sağlanmış olsa da, tüm yöntemlerin uygulanması gerekmez.

Yani ağustosböceği bir adaptör sağlar:

top.crossoverjie.cicada.server.intercept.AbstractCicadaInterceptorAdapter

Aşağıdaki yöntemlerden birini isteğe bağlı olarak uygulamak için ondan miras almamız gerekiyor:

@Interceptor(değer = "loggerInterceptor") public class LoggerInterceptorAbstract, AbstractCicadaInterceptorAdapter'ı genişletir { özel statik final Logger LOGGER = LoggerBuilder.getLogger(LoggerInterceptorAbstract.class) ; @Geçersiz kıl public void Before(Param param) { LOGGER.info("logger param=",param.toString()); } }

Performans testi

Bir HTTP hizmet çerçevesi olduğu için performans doğal olarak garanti edilmelidir.

Test koşulları şunlardır: İki tur için 300 eşzamanlı sürekli basınç testi; 1G bellek, tek çekirdekli CPU, 1Mbps. Jmeter ile basınç ölçümü aşağıdaki gibidir:

Sonuçları görmek için aynı sunucu Tomcat ile test edilir.

Tomcat'in iş parçacığı havuzu yapılandırması:

< Yürütücü adı="tomcatThreadPool" namePrefix="tüketici-yürütme-" maxThreads="510" minSpareThreads="10"/ >

Sonuç, ağustosböceği performansının Tomcat'inkinden daha güçlü olduğu görünse de, burada istediğim şey Tomcat'in bir doc dizini.

Ama aslında bu karşılaştırma sürecindeki değişkenler tam olarak kontrol edilmiyor.Tomcat'in döndürdüğü HTML, cicada'nın ise sadece json döndürdüğü.Tabii ki sorun bundan daha fazlası.

Ama yine de ağustosböceğinin mevcut performansının hala iyi olduğunu gösteriyor.

özetlemek

Bu yazıda cicada'nın uygulama prensibi çok fazla tartışılmamaktadır.Eğer ilgileniyorsanız, nispeten basit olan kaynak koduna bakabilirsiniz.

Bu, sonraki bir güncellemede daha ayrıntılı olarak tartışılacaktır.

Aynı zamanda, ağustosböceğinin güncellenmeye devam etmesi ve gelecekte daha pratik işlevlerin eklenmesi şaşırtıcı değildir.

Ben bile doğru zamanda prodüksiyon projeme uygulayacağım ve umarım daha fazla arkadaş katılıp bu "tekerleği" daha iyi hale getirebilir.

Blogger: crossoverJie

Günlük blog sütunu, her gün sizin için mükemmel blog yazarlarından yüksek kaliteli teknik makaleler önerir. Aynı zamanda, kullanıcılar katkıda bulunabilirler.Makale resmi hesaba eklendiğinde, web sitesinin ana sayfasında ve diğer yerlerde tavsiye edeceğiz. odaklan Açık Kaynak Çin OSC Her gün yüksek kaliteli push bildirimleri almak için " daha fazla bilgi edin " proje adresini görüntülemek için.

Moe, kadın biletleri için dijital hediyelerden oluşan bir koleksiyondan bahsetmedin
önceki
Tobacco Corporation'ın bağlı şirketi listelendi, ne kadar karlı?
Sonraki
Yatırım istatistikleri: Çin'in tarım sektörü VC / PE finansmanı ilk çeyrekte Waterloo ile karşılaşıyor
Gişe paramparça oldu ve itibar paramparça oldu! Bu Yeni Yıl Günü, Tang Wei ve Ge You'nun filmleri şöyle ...
Yatırım istatistikleri: Tüketici ve hizmet sektörü finansmanı ilk çeyrekte toparlandı ve halka arz sayısı istikrarlı bir şekilde hızlandı
Wuhan'dan bir şef Antarktika'da pirinç şarabı yapmak için tofu öğütüyor ve fasulye filizi filizlendiriyor ve birçok ülkeden bilimsel araştırma ekiplerinin ilgisini çekiyor.
Yatırım istatistikleri: 131 şirket, ilk çeyrekte 497.946 milyar yuan artışla sabit artışı tamamladı
Güzel ya da değil! Meizu 15 resmen Sanayi ve Bilgi Teknolojileri Bakanlığı'na girdi: tam ekran olmayan + ön parmak izi + metal çekme işlemi
Günlük Bo Bo Redis Hash yapı bellek modeli analizinin analizi
Yatırım istatistikleri: NEEQ finansmanı ilk çeyrekte yükseldi ve ani artışlar
Sebze yetiştirmeyi, pişirmeyi, kaligrafi yapmayı öğrenin ... bu toplum eğitim koleji sakinlere ücretsiz ders veriyor
Stephen Chow, Shen Teng ve Huang Bo, komedinin yeni kralı olan Bahar Şenliği için savaşıyorlar? Yeni yılda gerçek bölümü görün
Günlük blogk8s Kubernetes v1.10.0 küme kurulum belgeleri
Python2 ve Python3 arasındaki temel farkları yorumlama örnekleri
To Top