[Microservices]マイクロサービスなんてかんたんだ…/Microservices Are Easy…


理屈のうえでは、マイクロサービスは簡単です。疎結合で、互いに独立して開発、テスト、そしてデプロイできるスケーラブルなサービス。すごい話ですよね。さらに、それぞれのサービスはそれぞれの都合に合った言語、また好きなフレームワークで開発を行っても、アーキテクチャの他の部分に影響は与えないときたものです。JavaサービスをNodeやGo、Rubyなどのサービスと合わせて使い、それぞれが別々のデータストアにデータを永続化するようなこともできます。たとえばJavaサービスではKey/Valueストアを使っているかもしれません。もしかするとGoサービスではトラディショナルなRDBMSに永続化していたり。マジで未来が来ています。

…と思っていた時期もありました

現実には、マイクロサービスは開発者たちに新しい課題を投げかけています。われわれの業界はどうも循環しているところがあって、5年とか10年とか前に解決した問題へのソリューションを再発明するようなことがあります。これは必ずしも悪いことではなく、古い問題に新しい答えを創造することで、何年かの間に得られた教訓を織り込むことができます。ソーシャルメディアの勃興と流行により、以前は交わることのなかった開発者コミュニティ間の境界がやや曖昧になり、アイディアが共有されるようにもなってきました。とは言うものの、マイクロサービスがあなたの抱えるモノリシックな問題を即座に解決してくれるようなものではないということを理解しておくのが重要です。マイクロサービスは古くからある問題を解決する新しいやり方を提供してくれますが、それなりの代償もあります。あなたは考え方を変える必要に迫られるでしょうし、これまで揺るぎない常識だと思っていた概念から距離を取る必要も出てきます。データベースでのCHECK制約を用いた参照整合性といったやり方はもう当てはまらないでしょう。プログラマーが最も早い時期に学んできた考え方のひとつであるDon't Repeat Yourself(DRY)はそれほど重要だとはみなされなくなります。
あらゆるものごとにはなんらかの代償があり、これはマイクロサービスに限った話ではありません。Object Relational Mapping(ORM)フレームワークが一般的になったときには、それまで持ち得ていたきめ細かな制御は一定程度失われました。オブジェクトのごく一部のプロパティを選択して取得するのはそれほど簡単ではなくなってしまいました(オブジェクト全部を取得するか何も取得しないか、です)。ORMを用いてオブジェクトグラフに複雑なクエリをかけるのは難しく、パフォーマンスに苦しむことになります。これはほとんどのORMシステムがリフレクションを使っており、もし実装がへぼかった場合、たちの悪いデータベースクエリを実行することになるからです。
一方で、マイクロサービスの人気には疑問を差し挟む余地はありません。お客様からはもしかしたらここ数年の他のいずれのトピックよりもマイクロサービスについて頻繁に質問をいただきます。マイクロサービスについて、カンファレンスでは多くの議論がなされ、ブログポストやビデオも日々公開されています。というわけで私も、パワフルでメンテナンスしやすく、高性能なマイクロサービスを作成するための耳寄りなテクニックを紹介するため、ブログポストのシリーズを投稿することにしました。
言うまでもなく、プロジェクトはそれぞれ異なっています。ひとつのプロジェクトでうまくいったことが、他のプロジェクトでもうまくいくとは限りません。前の会社でやったことが今の会社にとってベストなやり方であるとも限りません。それでいいんです。それこそがこの業界で働くことをエキサイティングにしてくれる一因です。もし全てのプロジェクトに適用できる簡単なソリューションなんてものが存在したら、本当にすぐに仕事は退屈になってしまうでしょうね。私のブログポストシリーズを読む際にはこのことを覚えておいてください。そして、どのアーキテクチャでやると決める前にも、常にビジネス要件の評価を確実に実施してくださいね。

マイクロサービスの定義とは

