この記事のポイント:
MicronautのJVMは、モジュールとマイクロサービスアプリケーションをテストするのは簡単構築するための最新のフルスタックフレームワークに基づいています。場合Micronaut関わらず反射依存性注入とAOPの、完全なコンパイルを提供します。フレームワークの開発チームと開発チームのGrailsのフレームワークは同じです。Micronautのフレームワークは、フレームワークに組み込まれているクラウド技術、サービスの発見、分散型追跡、回路ブレーカおよびその他のマイクロサービスモデルを統合します。ジャワ、KotlinとGroovy:このチュートリアルでは、異なる言語で3マイクロサービスを作成します。あなたはまた、それが、どのように迅速に行なう機能テストを作成する方法を簡単に他のマイクロのMicronaut HTTPクライアントサービスの消費量を使用することを学びます。
Micronaut 100%反射依存性注入とAOPのコンパイルされたとき、アプリケーション・フレームワークは、異なる従来のJVMを使用して構築しました。したがって、Micronautアプリケーションは非常に小さく、非常に低いメモリフットプリント。Micronautを使用して、あなたは偉大なアプリケーションまたはモノマーはAWSラムダ少し機能に展開することができます開発することができます。フレームワークは、あなたを制限するものではありません。
Micronautフレームワークはまた、フレームワークに組み込まれているクラウド技術、サービスの発見、分散型追跡、回路ブレーカおよびその他のマイクロサービスモデルを統合します。
2018年5月にリリースされMicronautなどのオープンソース・ソフトウェアは、2018年の終わりの前にバージョン1.0.0をリリースする予定です。マイルストーンバージョンとリリース候補版はすでに提供されていますので、今、あなたは、Micronautを試すことができます。
開発チームと開発チームのMicronautフレームワークのGrailsフレームワークは同じです。Grailsは最近、多くの生産性は、Webアプリケーションを作成する開発者を助け、それは続けて、その10周年を迎えました。Grailsの3は春ブーツの上に構築されています。あなたはすぐに見つけることGrailsと、Micronautは、単純な学習曲線を持っているこれら二つの開発者の春ブートフレームワークを使用しました。
チュートリアル
この一連の記事では、我々はいくつかのマイクロアプリケーションを作成するためのサービスを使用します。
- Groovyで書かれたマイクロサービスブック、。
- マイクロサービスの在庫は、Kotlinの書き込みを使用します。
- Javaで書かれたマイクロゲートウェイサービス、。
あなたは、次の操作を行います: - コンパイラを使用してエンドポイント、依存性注入を書きます。
- 機能テストを書きます。
- 領事を登録するには、これらのアプリケーションを構成Micronaut。
- 使用Micronaut宣言型のHTTPクライアントを介して通信します。
次の図は、あなたが構築したいアプリケーションを示しています。
マイクロサービス#1のGroovy microService
Micronautアプリケーションを作成する最も簡単な方法は、SDKMan簡単なインストールを使用して、コマンドラインインタフェース(CLI Micronaut)を使用しています。
Micronautアプリケーションは、Java、KotlinとGroovyで書かを使用することができます。まずは、GroovyのMicronautアプリケーションを作成してみましょう:
mn create-app example.micronaut.books --lang groovy .
上記のコマンドは、デフォルトのパッケージがexample.micronautで、booksという名前のアプリケーションを作成します。
Micronautテストフレームワークは無関係です。これは、デフォルトのテストフレームワークを使用することを選択した言語に基づいています。デフォルトでは、JavaはJUnitのを使用します。あなたはGroovyの選択した場合、デフォルトでは、我々はスポックを使用します。あなたは、異なる言語やテストフレームワークを使用することができます。例えば、JavaのMicronautスポックのテストアプリケーション。
また、Micronautは、ツールを構築するために無関係です。あなたはMavenのかのGradleを使用することができます。Gradleのデフォルト。
アプリケーションの生成に基づくネッティーは、非ブロッキングHTTPサーバを備えます。
コントローラを作成し、あなたの最初のMicronautエンドポイントを公開します:
books/src/main/groovy/example/micronaut/BooksController.groovy
package example.micronaut
import groovy.transform.CompileStatic
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
@CompileStatic
@Controller("/api")
class BooksController {
private final BooksRepository booksRepository
BooksController(BooksRepository booksRepository) {
this.booksRepository = booksRepository
}
@Get("/books")
List<Book> list() {
booksRepository.findAll()
}
}
上記のコードでは、言及する価値があるいくつかの場所があります。
- GETリクエストを呼び出し、ルート/ API /ブックエンドポイント露光コントローラを使用することができます。
- ノート@Get @Controller値およびRFC-6570 URIテンプレートです。
- コンストラクタ・インジェクションにより、Micronautは、コラボレーティブなカテゴリが用意されていますBooksRepositoryを。
- Micronautコントローラのデフォルトの消費とJSONを生成します。
インターフェイスとPOGOを使用してコントローラは言いました:
books/src/main/groovy/example/micronaut/BooksRepository.groovy
package example.micronaut
interface BooksRepository {
List<Book> findAll()
}
books/src/main/groovy/example/micronaut/Book.groovy
package example.micronaut
import groovy.transform.CompileStatic
import groovy.transform.TupleConstructor
@CompileStatic
@TupleConstructor
class Book {
String isbn
String name
}
接続豆BooksRepositoryインタフェースの実現に、コンパイル時にMicronaut。
このアプリケーションでは、我々は一つの例を作成している、我々は定義されてjavax.inject.Singletonアノテーションを使用しています。
books/src/main/groovy/example/micronaut/BooksRepositoryImpl.groovy
package example.micronaut
import groovy.transform.CompileStatic
import javax.inject.Singleton
@CompileStatic
@Singleton
class BooksRepositoryImpl implements BooksRepository {
@Override
List<Book> findAll() {
[
new Book("1491950358", "Building Microservices"),
new Book("1680502395", "Release It!"),
]
}
}
最大値機能検査は、彼らは、アプリケーション全体をテストするため。しかし、他のフレームワークのために、めったに機能テストや統合テストを使用しません。ほとんどの場合、彼らは全体のアプリケーションを起動するために関係するので、速度が非常に遅いと。
しかし、Micronautで機能テストを書くことは喜びです。彼らは非常に速く、高速であるため。
次のようにコントローラテストの機能は以下のとおりです。
books/src/test/groovy/example/micronaut/BooksControllerSpec.groovy
package example.micronaut
import io.micronaut.context.ApplicationContext
import io.micronaut.core.type.Argument
import io.micronaut.http.HttpRequest
import io.micronaut.http.client.RxHttpClient
import io.micronaut.runtime.server.EmbeddedServer
import spock.lang.AutoCleanup
import spock.lang.Shared
import spock.lang.Specification
class BooksControllerSpec extends Specification {
@Shared
@AutoCleanup
EmbeddedServer embeddedServer = ApplicationContext.run(EmbeddedServer)
@Shared @AutoCleanup RxHttpClient client = embeddedServer.applicationContext.createBean(RxHttpClient, embeddedServer.getURL())
void "test books retrieve"() {
when:
HttpRequest request = HttpRequest.GET('/api/books')
List<Book> books = client.toBlocking().retrieve(request, Argument.of(List, Book))
then:
books books.size() == 2
}
}
テストでは、言及する価値があるいくつかの場所があります。
- インタフェースは、アプリケーションを実行するユニットテストから容易にEmbeddedServerを意味します。
- 豆の消費埋め込まれたサーバーにHTTPクライアントを作成するのは簡単です。
- Micronaut HTTPクライアントは、JavaオブジェクトにJSONをパースするのは簡単です。
マイクロサービス#2 Kotlin microService
追加サービスのマイクロと呼ばれるインベントリを作成するには、次のコマンドを実行します。今回は、Kotlinの言語を使用しています。
> mn create-app example.micronaut.inventory --lang kotlin
新しいマイクロサービスは、各書籍の目録を制御します。
Kotlinは、データクラスの属性フィールドのパッケージを作成します。
inventory/src/main/kotlin/example/micronaut/Book.kt
package example.micronaut
data class Book(val isbn: String, val stock: Int)
コントローラを作成し、ブックをストックに戻ります。
inventory/src/main/kotlin/example/micronaut/BookController.kt
package example.micronaut
import io.micronaut.http.HttpResponse import io.micronaut.http.MediaType import io.micronaut.http.annotation.Controller import io.micronaut.http.annotation.Get import io.micronaut.http.annotation.Produces
@Controller("/api")
class BooksController {
@Produces(MediaType.TEXT_PLAIN)
@Get("/inventory/{isbn}")
fun inventory(isbn: String): HttpResponse<Int> {
return when (isbn) {
"1491950358" -> HttpResponse.ok(2)
"1680502395" -> HttpResponse.ok(3)
else -> HttpResponse.notFound()
}
}
}
#3 Javaのマイクロサービスマイクロサービス
Javaのゲートウェイアプリケーションの作成、アプリケーションは書籍や在庫の両方のマイクロサービスを消費します。
mn create-app example.micronaut.gateway
あなたはLANGのロゴを指定しない場合、それは、Javaの選択をデフォルトとします。
マイクロゲートウェイサービスでは、宣言型のHTTPクライアント通信サービスおよびマイクロブックを作成します。
まず、インタフェースを作成します。
gateway/src/main/java/example/micronaut/BooksFetcher.java
package example.micronaut;
import io.reactivex.Flowable;
public interface BooksFetcher {
Flowable<Book> fetchBooks();
}
その後、宣言型のHTTPクライアントを作成し、これは@Client注釈インターフェイスを使用することです。
gateway/src/main/java/example/micronaut/BooksClient.java
package example.micronaut;
import io.micronaut.context.annotation.Requires;
import io.micronaut.context.env.Environment;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.client.Client;
import io.reactivex.Flowable;
@Client("books")
@Requires(notEnv = Environment.TEST)
public interface BooksClient extends BooksFetcher {
@Override @Get("/api/books") Flowable<Book> fetchBooks();
}
大幅HTTPクライアントの作成を簡素化しており、コンパイル時にHTTPクライアントを実装するMicronaut宣言型の方法。
また、Micronautは、アプリケーション環境の概念をサポートしています。上記のコードリストでは、あなたが見ることができる、それが注釈@Requiresを使用するのは簡単である特定の環境にロードされた特定のBeanを禁止します。
そして、あなたは前の例のようにコード内で見ることができるように、非ブロック型がでMicronautで第一級の市民です。ブックは、Java POJOであることを特徴とする請求BooksClient :: fetchBooks()メソッドは、フロアブル<ブック>を返します。
gateway/src/main/java/example/micronaut/Book.java
package example.micronaut;
public class Book {
private String isbn;
private String name;
private Integer stock;
public Book() {}
public Book(String isbn, String name) {
this.isbn = isbn;
this.name = name;
}
public String getIsbn() { return isbn; }
public void setIsbn(String isbn) { this.isbn = isbn; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getStock() { return stock; }
public void setStock(Integer stock) { this.stock = stock; }
}
在庫と通信するために別の宣言型のHTTPクライアント、マイクロサービスを作成します。
まず、インタフェースを作成します。
gateway/src/main/java/example/micronaut/InventoryFetcher.java
package example.micronaut;
import io.reactivex.Maybe;
public interface InventoryFetcher {
Maybe<Integer> inventory(String isbn);
}
次に、HTTPクライアント、宣言:
gateway/src/main/java/example/micronaut/InventoryClient.java
package example.micronaut;
import io.micronaut.context.annotation.Requires;
import io.micronaut.context.env.Environment;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.client.Client;
import io.reactivex.Flowable;
import io.reactivex.Maybe;
import io.reactivex.Single;
@Client("inventory")
@Requires(notEnv = Environment.TEST)
public interface InventoryClient extends InventoryFetcher {
@Override
@Get("/api/inventory/{isbn}")
Maybe<Integer> inventory(String isbn);
}
さて、反応性応答を作成し、2つのBeanに、コントローラを作成します。
gateway/src/main/java/example/micronaut/BooksController.java
package example.micronaut;
import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.reactivex.Flowable;
@Controller("/api") public class BooksController {
private final BooksFetcher booksFetcher;
private final InventoryFetcher inventoryFetcher;
public BooksController(BooksFetcher booksFetcher, InventoryFetcher inventoryFetcher) {
this.booksFetcher = booksFetcher;
this.inventoryFetcher = inventoryFetcher;
}
@Get("/books") Flowable<Book> findAll() {
return booksFetcher.fetchBooks()
.flatMapMaybe(b -> inventoryFetcher.inventory(b.getIsbn())
.filter(stock -> stock > 0)
.map(stock -> {
b.setStock(stock);
return b;
})
);
}
}
あなたがコントローラの機能テストを作成する前に、我々はテスト環境で(BooksFetcherとInventoryFetcher)として実装されているBeanを作成する必要があります。
BooksFetcherインターフェイスに合わせて作成Beanは、テスト環境でのみ使用可能です。@Requiresコメントを参照してください。
gateway/src/test/java/example/micronaut/MockBooksClient.java
package example.micronaut;
import io.micronaut.context.annotation.Requires;
import io.micronaut.context.env.Environment;
import io.reactivex.Flowable;
import javax.inject.Singleton;
@Singleton
@Requires(env = Environment.TEST)
public class MockBooksClient implements BooksFetcher {
@Override
public Flowable<Book> fetchBooks() {
return Flowable.just(new Book("1491950358", "Building Microservices"), new Book("1680502395", "Release It!"), new Book("0321601912", "Continuous Delivery:"));
}
}
InventoryFetcherインタフェース豆の行を作成し、テスト環境にのみ適用されます。
gateway/src/test/java/example/micronaut/MockInventoryClient.java
package example.micronaut;
import io.micronaut.context.annotation.Requires;
import io.micronaut.context.env.Environment;
import io.reactivex.Maybe;
import javax.inject.Singleton;
@Singleton
@Requires(env = Environment.TEST)
public class MockInventoryClient implements InventoryFetcher {
@Override
public Maybe<Integer> inventory(String isbn) {
if (isbn.equals("1491950358")) {
return Maybe.just(2);
}
if (isbn.equals("1680502395")) {
return Maybe.just(0);
}
return Maybe.empty();
}
}
機能テストを作成します。Groovyのマイクロサービスでは、我々はJUnitテストを書き、スポックのテスト、この時間を書きました。
gateway/src/test/java/example/micronaut/BooksControllerTest.java
package example.micronaut;
import io.micronaut.context.ApplicationContext;
import io.micronaut.core.type.Argument;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.client.HttpClient;
import io.micronaut.runtime.server.EmbeddedServer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.List;
public class BooksControllerTest {
private static EmbeddedServer server;
private static HttpClient client;
@BeforeClass
public static void setupServer() {
server = ApplicationContext.run(EmbeddedServer.class);
client = server .getApplicationContext() .createBean(HttpClient.class, server.getURL());
}
@AfterClass
public static void stopServer() {
if (server != null) {
server.stop();
}
if (client != null) {
client.stop();
}
}
@Test
public void retrieveBooks() {
HttpRequest request = HttpRequest.GET("/api/books");
List<Book> books = client.toBlocking().retrieve(request, Argument.of(List.class, Book.class));
assertNotNull(books);
assertEquals(1, books.size());
}
}
サービス検出
私たちは、領事サービス・ディスカバリに登録され、当社のMicronautマイクロサービスを構成します。
領事は、任意のプラットフォーム間での時間のための分散サービスグリッドで、パブリックまたはプライベートクラウド接続、保護および設定サービスを実行します。
Micronautと領事の統合は非常に簡単です。
まず、すべての書籍の在庫と3マイクロゲートウェイサービスはそれぞれ、サービス発見クライアントの依存関係を追加しました:
gateway/build.gradle
runtime "io.micronaut:discovery-client"
books/build.gradle
runtime "io.micronaut:discovery-client"
inventory/build.gradle
runtime "io.micronaut:discovery-client"
私たちは、アプリケーションの起動時に領事への登録のために、各アプリケーションの構成にいくつかの変更を加える必要があります。
gateway/src/main/resources/application.yml
micronaut:
application:
name: gateway
server:
port: 8080
consul:
client:
registration:
enabled: true
defaultZone: "${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}"
books/src/main/resources/application.yml
micronaut:
application:
name: books
server:
port: 8082
consul:
client:
registration:
enabled: true
defaultZone: "${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}"
inventory/src/main/resources/application.yml
micronaut:
application:
name: inventory
server:
port: 8081
consul:
client:
registration:
enabled: true
defaultZone: "${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}"
領事に登録するときに、プロパティmicroaut.applicationの.nameのIDを使用してサービスとして各サービス。我々は@Client注釈の前にそれらの正確な名前を使用する理由です。
次のように、上記のリスト、Micronaut、環境変数補間のデフォルト値設定ファイルの別の特徴を示しています。
defaultZone: "${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}"
また、Micronaut環境固有の設定ファイルがあるかもしれません。私たちは、登録のテストフェーズのための領事を各環境でアプリケーションtest.ymlという名前のファイルを作成します。
gateway/src/test/resources/application-test.yml
consul:
client:
registration: enabled: false
books/src/test/resources/application-test.yml
consul:
client:
registration: enabled: false
inventory/src/test/resources/application-test.yml
consul:
client:
registration: enabled: false
**実行アプリケーション
を開始する最も簡単な方法は、領事ドッカーを使用することです。さて、ドッカーインスタンスを実行します。
docker run -p 8500:8500 consul
マルチプロジェクトのビルドを作成するためのGradleを使用してください。ルートディレクトリにファイルを作成Settings.gradle。
settings.gradle
include 'books'
include 'inventory'
include 'gateway'
さて、あなたは、各アプリに並列に実行することができます。Gradleでは、便利な識別(-parallel)を提供することを目指しています。
./gradlew -parallel run
8080,8081および8082:各マイクロサービスはポートで起動するように設定されています。
領事は、HTMLのUIを提供します。ブラウザを開きます。httpを:// localhostを:8500 / uiを 、 あなたが表示されます。
各マイクロMicronautサービスは、領事に登録しています。
あなたは、次のcurlコマンドを使用することができますゲートウェイマイクロサービスを呼び出します。
$ curl http://localhost:8080/api/books [{"isbn":"1680502395","name":"Release It!","stock":3}, {"isbn":"1491950358","name":"Building Microservices","stock":2}]
おめでとう、あなたは最初Micronautマイクロサービスネットワークを作成しました!
概要
ジャワ、KotlinとGroovy:このチュートリアルでは、異なる言語で3マイクロサービスを作成しました。また、それは他のマイクロサービスのMicronaut HTTPクライアントの消費量であり、どのように迅速に行なう機能テストを作成するために使用することがいかに簡単であるかを学びました。
また、作成したすべてが依存性注入とAOPの完全に無関係リフレクションを使用することができます。