مقدمة لإطار ميكرونوت



1. ما هو ميكرونوت


Micronaut هو إطار عمل JVM لبناء تطبيقات وحدات خفيفة الوزن. تم تطويره من قبل OCI ، وهي نفس الشركة التي قدمها لنا Grails. Micronaut عبارة عن إطار عمل حديث مصمم لجعل إنشاء تطبيقات الخدمات الصغيرة سريعة وسهلة.

يحتوي Micronaut على ميزات مشابهة لأطر العمل الحالية مثل Spring ، ولكنه في نفس الوقت ينفذ بعض الأفكار الجديدة التي هي بصماتها المميزة. إلى جانب دعم Java و Groovy و Kotlin ، فإنه يوفر العديد من الطرق لإنشاء التطبيقات.

2. الملامح الرئيسية


واحدة من أكثر ميزات Micronaut إثارة هي حقن التبعية (DI) في وقت الترجمة. تستخدم معظم الأطر كائنات انعكاسية وبروكسية لإدخال التبعيات في وقت التشغيل. يقوم Micronaut أيضًا بجمع البيانات لحقن التبعية في مرحلة التجميع. والنتيجة هي أوقات بدء تشغيل التطبيق بشكل أسرع واستهلاك أقل للذاكرة.

فرصته القادمة هي دعم من الدرجة الأولى للبرمجة التفاعلية ، سواء للعملاء أو للخوادم. يتم ترك اختيار تنفيذ محدد للنهج التفاعلي لمطوري الحلول ، ويتم دعم RxJava و Project Reactor خارج الصندوق.

بالإضافة إلى ذلك ، يحتوي Micronaut على العديد من الميزات التي تجعله إطارًا رائعًا لتطوير السحابة الأصلية. وهو يدعم العديد من آليات اكتشاف الخدمة ، مثل Eureka و Consul ، ويعمل أيضًا مع أنظمة تتبع موزعة مختلفة مثل Zipkin و Jaeger.

بالإضافة إلى ذلك ، يوفر الدعم لإنشاء وظائف لامدا AWS ، مما يسهل إنشاء تطبيقات بدون خادم.

3. الشروع في العمل


أسهل طريقة للبدء هي استخدام SDKMAN:

> sdk install micronaut 1.0.0.M2

سيقوم SDKMAN بتثبيت جميع الثنائيات التي تحتاج إليها لإنشاء تطبيقات Micronaut واختبارها ونشرها. بالإضافة إلى ذلك ، ستتلقى تطبيق وحدة التحكم Micronaut CLI ، مما يسمح لك ببدء مشروع جديد بسهولة.

القطع الأثرية الثنائية متاحة أيضًا على Sonatype وعلى Github.

في الأقسام التالية ، سنلقي نظرة على بعض ميزات Micronaut.

4. حقن التبعية (DI)


كما ذكرنا سابقًا ، تتعامل Micronaut مع حقن التبعية في وقت الترجمة ، مما يميزها عن معظم حاويات IoC.

ومع ذلك ، فإنه يدعم بشكل كامل التعليقات التوضيحية JSR-330 ، لذا فإن معالجة الفول مشابهة لأطر عمل IoC الأخرى.

لإدخال حاوية في الكود ، نستخدم @Inject :

 @Inject private EmployeeService service; 

يعمل @Inject تمامًا مثل @Autowired ويمكن استخدامه مع الحقول والأساليب والمنشآت والمعلمات.

بشكل افتراضي ، تحتوي جميع الفاصوليا على نطاق - نموذج أولي. يمكننا بسرعة إنشاء @Singleton باستخدام التعليق التوضيحي @Singleton . إذا نفذت حبوب متعددة نفس الواجهة ، فيمكننا استخدام التعليق التوضيحي @Primary لحل التعارض:

 @Primary @Singleton public class BlueCar implements Car {} 

يمكن استخدام @Requires عندما تكون الحبوب اختيارية ، أو لإجراء الحقن عند استيفاء شروط معينة.

في هذا الصدد ، تتصرف بنفس الطريقة التي @Conditional التعليقات التوضيحية Spring Boot @Conditional .

 @Singleton @Requires(beans = DataSource.class) @Requires(property = "enabled") @Requires(missingBeans = EmployeeService) @Requires(sdk = Sdk.JAVA, value = "1.8") public class JdbcEmployeeService implements EmployeeService {} 