私が言っている「マイクロサービス」の意味するところをあなたが完全に理解している、なんていう風には思い込むべきではないでしょう。というのも、しばしば「みんな」がマイクロサービスについて知っているような気がしてしまうときもありますが、現実には開発者の中には依然、そのおおまかな概念を理解できていない方もいます。伝統的に、われわれはアプリケーションを今では「モノリス」として知られているパターンでデザインしてきました。つまり、ひとつのアプリケーションにすべてのサービス、ビジネスロジック、モデルとそして通常画面のコードが含まれているというものです。あなたはモノリスはいくぶんか時代遅れであり、「モダン」なソフトウェアの世界にもはや居場所はないのだといった話をしばしば読んだり、聞いたりするでしょう。端的に言ってそういった話は間違っています。アプリケーションが単一のコードベースであることがベストである場合は確実に存在しますし、あなたがある方法でアプリケーションを開発することを決めたことそれだけであなたのソリューションが他のものに劣っているのだと感じる必要なんてないってことです。しかし、ある場合においてはアプリケーションの要件が単一のコードベースにするには複雑にすぎるといったこともあります。もしかするとあなたのところにはいくつかの分散した、異なるスキルセットを持ったチームがあるかもしれません。あるいは他のサービスに比べ突出して利用されているサービスがあるかもしれません。異なる永続化モデルに間借りされるようなデータがあったりとか。(とりわけ)そうした条件では、開発者たちはマイクロサービスパターンを用いることで結合を疎にしたり、個々にサービスをスケールさせたり、管理したりしてきました。Martin Fowlerはマイクロサービスについて2014年のこの記事の中でそのようなことを述べています:
簡潔に言えば、マイクロサービスアーキテクチャスタイルは単一のアプリケーションを複数の小さなサービスのセットとして開発することだ。それらはそれぞれ自身のプロセスの中で可動し、しばしば用いられるHTTPリソースAPIのような軽量な仕組みでコミュニケーションする。これらのサービスはビジネス上の機能に関連づけられて開発され、完全に自動化されたデプロイ機構によって個々にデプロイが可能である。そこでは中央集権的なサービス管理は実に最小限しかなく、サービスはそれぞれ異なったプログラミング言語で書かれていてもいいし、異なったデータストレージを用いていてもよい。

簡単で、でも簡単じゃない…

最初に書いた通り、理屈の上ではとてもシンプルです。でもマイクロサービスの背景にある理屈を理解するところから、実際に実装するまでの道のりは難しいものかもしれませんし、データを管理しようとする段になるといろいろとややこしくなるかもしれません。このブログシリーズでは、小規模なマイクロサービスを作成してデプロイする方法―基盤からコーディングそしてデプロイメント―をご紹介したいと思います。また、マイクロサービスパターンを実装した場合のいくつかのデータ管理方法についても説明し実演していけたらと思います。

[Helidon] Oracle Developer Cloudを使ったHelidonマイクロサービスのビルドとデプロイ/Build and Deploy a Helidon Microservice Using Oracle Developer Cloud

原文はこちら
https://blogs.oracle.com/developers/build-and-deploy-a-helidon-microservice-using-oracle-developer-cloud

Oracleは最近、Project Helidonを展開しました。Project Helidonはマイクロサービスを開発する新しい方法を提供します。このブログではOracle Developer Cloudを使ってあなたの最初のHelidonベースのマイクロサービスを作成し、Oracle Container Engine for Kubernetesにデプロイする方法をご説明します。

始める前に、いくつかのポイントを確認しておきましょう:

Helidonとはなにか?

Project Helidonはマイクロサービスを開発するためのJavaライブラリの集合です。Helidonはふたつのプログラミングモデルをサポートしており、ひとつはMicroProfile 1.2ベースのHelidon MPで、もうひとつはスモールでファンクショナルスタイルAPIであるHelidon SEです。
どちらを選んだとしても、Java SEベースのアプリケーションを開発することになります。Helidonはオープンソースであり、コードはGitHubで利用可能です。Project Helidonについてもっと知りたい場合は、次のリンクを見てみてくださいね:

