Spring MVC, yalnızca basitliği nedeniyle değil, aynı zamanda hızlı sistem geliştirmeye olanak tanıyan çok çeşitli üretime hazır özellikler sunması nedeniyle popüler bir çerçeve olmuştur. Birçok işletme, bu çerçeveye dayalı olarak kritik görev sistemleri kurdu. Bununla birlikte, bu teknolojinin dezavantajları da yoktur. İstek başına iş parçacığı tasarımı ve eşzamanlı G / Ç işlemleri, tasarım, dosya erişimi, veritabanı erişimi ve API tüketimi gibi G / Ç işlemlerinden yanıt alana kadar mevcut iş parçacığını engellediği için göze çarpan bir sorun haline geldi. Bu tür engelleme süreçlerinin programlanması, bir yandan kodlamayı daha basit ve idare etmeyi kolaylaştırırken, diğer yandan bu tür bir tasarım, bilgi işlem kaynaklarının verimsiz kullanımına yol açar ve yüksek hacimli taleplerin olduğu ortamda performans sorunlarına neden olur.
İyi haber şu ki, çerçeve devrim niteliğinde bir atılım gerçekleştirdi, uçtan uca eşzamansız G / Ç süreçlerini destekleyen ve baştan sona iş parçacığı yaklaşımı yerine olay döngüsünü benimseyen Spring WebFlux adlı ayrı bir teknoloji yığını oluşturdu. istek. En önemli avantaj, daha az bilgi işlem kaynağına ihtiyaç duyulurken yüksek sistem performansı elde etmektir.
Spring WebFlux büyüleyicidir, bu teknoloji yığını yıllarca süren geliştirmeden sonra üretim kullanımı için olgunlaşmıştır. Engellemeyen sistemlerin uygulanması muhtemelen geleceğe dönük bir sistem çözümü olduğu için dikkat etmeye değer. Bir Reactive Spring REST API'nin nasıl oluşturulacağını paylaşacağım ve ayrıca Spring MVC'nin sistem geliştirmesinden ne kadar farklı olduğunu öğreneceğim. Spring MVC kullanarak sistemleri kodlamaya alışkınsanız ve Spring Reactive hakkında daha fazla bilgi edinmek istiyorsanız bu makale iyi bir referans olacaktır.
Geleneksel Spring web çerçevesi, istek başına bir iş parçacığı atayarak gelen istekleri işleyen Servlet Stack'e dayanır. Ayrıca, temel teknolojilerin G / Ç işlemleri de engelleme süreçleridir. Başka bir deyişle, orijinal Spring MVC çerçevesini eşzamansız G / Ç'yi destekleyecek şekilde değiştirmek, belirli bileşenlerde basit bir değişiklik değildir, ancak sistem mimarisindeki tüm katmanlarda tam bir teknoloji değişimi gerektirir.
Aşağıdaki mantık bileşeni diyagramı, orijinal Spring MVC ile Spring WebFlux arasındaki karşılaştırmayı gösterir. Değişiklikler yalnızca web çerçevesini değil, aynı zamanda web kapsayıcısını, güvenliği ve veritabanı erişimini de içerir.
Sıfırdan yeni bir çerçeve daha öğrenmek konusunda endişelenebilirsiniz. Aslında, sahnenin arkasında muazzam değişiklikler olsa da, bu teknolojiyi kullanarak gelişmeyi yakalamak oldukça kolaydır. Spring ekibi sayesinde Spring, düşünceli ve geliştirici dostu tasarıma sahip yüksek kaliteli bir çerçevedir. Spring WebFlux uygulamasının ek açıklamalarının kullanımının ve genel yapısının Spring MVC'ye benzer olduğunu göreceksiniz.
WebFlux Spring uygulama geliştirme için reaktif programlamaya aşina olmak çok önemlidir. Zihniyet, bir dizi talimat ve mantık olan geleneksel zorunlu programlamadan farklıdır. G / Ç işlemleri zaman uyumsuz olduğundan, yöntem çağrıları bir pub / sub modelinde çalışır, öyle ki yöntem çağrısı G / Ç yürütmelerini beklemeden hemen bir yayıncı nesnesi döndürür. Daha sonra, verilere bağlı olan program mantığı, yayıncı nesnesine abone olabilir ve daha fazla işlem için verileri alabilir.
Reaktif programlama, sistem mantığını bir veri akışı ve veri işleme süreci olarak yapılandırarak bir pub / sub model yaklaşımında programın eşzamansız işlemlerini gerçekleştirmenin yollarından biridir.
Aşağıdaki basit örnek, ürün bilgileri ve promosyon verilerine dayalı olarak ürün fiyatı elde etmektir. Program mantığı önce bir ürün kaydını ve ardından bir promosyon bilgisini alır, ardından ürün fiyatını hesaplar. Tüm süreç adım adım sırayla yürütülür, bu nedenle bir sonraki adım yalnızca mevcut işlem tamamlandıktan sonra başlatılacaktır.
Product product = productRespository.findById(productId); Promotion promotion = promotionRepository.findByid(promotionId); Double productPrice = product.getPrice() — promotion.getDiscount();Product Price Calculation Logic Flow (Synchronous Process)
İşte Spring Reactive'in örnek kodu:
Mono<Product> product = productRepository.findById(productId); Mono<Promotion> promotion = promotionRepository.findById(promotionId); Mono<Double> productPrice = Mono.zip(product, promotion) .map(tuple -> tuple.getT1().getPrice() - tuple.getT2().getDiscount())
Örneğin, G / Ç işlemi tamamlandığında fiyat verileri konsola yazdırılacaktır.
product.subscribe(p -> { System.out.println(p.doubleValue()); });
2 tür yayıncı vardır -
Flux<Product> products = productRepository.findAll();
Reaktif programlamaya alıştıktan sonra, Spring Reactive uygulamalarını çok daha hızlı oluşturabileceksiniz.
Temel teknolojiler farklı olduğundan, farklı bir Maven başlangıç seti kullanmanız gerekecektir. Spring Initializr'da, bağımlılığı seçebilirsiniz - Maven / Gradle proje üretimi için Spring Reactive Web . Kalıcı verilere engelsiz erişime ihtiyacınız varsa, Spring Data R2DBC'yi de seçebilirsiniz .
Oluşturulan Maven projesi aşağıdaki ilkbahar önyükleme başlangıç bağımlılıklarını içerecektir:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency>
Kontrolör, gelen talepler için giriş noktalarını tanımlar. Çoğu ek açıklama @RestController, @RequestMapping, @PathVariable, vb. Gibi aynı olduğundan Spring MVC'ye oldukça benzer. Temeldeki teknoloji tamamen farklı olsa da, Spring çerçevesi Maven bağımlılıklarını otomatik olarak algılar ve denetleyicileri Reactive Stack üzerinde çalıştırır. Tek fark, yanıt verilerini sarmak için Mono / Flux kullanılmasıdır.
REST API, özellikle mikro hizmet mimarisinde hizmetler arasında entegrasyon için yaygın bir modeldir. RestTemplate , HTTP istekleri yapmak için yararlı bir yardımcı program sınıfıdır, G / Ç'yi engellemeye dayanır. Spring ekibi, zaman uyumsuz işlemlerin desteğiyle http istemcisi WebClient'in yeni bir sürümünü oluşturduğundan , ekip resmen RestTemplate'in bakım modunda olduğunu ve geliştiricilere yeni web istemcisini kullanmalarını önerdi.
WebClient'in API tasarımı RestTemplate'e benzer. Yöntem çağrılarının anlaşılması kolaydır. Yeni web istemcisini kullanarak GET ve POST HTTP isteklerinin nasıl yapılacağına ilişkin örnek koda bir göz atalım.
Bu örnek, kayıt kimliğine göre bir ürünü almak içindir. URL, bir yol değişkeni ve sorgu parametreleriyle UriBuilder kullanılarak oluşturulur. Yanıt, otomatik olarak hedef nesneye doğru serileştirilir.
Yeni bir kaydı kaydetmek için, bir web istemcisi, başlıkta belirtilen application / json içerik türüne sahip bir http gönderi isteği yapar. İstek gövdesi, gönderilmek üzere otomatik olarak JSON biçiminde serileştirilir.
Yazım sırasında, Spring OpenFeign henüz engellemeyen G / Ç'yi desteklemiyor. Reaktif destekle sistem geliştirme için OpenFeign'ı gerçekten kullanmak istiyorsanız, bu GitHub projesine göz atabilirsiniz, Spring OpenFeign engellemesiz G / Ç ile hazır olana kadar Spring ekibi tarafından da önerilmektedir.
Java'daki tüm ilişkisel veritabanı erişimi, tasarım gereği G / Ç'yi engellemeye dayanan temel JDBC sürücülerine dayanır. Bu nedenle, asenkron veritabanı erişimini desteklemek için R2DBC adlı yepyeni bir düşük seviyeli sürücü oluşturulur. Şüphesiz, alt seviye sürücüyü değiştirmek ve uygulamadaki her katmanı yeniden yazmak büyük bir çabadır. Bununla birlikte, topluluk hızla değişiyor, R2DBC sürücüleri artık Oracle, MySQL, MS SQL sunucusu gibi birçok popüler veritabanı için hazır. Bununla birlikte, R2DBC desteği, MongoDB ve Cassandra gibi NoSQL veritabanlarını da kapsar.
JPA veri havuzu, veri havuzlarının geliştirilmesini basitleştirdiği ve veri CRUD işlemlerinin standart kodlarını oluşturmaktan büyük bir çaba sarf ettiği için güçlü bir araçtır. JPA ile geliştiriciler, veri erişimi için basitçe bir arayüz tanımlayabilir, ardından çerçeve çalışma zamanında otomatik olarak uygulama oluşturacaktır. JPA şu ana kadar R2DBC'yi desteklemese de, Spring veri çerçevesi, özel sorgularla bir arayüz oluşturarak bir veri havuzu tanımlayabilmeniz için benzer özellikler sunar.
Örneğin, bu, G / Ç'yi engelleyen bir ürün veri havuzu arayüzüdür. Temel veri erişimi desteğiyle CrudRepository'ye genişletilmiş bir JPA arayüzüdür.
Devralmayı sadece ReactiveCrudRepository olarak değiştirerek, deponuz engellemeyen veritabanı erişimini destekleyecektir. Save (), findAll (), findById () gibi önceden tanımlanmış tüm yöntemlerin dönüş veri türleri , zaman uyumsuz işlemlerin desteklenmesi için Mono / Flux'tur .
NoSQL veritabanları için de çalışıyor. Bu, MongoDB depo tanımının bir örneğidir:
Hibernate gibi temel ORM çerçevesi şimdiye kadar yalnızca JDBC senkronize işlemlerini desteklediğinden, bire çok, çoktan bire ve çoktan çoğa gibi veri ilişkilerinin özellikleri maalesef henüz desteklenmemektedir. Bu nedenle, veri ilişkilerinin desteğinin gerekli olması durumunda uygulama mantığı oluşturmanız gerekecektir.
Otomatik test kavramı Birim Testi, Entegrasyon Testi ve Uçtan Uca Test WebFlux Yay uygulamalarına uygulanabilir. Test etme ve alay etmenin temel kavramlarını anlamak istiyorsanız, bu makaleyi faydalı bulacaksınız.Java Baharı - Modern Yazılım Kalite Güvencesinin En İyi Uygulaması
Her bileşene bakalım ve WebFlux uygulaması için test kodunun nasıl geliştirileceğini görelim.
Denetleyiciler üzerindeki birim testi, diğer tüm bağımlılıkları taklit ederek denetleyicileri izole etmektir. Denetleyiciler üzerinde test yapmak için kısmi bir uygulama bağlamını başlatmak için , Spring MVC'de @WebMvcTest'e karşılık gelen @WebFluxTest ek açıklamasını kullanabilirsiniz .
HTTP isteklerini simüle etmek ve WebFlux uygulamaları için yanıtı doğrulamak için Spring, zaman uyumsuz istekleri gerçekleştirmek için yeni http istemcisi WebClient'i kullanan kullanışlı bir yardımcı program sınıfı TestWebClient sağlar, ayrıca denetleyicilerin yanıt doğrulaması için ek işlevler sağlar.
Bu örnek, bir REST denetleyicisinden forex oranları yanıtını doğrular. @Autowired annotation kullanarak bir TestWebClient örneği elde edebilirsiniz . Denetleyiciye gönderim talebinin ardından, TestWebClient'in yöntemleri durum kodunu ve yanıt gövdesini kolayca belirleyebilir.
Bileşenler üzerinde birim testi için ayar ve açıklama büyük ölçüde Spring MVC ile aynıdır. Test yürütmesi için uygulama bağlamını başlatmak üzere @SpringJUnitConfig ve @ContextConfiguration gibi ek açıklamaları kullanabilirsiniz . Ayrıca, nesnelerle alay etmek ve test senaryoları oluşturmak için @MockBean kullanımı .
Mono / Flux'tan gelen veri akışını doğrulamak için Spring, Mono / Flux veri akışından her bir öğe çıkışını sırayla kontrol edebilen bir yardımcı program sınıfı StepVerifier sağlar .
Bu örneğin birim testi, veri öğesinin sırayla tek tek olup olmadığını belirlemek için Flux veri akışını kontrol eder. Beklenen 3 öğenin teslimatı üzerine StepVerifier, bunun veri akışının sonu olmasını bekler.
Spring, annotation @ DataR2dbcTest kullanarak reaktif veri deposu için kısmi uygulama bağlamı başlatmayı destekler , bu açıklama , senkronize veri havuzunda @DataJpaTest gibi benzer fonksiyon açıklamasına hizmet eder .
Bununla birlikte, reaktif veri havuzlarındaki birim testleri, engelleyici G / Ç sürümünün veri havuzları için birim testinden biraz daha fazla standart kod gerektirir çünkü Spring Reaktif Veri havuzları Hibernate ve @Sql ek açıklamasına benzer bir özelliğe sahip değildir . Hazırda bekletme, veri tablolarını otomatik olarak oluştururken, @Sql açıklama, birim test durumundan önce veri kurulumu için SQL dosyasını çalıştırabilir. Bu nedenle, eşzamansız veri depolarınızı test etmek için veritabanı tabloları oluşturmak ve veri kurulumunu test etmek için kod oluşturmanız gerekir.
Bu örnek, her bir test senaryosunun yürütülmesinden önce veritabanı tablolarını yeniden oluşturmak için bir kurulum yöntemini gösterir. @Sql ek açıklaması olmadan, örnekteki veri kurulumunun test edilmesinin, ilk olarak veritabanına kayıt eklemek için R2dbcTemplate yardımcı program sınıfını ve ardından veri havuzundaki findAll () üzerinde test yürütmeyi kullandığını görebilirsiniz . Sonunda StepVerifier kullanarak Flux veri akışındaki sonucu doğrulayın .
Olay döngüsü mimarisiyle birlikte zaman uyumsuz G / Ç işlemlerinin yeteneği, bilgi işlem kaynaklarını verimli bir şekilde kullanabilir ve daha iyi bir eşzamanlılık performansı elde edebilir. Geleneksel istek başına iş parçacığı ve eşzamanlı bir şekilde adım adım G / Ç'ye erişebilen G / Ç işlemlerini bloke eder. Bununla birlikte, bu tür bir tasarımı uygulamak için Java kullanan geliştirme karmaşık bir iş olabilir. WebFlux Spring, engellemesiz sistem geliştirmenin kolay bir yolunu sunan harika ve yüksek kaliteli bir çerçevedir.
Genel olarak, teknoloji olgun ve üretime hazır. ORM veri ilişkisinin desteği ve veri havuzu testi desteği gibi bazı özellikler henüz mevcut olmasa da, çerçeve hızla büyüyor ve yakın gelecekte daha fazla yeni özellik hazır olacak.
Bilinç nedir? Yüzyıllardır filozofların ve bilim adamlarının kafasını karıştıran bir sorudur. Bazıları bunun bedenlerimizden bağımsız olarak gerçekten anlayamadığımız geçici bir şey olduğunu söylüyor.
Yıllık ortalama 154 bin dolar maaş ve istikrarlı iş büyümesi ile şimdi blok zinciri geliştirmeyi öğrenmek için ideal zaman. Blok zinciri teknolojilerini oluşturmak ve geliştirmek için blok zinciri geliştiricileri, bilgisayar ağı, kriptografi, algoritmalar ve veri yapıları dahil olmak üzere çeşitli beceriler kullanır.
28 Temmuz 2022'de Güneş, Yeni Ay, Aslan'da Ceres kavuşumu Jüpiter RX'i üçgen yapacak, Merkür ise Uranüs'ü Merkür, Uranüs-Mars, Satürn'e T-karesinin bir parçası olarak veya düğümler ise sabit bir Büyük Haç ile kare yapacak. dahildir. Venüs, Kara Ay Lilith ve Yengeç burcundaki sabit yıldız Sirius ile kavuşum halindedir.
Mars, Uranüs ve Kuzey Düğümü, 1 Ağustos 2022'de 18 derecede Boğa burcunda kavuşuyor. Yataklarımız yanarken nasıl uyuruz?-Gece yarısı yağı Yılın en önemli astrolojik yönlerinden biri olan Mars ve Uranüs'ün kaderin Kuzey Düğümü ile kavuşumu, gerçek bir aciliyet hissinin eşlik ettiği büyük bir uyandırma çağrısıdır.
İster NFT'lerde yeni olun, ister sahnenin emektarı olun, burada anlattıklarımın faydalı olabileceğini umuyorum. Bu seri, "projelerin" herkesi kendilerine bir miktar para kazandırmak için manipüle etmek için kullandıkları özenle tasarlanmış yöntemleri ortaya çıkarmayı amaçlıyor.
"Tren kazası" kelimesinden nefret ediyorum. İnsanlar kendi ahlaki pusulalarında teselli bulur ve bunu yaparken kendilerini yargıda bulunurken bulurlar.