5. إنشاء خادم HTTP


الآن ، دعنا نحاول إنشاء تطبيق خادم HTTP بسيط. للبدء ، سنستخدم SDKMAN:

> mn create-app hello-world-server -build maven

لذلك سنقوم بإنشاء مشروع Java جديد مع Maven في دليل يسمى hello-world-server. داخل هذا الدليل ، سنجد رمز التطبيق الرئيسي وملف Maven POM وملفات المشروع الأخرى.

يبدو أبسط تطبيق كما يلي:

 public class ServerApplication { public static void main(String[] args) { Micronaut.run(ServerApplication.class); } } 

5.1 حجب HttpRequest


التطبيق نفسه لا يفعل أي شيء تقريبًا. دعنا نضيف وحدة تحكم مع معالجين. سيعيد كلاهما التحية ، لكن أحدهما سيرد على طلبات GET والآخر سيرد على POST.

 @Controller("/greet") public class GreetController { @Inject private GreetingService greetingService; @Get("/{name}") public String greet(String name) { return greetingService.getGreeting() + name; } @Post(value = "/{name}", consumes = MediaType.TEXT_PLAIN) public String setGreeting(@Body String name) { return greetingService.getGreeting() + name; } } 

من المترجم: ذهب خادمك المتواضع وفعل كل ما يقال في هذه المقالة. إذا كنت في هذه المرحلة على وشك تشغيل التطبيق ومعرفة ما إذا كان يعمل ، فلا تنس تمكين معالجة التعليقات التوضيحية في Eclipse / IntelliJ IDEA.

5.2 رد الفعل IO


بشكل افتراضي ، تطبق Micronaut هذه المعالجات كإدخال / إخراج حظر تقليدي. ومع ذلك ، يمكننا تنفيذ المعالجات غير المحجوبة بسرعة عن طريق تغيير نوع الإرجاع إلى أي من الأنواع غير المتفاعلة غير المحجوبة.

على سبيل المثال ، مع RxJava يمكننا استخدام Observable. وبالمثل ، مع المفاعل ، يمكننا إرجاع أنواع Mono أو Flux :

 @Get("/{name}") public Mono<String> greet(String name) { return Mono.just(greetingService.getGreeting() + name); } 

من المترجم: في هذا المثال ستحتاج إلى مشروع مفاعل في تبعيات Maven:

 <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.1.8.RELEASE</version> </dependency> 

يستخدم كل من معالجات المنع وغير المنع خادم Netty HTTP.

عادةً ، تتم معالجة الطلبات في تجمع مؤشر الترابط I / O الرئيسي ، الذي يتم إنشاؤه عند بدء التشغيل ، مما يجعلها محظورة.

ومع ذلك ، إذا أرجع المعالج أنواع البيانات غير المحظورة ، فإن Micronaut يستخدم حلقة حدث Netty ، مما يجعل الطلب بأكمله غير محجوب.

6. إنشاء عميل HTTP


الآن ، دعنا ننشئ تطبيق عميل للمعالجات التي أنشأناها للتو. يوفر Micronaut طريقتين لإنشاء عملاء HTTP:

- إعلاني
- البرمجيات

6.1 إنشاء تعريف لعميل HTTP


الطريقة الأولى والأبسط للإنشاء هي استخدام نهج تعريفي:

 @Client("/greet") public interface GreetingClient { @Get("/{name}") String greet(String name); } 

لاحظ أننا لم ننفذ سطرًا واحدًا من التعليمات البرمجية لاستدعاء الخدمة. بدلاً من ذلك ، يفهم Micronaut كيفية استدعاء خدمة من توقيع أسلوب وتعليقات توضيحية.

لاختبار هذا العميل ، يمكننا إنشاء اختبار JUnit يستخدم API الخادم لتشغيل الخادم المضمن:

 public class GreetingClientTest { private EmbeddedServer server; private GreetingClient client; @Before public void setup() { server = ApplicationContext.run(EmbeddedServer.class); client = server.getApplicationContext().getBean(GreetingClient.class); } @After public void cleanup() { server.stop(); } @Test public void testGreeting() { assertEquals(client.greet("Mike"), "Hello Mike"); } } 