始めてみよう

Helidonは単品でダウンロードするような機能を提供しておらず、代わりにMavenリリースを使う必要があります。これはつまり、Mavenアーキタイプを使ってHelidonマイクロサービスプロジェクトを使い始めるということになります。このブログでは、Helidon SEプロフラグラミングモデルを使っていきます。
Helidonで開発を行うにあたり、以下の基本的な前提ソフトウェアをマシンにインストールしておく必要があります:
  • Maven
  • Java 8
  • Gitcli (コードをOracle Developer Cloud Gitリポジトリにプッシュするため)

Mavenを使ってHelidonのサンプルマイクロサービスプロジェクトをダウンロード

Windowsマシンを使っているなら、コマンドプロンプトを開きましょう。そしてサンプルHelidonマイクロサービスプロジェクトを作成したいフォルダに移動し(あるいは作成し)、以下のMavenコマンドを実行してください。
mvn archetype:generate -DinteractiveMode=false \
    -DarchetypeGroupId=io.helidon.archetypes \
    -DarchetypeArtifactId=helidon-quickstart-se \
    -DarchetypeVersion=1.1.0 \
    -DgroupId=io.helidon.examples \
    -DartifactId=helidon-quickstart-se \
    -Dpackage=io.helidon.examples.quickstart.se

実行すると、このMavenコマンドはhelidon-quickstart-seフォルダを作成します。
マイクロサービスのアプリケーションコード、ビルドファイル、およびデプロイメントファイルはすべてこのhelidon-quickstart-seフォルダに格納されています。

以下がそれらのファイルとフォルダです:
  • srcフォルダ –  マイクロサービスのアプリケーションソースコードを格納
  • app.yml – Kubernetesデプロイメントを定義
  • Dockerfile – Dockerイメージ作成方法を定義
  • Dockerfile.native – GraalVMを使ってのDockerイメージ作成方法を定義
  • Pom.xml – Mavenビルドのプロジェクト記述子
  • README.md –  プロジェクトの説明が記載されたファイル
ではGitリポジトリを使うOracle Developer Cloudプロジェクトを作成しましょう。このGitリポジトリのことをここではHelidon.gitと呼びます。

コマンドプロンプトでhelidon-quickstart-seフォルダに移動し、以下のGitコマンドでHelidonマイクロサービスアプリケーションコードを作成したGitリポジトリにプッシュしましょう。
Note: You need to have gitcli installed on your development machine to execute Git commands.
注意:Gitコマンドを実行するには、あなたの開発マシンにgitcliがインストールされている必要があります。
git init
git add --all
git commit -m "First commit"
git remote add origin <git repository url>
git push origin master

あなたのHelidon.gitリポジトリは以下のような構成になったかと思います。

ビルドジョブの構成

Developer Cloudで、左側のナビゲーションバーからBuildsを選択することでBuildsページに移動し、+Create Jobボタンをクリックします。
New Jobダイアログでは、NameBuildHelidonと入力して、Dockerランタイムを持っているTemplateを選択し、Createボタンをクリックします。このビルドジョブはGitリポジトリにあるHelidonマイクロサービスコードのDockerイメージをビルドし、DockerHubレジストリにプッシュします。
Gitタブでは、Add GitのドロップダウンからGitを選び、GitリポジトリはHelidon.gitを選択し、Branchはmasterを選択しましょう。

Stepsタブでは、Add StepドロップダウンからDocker loginDocker buildおよびDocker pushステップを追加します。
Docker loginステップには、DockerHubのユーザー名パスワードを入力します。DockerHubをレジストリにするため、Registry Hostは空のままにしておきましょう。
Docker buildステップでは、<DockerHubユーザー名>/helidonmicroをImage Nameとして入力し、Version Tagには1.0を入力します。フルのイメージ名は<DockerHubユーザー名>/helidonmicro:1.0と表示されます。

