一、背景
1.1アプリケーションのシステムアーキテクチャの歴史
1.2マイクロサービスとは何ですか?
起源:2014年3月からマイクロサービスの概念Martin Fowler氏は、記事「Microservices」を書きました。上述のテキスト内容:マイクロサービスアーキテクチャはアーキテクチャー・パターンであり、それはユーザーのための究極の値を提供する、互いに補完し、サービス間の協調、より小さなサービスのセットに単一のアプリケーションを提唱します。
通信:各サービスの別のプロセスで実行され、使用されて互いに通信する間サービスおよびサービス軽量通信機構(通常はHTTPベースのRESTful API)。
マイクロサービスの従来の定義:マイクロサービスは、建築様式、一つ以上のマイクロサービスにより、大規模で複雑なソフトウェアアプリケーションです。各マイクロサービスシステムは、独立して、それぞれのマイクロサービスが疎結合されている間に配備されてもよいです。各マイクロは、タスクの完了に集中するだけに役立ちます。
元の単一のプロセス・サービスと比較して、二つ以上のサービスプロセスに分割され、互いの間の呼関係が存在する完全なサービスの元のプロセスは、「マイクロ・サービス」です。(マイクロサービスは、比較概念ではなく、単一の概念です)
1.3マイクロサービスアーキテクチャの利点
- スケーラビリティ:単一のアプリケーション・アーキテクチャのビジネス機能の増加は、マイクロサービスアーキテクチャは、新しいマイクロサービスノードの添加のみを必要としながら、元のアーキテクチャに基づいてコードに比較的大きな調整を行う必要があり、および関連するサービスノードを有するマイクロ調整それはすることができます。マイクロサービスアーキテクチャは、マイクロサービスノードに応じて、容量拡張の唯一の欠如を必要としながら、ビジネスの応答性、単一のアーキテクチャ全体の拡張の必要性を向上させながら。
- 弾力:マイクロサービスアーキテクチャが起動し、サービスを停止し、当該サービスのコードを変更するだけで必要としながら、システム障害、システムの単一のアプリケーション・アーキテクチャは、固定する必要があり、スタート・ストップ・アプリケーション・コードに関連する変更する場合。その他のサービスには、メカニズムを融合、再試行して、アプリケーション・レベルのフォールトトレランスを実現することができます。
- 柔軟な技術の選択:マイクロサービスアーキテクチャ、各マイクロサービスノードの下に完全な機能のさまざまなニーズに応じて、最適なテクノロジー・スタックを選択する自由、でも単一のマイクロノードサービスの再構築すれば、コストが非常に低いです。
- より高い運用・保守効率の開発:各ノードは単一の機能に焦点を当てた単一のマイクロサービスプロセス、であり、明確に定義されたインタフェースを介してサービスの境界を明確にします。小型、低複雑に、各マイクロサービスは、高いメンテナンス性と開発効率を維持するために、完全に制御で簡単に小さなチームや個人をすることができます。
マイクロサービスアーキテクチャの利点を持つ代わりに、マイクロサービスアーキテクチャを実現するために、スプリングクラウドフレームワークを使用しての中で最も人気のマイクロブログサービスの開発フレームワーク、など春の雲。正しい理解は、マイクロベースのシステムの開発のための春のクラウドサービスフレームワークの使用は、システムが(ツールのような春の雲が、また、プロセスを「行う」する必要があります)マイクロ・サービス・アーキテクチャの利点を持っているということです。
1.4春ブーツとは何ですか?春クラウドとは何ですか?
春ブーツFrameworkは、開発プロセスを簡素化するために設計されており、Springベースのアプリケーションをセットアップする最初のピボタルチーム、によって提供される新しいフレームワークです。SpringBootフレームワークは、開発者は、もはやテンプレートコンフィギュレーションファイルを定義するために多くの労力を費やす必要がないようにアプリケーションを設定するための特定の方法を使用しています。
春の雲春ブーツ達成クラウドベースのアプリケーション開発ツールであり、それはJVMの構成管理におけるクラウドベースのアプリケーション開発、サービス登録、サービス検出、回路ブレーカ、インテリジェントなルーティング、マイクロブローカー、制御バス、グローバルロック、意思決定選挙であります、分散およびクラスタ化セッション状態管理やその他の操作は、開発の簡単な方法を提供します。
1.5マイクロサービス、春ブーツとの関係、春の雲3
- アイデア:マイクロサービスは、理論を提供するために、建築のコンセプト、マイクロサービスの設計原理、床面からの特定の技術的なガイドラインです。
- 足場:春ブーツ春ブーツに基づく高速設定の足場は、すぐに単一のマイクロサービスの開発です。
- 複数のコンポーネントのコレクション:春クラウドサービスベースの管理ツールである春ブーツは、パッケージを達成するため、春ブーツは、単一の個々のマイクロサービスを迅速、容易な統合に焦点を当てて、春のクラウドサービスは、全体的なガバナンスのフレームワークに焦点を当てます。
第二に、テクニカル分析
2.1すべてが瓶である、すべてはhttp
春ブートアプリケーションとして識別@SpringBootApplicationノートによる春ブーツ。すべてのアプリケーションは、道ジャー、展開と運用により、パッケージをコンパイルすることです。
@SpringBootApplication
public class Application {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
LOGGER.info(”启动成功!");
}
}
各ばねブートアプリケーションが埋め込まれたWebコンテナのHTTP道を通じてサービスを提供することができ、唯一のPOMファイルに春ブート・スタート・ウェブに頼る必要が、原則的には、マイクロ・サービス・アーキテクチャは、個々のノードがサービスのhttpを提供して期待することができます。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2春の起動タスクは、タスクをスケジュール設定し、タスクが開始します
春ブーツは限りメソッドを実行することができます継承CommandLineRunnerインタフェースとして、タスクを開始する必要がある場合。
@SpringBootApplication
public class ClientDataListener implements CommandLineRunner
public void run(String... strings) throws Exception {
clientInfoListenerHandler();
}
}
春ブーツは、通常のタスクを実行する必要がある場合には、単に(=「0 15 0 cronの定期的なタスクの@Scheduledメソッドを追加します ?」)の注意事項(標準のcron表現をサポート)、およびあるスタートアップクラスのサービスを@EnableSchedulingノートの増加ことができます。
@SpringBootApplication
@EnableScheduling
public class Application {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
LOGGER.info(”启动成功!");
}
}
// some class
@Scheduled(cron = "0 15 0 * * ?")
public void someTimeTask() {
***
}
2.3春のブートアクチュエータを監視
アクチュエータシステム自体が設けられたスプリングブーツのアプリケーションを監視するための成分であり、バネブートスタータアクチュエータの導入は、ばねブート開始ウェブベースに組み込むことができます。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.4春の雲コンフィグ物流センター
我々はマイクロサービスアーキテクチャを実現する場合、各マイクロサービスノードは、多数のノードは、それが中央構成サービスの確立を必要とする、維持することが非常に困難になる独自の設定データ項目を、必要とします。
春クラウドコンフィグは、2つの部分に分かれています。春のクラウドサービスプロセスとしてコンフィグサーバ、設定ファイルの春クラウドコンフィグファイルの保存場所。
2.5春クラウドユーレカサービスレジストリ
サービス登録の概念は長いマイクロサービスアーキテクチャの出現の前に、マイクロアーキテクチャのサービスはマイクロサービスノードの非常に大きな数に元の単一ノード・アプリケーションを分割してもいます。、互いの間の関係は、登録センターとして、春の雲ユーレカ非常に複雑になり、すべてのサービスが春クラウドユーレカ一元管理とアクセスに自分自身をマイクロ登録することができコール(ユーレカと異なる飼育係、原則的にはOP AOPを選択サービスの有効性をより重視)
2.6春の雲Zuulは、インテリジェントなルーティングサービスを終了します
我々はすべてのサービスが将来的にはユーレカ(サービスレジストリ)に登録されて置くときは、コールする方法の問題を伴います。春の雲Zuulは、クラウドが提供するサーバ側プロキシコンポーネントの春であるゲートウェイとして見ることができ、ユーレカによってZuulは、マッピング設定を通じて利用可能なサービスを取得するには、クライアントが実際にZuulを訪問しアクセスするために必要なサービスにアクセスする必要があります。すべてのサービスはspring.application.nameロゴによって行われ、
IPアドレスが異なっている、同じspring.application.nameは、サービスクラスタです。我々はspring.application.name同じノードを追加すると、情報通信ユーレカ介してZuulインテリジェント・ルーティングは、新しいノードを得るサービスの種類の対応能力を高めます。
2.7春の雲リボンクライアントインテリジェントなルーティング
そして、春クラウドZuulは、サーバー側のプロキシを対応する、春の雲リボンは、クライアントエージェントを提供します。プロキシサーバーでは、クライアントは、サービスの提供の物質を取得し、サービスコールを選択するためのサービスとそれらを提供するために、最終的にどのマイクロサービスノードを知っておく必要があり、クライアントエージェントノードはありません。リボンと同様のZuul、また、ユーレカ(サービスレジストリ)がインテリジェント・ルーティングを達成するために、クライアントとの通信に至ります。
2.8春の雲スルース分散トラック
2.9春の雲Zipkinコールチェーン
2.10春の雲装うのHTTPクライアント
春クラウド装うは、宣言、テンプレートベースのHTTPクライアントです。同じことが、開発者は春のクラウド装う要求リモートサービスを使用している場合、それは(統合されたリボンの負荷分散を装う)リモートメソッドであることを感じることができますローカルメソッドを呼び出すようにすることができます。
リモートサービスとローカルサービスは、マッピングを行います
@FeignClient(name = "rabbitmq-http", url = "${SKYTRAIN_RABBITMQ_HTTP}")
public interface TaskService {
@RequestMapping(value = "/api/queues", method = RequestMethod.GET)
public String query(@RequestHeader("Authorization") String token);
}
ローカルサービスを呼び出すには、リモートサービスを呼び出します
@Autowired
private TaskService taskService;
private String queryRabbitmqStringInfo() {
byte[] credentials = Base64 .encodeBase64((rabbitmqHttpUserName + ":" + rabbitmqHttpPassword).getBytes(StandardCharsets.UTF_8));
String token = "Basic " + new String(credentials, StandardCharsets.UTF_8);
return taskService.query(token);
}
2.11春の雲Hystrixブレーカー
第三に、マイクロサービスの実践
3.1我々が開発したいくつかのマイクロサービスコンポーネント - アプリケーションセンター管理
マイクロ管理センターのアプリケーションは、パッケージ、コンパイル、デプロイ、オンライン動作が開始完了、各サービスノードの停止のために登録することができます。
-zookeeperセンター3.2我々が開発したいくつかのマイクロデータクエリサービスコンポーネント
データ情報を取得するために、データのクエリ飼育係の飼育係センターアドレス、ポート、飼育係の指示によると。
3.3我々が開発したいくつかのマイクロサービスコンポーネント - マイクロサービスのヘルステストセンター
サービスの状態がDOWNマイクロを持っているか、接続タイムアウトアラームがトリガーされた発見された場合に保健センターでは、定期的に、各検出されたマイクロサービスの状態を確認してください。
3.4我々はいくつかのマイクロサービスコンポーネント開発してきた - 定期的なタスクをICC
// 在BeanPostProcessor子类中拦截
@Component
public class SkytrainBeanPostProcessor implements BeanPostProcessor, Ordered {
***
/**
* Bean 实例化之后进行的处理
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
beanPostProcessor.postProcessAfter(bean, beanName);
return bean;
}
***
}
// 拦截后获取定时任务注解
***
public Object postProcessAfter(Object bean, String beanName) {
Class targetClass = AopUtils.getTargetClass(bean);
Map annotatedMethods = MethodIntrospector.selectMethods(targetClass,
new MethodIntrospector.MetadataLookup() {
public Set inspect(Method method) {
Set scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(method,
Scheduled.class, Schedules.class);
return (!scheduledMethods.isEmpty() ? scheduledMethods : null);
}
});
if (!annotatedMethods.isEmpty()) {
String className = targetClass.getName();
for (Map.Entry entry : annotatedMethods.entrySet()) {
Method method = entry.getKey();
for (Scheduled scheduled : entry.getValue()) {
String key = className + ":" + method.getName();
String value = scheduled.toString();
taskInfos.put(key, value);
}
}
}
return null;
}
***
// 获取定时任务后注册
***
public void taskRegister() {
String nodeInfo = ipAddress + ":" + serverPort + ":";
try {
/**
* 定时任务
*/
Map infos = taskInfos;
for (Entry item : infos.entrySet()) {
String taskId = nodeInfo + item.getKey();
String taskParameter = item.getValue();
JSONObject info = new JSONObject();
info.put("taskId", taskId);
info.put("taskParameter", taskParameter);
info.put("applicationName", applicationName);
info.put("taskType", "schedule");
LOGGER.info(info.toString());
zooKeeperExecutor.createZKNode(SKYTRAIN_TASK_ZKNODE_PREFIX + taskId, info.toString());
}
}
catch (Exception ex) {
LOGGER.error("", ex);
}
}
***
3.5マイクロ分類サービス
- マイクロサービスプラットフォーム・コンポーネント
- 公共サービス・コンポーネント
- 基本的なサービスコンポーネント/ビジネスサービスコンポーネント
図3.6全体的なマイクロサービスのアーキテクチャ
著者:梁新
出典:テクノロジーのCreditEase研究所