من مترجم: بالنسبة للقراء الفضوليين الكسولين ، هناك مشروع جاهز على Github: github.com/jreznot/micronaut-introduction

6.2 إنشاء عميل HTTP برمجياً


هناك خيار لإنشاء عميل HTTP تقليدي إذا كنت بحاجة إلى مزيد من التحكم في سلوكه وتنفيذه:

 @Singleton public class ConcreteGreetingClient { private RxHttpClient httpClient; public ConcreteGreetingClient(@Client("/") RxHttpClient httpClient) { this.httpClient = httpClient; } public String greet(String name) { HttpRequest<String> req = HttpRequest.GET("/greet/" + name); return httpClient.retrieve(req).blockingFirst(); } public Single<String> greetAsync(String name) { HttpRequest<String> req = HttpRequest.GET("/async/greet/" + name); return httpClient.retrieve(req).first("An error as occurred"); } } 

يستخدم العميل RxJava بشكل افتراضي ، بحيث يمكنك بسهولة استخدام المكالمات المحظورة وغير المحظورة.

7. ميكرونوت CLI


لقد رأينا بالفعل كيفية عمل الأداة المساعدة Micronaut CLI عندما أنشأنا التطبيق.

في حالتنا ، كان تطبيقًا منفصلاً ، ولكن هذه الأداة تدعم العديد من الميزات الأخرى.

7.1 مشاريع من تطبيقات متعددة (الاتحاد)


في Micronaut ، الاتحاد هو ببساطة مجموعة من التطبيقات الفردية التي تم تطويرها في مشروع واحد. باستخدام الاتحاد ، يمكننا بسهولة إدارتها معًا والتأكد من أنها تستخدم نفس الإعدادات.

عندما نستخدم واجهة سطر الأوامر (CLI) لإنشاء الاتحاد ، تأخذ الأداة الحجج نفسها التي يستخدمها الأمر إنشاء التطبيق. ستقوم بإنشاء الدليل الرئيسي للمشروع ووضع كل تطبيق في دليل فرعي.

7.2 الميزات


عند إنشاء تطبيق أو اتحاد ، يمكننا اختيار الميزات التي يحتاجها تطبيقنا. هذا يسمح لك باستخدام الحد الأدنى من التبعيات في المشروع.

نشير إلى الاحتمالات في حجة -features المنشار ، فصلها بفواصل.

يمكنك سرد الميزات المتاحة باستخدام الأمر التالي:

 > mn profile-info service Provided Features: -------------------- * annotation-api - Adds Java annotation API * config-consul - Adds support for Distributed Configuration with Consul * discovery-consul - Adds support for Service Discovery with Consul * discovery-eureka - Adds support for Service Discovery with Eureka * groovy - Creates a Groovy application [...] More features available 

من المترجم: حسنًا ، لا تفاجأ هنا ، يجب تشغيل الفريق خارج دليل المشروع. لا يعمل دليل المشروع ، ربما في إصدار .M3 قاموا بإصلاحه. لقد غادرت بالفعل.

7.3 المشاريع القائمة


يمكننا استخدام CLI لتعديل المشاريع الحالية. هذا يسمح لنا بإنشاء صناديق ، عملاء ، وحدات تحكم ، إلخ. عندما نقوم بتشغيل الأمر "mn" في دليل المشروع ، ستتوفر الأوامر التالية:

 > mn help | Command Name Command Description ----------------------------------------------- create-bean Creates a singleton bean create-client Creates a client interface create-controller Creates a controller and associated test create-job Creates a job with scheduled method 

8. الخلاصة


في هذه المقدمة الموجزة إلى Micronaut ، نظرنا إلى مدى سهولة إنشاء خوادم وعملاء HTTP غير المحظورين والعملاء. نظرنا أيضًا في بعض ميزات CLI.

هذه مجرد قطعة صغيرة من الكعكة التي تقدمها Micronaut. تحت الغطاء ، لديها دعم للوظائف بدون خادم ، واكتشاف الخدمة ، والتتبع الموزع ، والمراقبة والقياسات ، والتكوينات الموزعة ، وأكثر من ذلك بكثير.

بينما تم استعارة العديد من ميزات Micronaut من الأطر الموجودة مثل Grails و Spring ، إلا أنها توفر ميزات فريدة تميزها عن غيرها.

Source: https://habr.com/ru/post/ar418117/


All Articles