Docker pushステップでは、<DockerHubユーザー名>/helidonmicroをImage Nameとして入力し、Version Tagには1.0を入力します。そうしたらSaveボタンをクリックしましょう。

HelidonマイクロサービスDockerコンテナをデプロイするビルドジョブを作成する前に、app.yamlファイルを編集し、Dockerイメージ名を修正しておく必要があります。編集するにはGitページに移動し、Helidon.gitリポジトリを選択し、app.yamlファイルリンクをクリックしましょう。

鉛筆のアイコンをクリックして編集します。

イメージ名を<DockerHubユーザー名>/helidonmicro:1.0に更新し、Commitボタンをクリックしてコードの変更をmasterブランチにコミットします。

別のジョブを作成するため、Buildsページに移動して+Create Jobボタンをクリックします。
New Jobダイアログで、NameにDeployHelidonと入力し、Kubectlを持ったTemplateを選択してCreateボタンをクリック。このビルドジョブはBuildHelidonビルドジョブでビルドされたDockerイメージをKubernetesクラスターにデプロイします。

DeployHelidonビルドジョブを設定するにあたりまずやることは、コードの所在するリポジトリを指定して、作業しているブランチを選択することです。Gitタブで、ドロップダウンからGitを追加し、Helidon.gitをGitリポジトリとして選択し、ブランチにはmasterを選択しましょう。

StepsタブではAdd StepドロップダウンからOCIcliUnix Shellを選んでください。このブログリンクからOCIcliの設定値をどのように決めればいいかを参照してください。その後、Unix Shellビルドステップで、次のスクリプトを入力してください。Kubernetes Cluster IDはOracle Cloud Infrastructureコンソールから入手できます。
1
2
3
4
5
6
7
8
9
10
mkdir -p $HOME/.kube
oci ce cluster create-kubeconfig --cluster-id <oracle cluster="" container="" engine="" for="" kubernetes="" ocid=""> --file $HOME/.kube/config --region us-ashburn-1
export KUBECONFIG=$HOME/.kube/config
 
kubectl create -f app.yaml
sleep 30
kubectl get services helidon-quickstart-se
kubectl get pods
kubectl describe pods
</oracle>

終わったら、Saveボタンをクリックします。

ビルドパイプラインの作成

BuildsページのPipelinesタブに移動し、+Create Pipelineボタンをクリックします。

Create Pipelineダイアログでは、NameHelidonPipelineといったように入力し、Createボタンをクリック。
BuildHelidonDeployHelidonビルドジョブをドラッグアンドドロップして連結します。

ビルドジョブ間を結合しているリンクをダブルクリックし、Result ConditionとしてSuccessfulを選択したらApplyボタンをクリック。

以下のようにBuildボタンをクリックして、ビルドパイプラインを実行してみます。BuildHelidonビルドジョブがまず実行され、成功すれば、DeployHelidonビルドジョブが次に実行されてOracle Cloud上のKubernetesクラスターにコンテナがデプロイされます。

ビルドパイプライン内のジョブの実行が終了したら、Jobsタブに移動してDeployHelidonビルドジョブのリンクをクリックします。次にビルド実行のlogアイコンをクリックすると、サービスとデプロイメントが成功したことを示すメッセージが表示されるでしょう。ここでは以下のように、helidon-quickstart-seサービスとデプロイメントがKubernetes上で作成されたログを検索して、マイクロサービスにアクセスするためのパブリックIPアドレスポート番号を探しましょう。


ログから見つけたIPアドレスとポート番号を以下のフォーマットのURLでブラウザに入力します:
http://<retrieved IP address>:<retrieved port>/greet
すると、ブラウザに”Hello World!”のメッセージが表示されるでしょう。


というわけで、Oracle Developer CloudがあなたのHelidonベースのマイクロサービスの一連のDevOpsライフサイクル管理をどのように手助けしてくれるのか、また、ビルドとOracle Container Engine for Kubernetesへのデプロイがどれほど簡単にできるのかがおわかりいただけたでしょう。
To learn more about other new features in Oracle Developer Cloud, take a look at the What's Newin Oracle Developer Cloud Service document and explore the links it provides to our product documentation. If you have any questions, you can reach us on the Developer Cloud Slack channel or in the online forum.
Oracle Developer Cloudの新しい機能についてもっと知りたい場合は、ドキュメントのWhat's Newをチェックしてそのリンク先のドキュメントを読んでみてください。質問があればDeveloper Cloud Slack channelか、オンラインフォーラムでどうぞ。
Happy Coding!

[Cloud, Java] OCIでOracle Javaをインストールする方法/How to Install Oracle Java in Oracle Cloud Infrastructure

原文はこちら
https://blogs.oracle.com/developers/how-to-install-oracle-java-in-oracle-cloud-infrastructure

Oracle JavaサポートおよびアップデートはOracle Cloud Infrastructureに含まれています

Oracleの広範に利用されており実績のあるJava Development KitであるOracle Javaが追加費用なしでOracle Cloud Infrastructureのサブスクリプションに含まれるようになったことを最近お知らせしました。
このブロクポストでは、OCI Compute Shape上で稼働するOracle Linuxに、RPMが利用可能なOCI内のyumサーバーを使ってOracle Javaをインストールする方法をご紹介します。

Oracle Javaのインストール

Oracle Java RPMはOCI内でアクセス可能な、Oracle Linux yumサーバーのol7_oci_includedリポジトリに置かれています。
このリポジトリを有効化するには以下のコマンドを実行します:
1
$ sudo yum install -y --enablerepo=ol7_ociyum_config oci-included-release-el7
この記事を書いている時点では、このリポジトリにはOracle Java 8、11および12が含まれていました。
1
2
3
4
5
6
$ yum list jdk*
Loaded plugins: langpacks, ulninfo
Available Packages
jdk-11.0.3.x86_64                                      2000:11.0.3-ga                                           ol7_oci_included
jdk-12.0.1.x86_64                                      2000:12.0.1-ga                                           ol7_oci_included
jdk1.8.x86_64                                          2000:1.8.0_211-fcs                                       ol7_oci_included
Oracle Java 12のバージョン12.0.1をインストールするには以下のコマンドを実行します:
1
$ sudo yum install jdk-12.0.1
Javaのバージョンを確認してみましょう:
1
2
3
4
$ java -version
java version "12.0.1" 2019-04-16
Java(TM) SE Runtime Environment (build 12.0.1+12)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)

複数のJDKバージョン利用時のデフォルトの設定

If you install multiple version of the JDK, you may want to set the default version using alternatives. For example, let’s first install Oracle Java 8:
もし複数のバージョンのJDKを利用している場合、デフォルトバージョンをalternativesを使って設定したいかもしれません。例えば、まずOracle Java 8をインストールしてみます:
1
$ sudo yum install -y jdk1.8
alternativesコマンドを実行すると、ふたつのプログラムがjavaとして提供されていることが表示されます:
1
2
3
4
5
6
7
8
$ sudo alternatives --config java
 
There are 2 programs which provide 'java'.
 
  Selection    Command
-----------------------------------------------
*+ 1           /usr/java/jdk-12.0.1/bin/java
   2           /usr/java/jdk1.8.0_211-amd64/jre/bin/java
Selectionの2を選ぶと、JDK 1.8(Oracle Java 8)をデフォルトに設定します:
1
2
3
4
$ java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

まとめ

Oracle Cloud InfrastructureにはOracle Javaが、そしてそのサポートとアップデートが追加費用なしで含まれています。Oracle Java RPMをOCIのyumサーバーとして提供することで、インストールはとてもかんたんになっています。