マイクロサービスの概要
1.マイクロサービスとは何ですか
単にシステムアーキテクチャ上で、マイクロサービスのデザインを入れて、その目的は、複数の小さなサービスにオリジナルの独立したシステムを分割することで、間のサービスに基づいて、別のプロセスで実行これらの小さなサービス、 RPC通信のコラボレーション。小さなサービスに各分割は構築する特定のシステムまたはカップリングビジネス機能のいくつかの高度を中心に展開し、各サービスは、独自のデータストレージ(指定された優先順位、各マイクロサービスであり維持します独自のデータベースインスタンス)、事業開発、自動化されたテストケースと独立した展開機構を持っています。
マイクロ2.サービスの特徴
- サービスコンポーネント:別のシステムは複数の小さなサービスに分割されます。
- 事業セグメントにサービス:マイクロサービス事業ではなく分裂する能力、または(例えば、マイクロ・サービス・コンポーネントに直接組み込まプロジェクトキャッシング機能を行う前に、のような)他の要因よりも、分割しなければなりません。
- インテリジェントなエンドポイントとダムのパイプ:RPCサービス間のコールの仕方によっては、多くの場合、2つのサービスを使用しての方法を呼び出します:
最初:RESTflのAPI情報伝達やサービスの呼び出しを達成するために、HTTPまたは軽量のメッセージングプロトコルを使用してトリガー。
第二:軽量メッセージ・バス上のメッセージを渡すことは、非同期スイッチングRabbitMQの同様の数は、信頼性の高いミドルウェアを提供しています。 - 地方分権のプロセス:異なるマイクロサービスコンポーネントも別の言語を選択することができます別の技術的な解決策を選択することができます。唯一のより良い、より強力な大規模システムを作成するために、異なる業務処理能力のために、異なる言語を利用するために、透明の技術プラットフォームを実現することもできます。
- 分散管理データ:分散データベースの使用は、異なるマイクロサービス・コンポーネントは、独自の別個のデータベースインスタンスを有します。分散型データ管理指向のデータ管理は、より詳細にすることができますが、より適切な技術を採用することにより、データの格納を可能にし、最適なパフォーマンスを実現。データが異なるデータベースインスタンスに格納されているので、データの整合性の問題が解決すべきマイクロサービスアーキテクチャの一つとなっています。
- インフラの自動化:自動テストなので、上の自動展開(解放マルチ環境のために面倒な繰り返し動作および構成管理を退屈)と(展開前に腕のすべてのショットは、できるだけ多くを実行しているソフトウェアの信頼を得るために)。
- フォールトトレラント設計:マイクロサービスアーキテクチャ、障害発生源と可能な自動復旧サービスの迅速な検出が設計されており、考慮しなければなりません。
- デザインの進化:サービスの薄いスプリット加算をオフに開始する必要はありませんが、それは業務システムの開発と、圧力がサービスを変更しないことができたり、安定したモジュールは、アクションをマージ分割します。
2.微小欠陥のサービス
- 運用・保守コストが増大します。これは、現在またはマイクロ管理サービスの数十に、システムの唯一の単一のスタンドアロン運用・保守を持っていた、避けられません。
- インターフェースの一貫性。修飾された微小なサービス・インターフェースは、変更を行うために、同時に、発信者B、Cのサービスを必要とします。(このアジャイルフローの開発の文脈で行うことはほとんどハード)開閉の原則に厳密に準拠した開発プロセスを除きます。
- 分散型の複雑さ。ネットワーク遅延、分散トランザクション、非同期メッセージ。
ヒント:分散型自体は難しく、非常に大きな達成するための取引なので、マイクロサービスアーキテクチャは、我々は、各サービス間の通話「ノー取引」を強調し、そして最終的にあるだけの状態のデータの整合性、データ処理の要件については、これは、同じであってもよい。エラーデータは、最終的な一貫性に誤っできるように、補償機構によって処理するために、プロセス中に見つかった場合。
二、春の雲のプロフィール
春の雲春ブーツ達成サービスベースのマイクロアーキテクチャの開発ツールです。構成管理、サービス管理、サーキットブレーカー、それはマイクロサービスアーキテクチャ、マイクロブローカー、制御バス、グローバルロック、意思決定のキャンペーン、分散およびクラスタ化されたセッション状態管理や他の操作になるインテリジェントなルーティングは、開発の簡単な方法を提供します。
春の雲が表示され、巨大なサポートマイクロアーキテクチャと強力な技術サポートサービスということができます。多くのフレームが広く実施されていると実績のある部品を実装するための基礎として、だけでなく、システムごとにいくつかの非常に良いエッジ成分を作成している統合し、マイクロサービスアーキテクチャの実装に対処するための包括的な枠組みを解決します。例えばダボとSpringクラウド差:ダボ開発プロセスの使用、分散構成センター(百度のDisconfなどのNetflixのArchaius、qconfの360、淘宝ダイヤモンド)、リンク(Jingdongのハイドラ、TwitterのトラッキングZipkin、など)...必要なコンポーネントのシリーズは、私は、サードパーティの統合に行くが、また、バージョンの互換性の問題を考慮する必要があります。分散構成(コンフィグ)の中心部、追跡リンク(スルース)、バッチ:春クラウドは「家族のバケット」、マイクロサービス・ソリューションである、私は「オリジナルのコンポーネント」を見つけることができるほぼすべてのマイクロサービス・コンポーネントを、必要としますタスク(タスク)、そしてそれは完全に互換性があることができます。
三、ユーレカプロフィール
サービス管理システムは、主に、様々なマイクロサービス登録およびディスカバリ・インスタンスを自動化するために使用されるほとんどのマイクロサービスアーキテクチャコアと基礎モジュール、と言うことができます。3つのコアの役割におけるサービスのガバナンス体制:サービスレジストリ、サービスプロバイダとサービスコンシューマ。ユーレカServerは、サービスレジストリ春の雲のを仮定しました。次のストロークユーレカServerサービスのガバナンス・プロセスを撫でました。
- 登録サービス:起動時に「サービスプロバイダーは、」RESTを送信することにより要求されるいくつかは、独自のメタデータ情報サービス(ホスト名およびなど)を持参しながら、ユーレカサーバーに自分自身を登録します。RESTユーレカサーバがこの要求を受信した後、メタデータ情報は、第一の層は、サービス名であることを特徴とする請求マップ、キーの二層構造に格納され、第2層の鍵は、特定のインスタンス名のサービスです。
- 同期サービス:サービスプロバイダがレジストリにサービス登録要求を送信する場合、それは別の登録要求を転送する、互いにサービス(ユーレカサーバ可用性シーン)サービスレジストリとして登録をクラスタの中心に接続されているように、サービスレジストリ間の同期を達成するためです。、2つのサービスプロバイダは、サービス同期することによって、これらの2つの登録センターRenyiyitaiによってサービスにサービス情報を取得することができます。
- サービスリニューアル:登録サービスが終了した後、「サービスプロバイダは、」サービスのリストから除外されたサービスのユーレカServerインスタンス「タスクを拒否」を防止するために、「私は生きている」ユーレカ断絶を伝えるために、ハートビートを維持していきます。
- コンシューマーサービス:私たちは、「サービスコンシューマ」を起動すると、それが上記登録されたサービスのリストを取得するために、RESTサービスレジストリに要求を送信します。キャッシュリストは30秒ごとに1回更新される一方で、パフォーマンス上の理由から、ユーレカSererは、戻って、クライアントへのサービスの読み取り専用のリストを保持しています。
- サービスコール:サービスのリストを取得した後、「サービスコンシューマ」、あなたはサービス名によってサービスおよびメタデータ情報、そのインスタンスを提供するために、特定のインスタンス名を取得することができます。これらのサービスの詳細クライアントがリボンでのコールの特定のインスタンスは、自分のニーズに応じてクライアントの負荷分散を実現するために、コールのポーリングをデフォルトするかを決めることができるようにインスタンスが、ありますので。
- 組立ラインオフサービス:シャットダウン、通常の動作のためのサービスインスタンスは、それはRESTサービスをオフラインユーレカサーバに要求をトリガするには、サービスレジストリに語った:「私は組立ラインをオフにします。」サーバがリクエストを受信した後、サービスのステータスが(DOWN)オフラインにすると、オフラインイベントを広げるために。
- 失敗を除く:時々 、私たちのサービスインスタンスは、必ずしも通常のオフラインは、おそらくメモリオーバーフロー、ネットワーク障害とサービスが動作しない他の理由に、サービスセンターは、の「組立ラインオフサービス」登録要求を受信していないしません。スーパー(デフォルトは90秒です)の現在のリストが更新されていない場合に解消するためには、ユーレカServerは起動時にこれらのサービスを提供することはありませんサービスの一覧から、スケジュールされたタスクのインスタンスを作成し、時間にデフォルトの時間(デフォルトは60秒です)程度のサービスの外に除去。
- 自己保護機能:運転中のユーレカServerは、実際の生産環境のスタンドアロンデバッグが通常であるとき、状況はより少なく表示された場合は15分以内に85%未満では、(それが簡単である心不全の割合が満たすかどうかをカウントされますが原因これらのインスタンスは、有効期限が切れる可能な限りの登録情報を保護しないように)不安定性をネットワークに鉛、現在の登録情報のユーレカServerインスタンスは、保護されます。
四、ユーレカの戦闘
SpringBootのバージョン番号:2.1.6.RELEASE
SpringCloudバージョン:Greenwich.RELEASE
1.サービス・レジストリ
- pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
- application.yml
server:
port: 1111
eureka:
instance:
hostname: localhost
prefer-ip-address: true
client:
# 表示不向注册中心注册自己
register-with-eureka: false
# 注册中心的职责是维护实例,不需要去检索服务
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
# 是否要打开自我保护机制
enable-self-preservation: true
ユーレカの設定項目は、主に3つある:例えば、クライアント、サーバー。ホスト名、情報の特性を記述したようなメタデータのポート例を含む保守サービスインスタンス情報の「インスタンス」は、「クライアント」は、タイムアウト、キャッシュサービス時間として主登録サービス設定データ、である;「サーバー」が登録されたサービスでありますこのように自分自身を守るために上記オープンするかどうかなど、センター固有の設定、構成関連のユーレカServer構成アイテム、。
- Application.java
//启动一个服务注册中心
@EnableEurekaServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
この時点で、我々はユーレカサーバーを持っている - サービスレジストリは、より良い構築します。
2.サービスプロバイダ
- pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- application.yml
server:
port: 2222
spring:
application:
name: cloud-eureka-client
eureka:
# 服务注册相关的配置信息
client:
service-url:
defaultZone: http://localhost:1111/eureka/
instance:
# 是否优先使用IP地址作为主机名的标识
prefer-ip-address: true
このように、私たちのユーレカクライアントの一つは、ユーレカサーバーに登録します。次に、私たちは私たちのサービス情報DiscoveryClientを見つけるために試してみましょう:
// 自动化配置, 创建 DiscoveryClient 接口针对 Eureka 客户端的 EurekaDiscoveryClient 实例
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
}
@RestController
public class HelloController {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private DiscoveryClient discoveryClient;
@Value("${spring.application.name}")
private String serviceId;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String index() {
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
ServiceInstance instance = instances.get(0);
logger.info("/hello, host:" + instance.getHost() + ", serviceId:" + instance.getServiceId());
return "Hello World";
}
}
3.消費者向けサービス
サービスレジストリおよびサービスプロバイダーで、我々はそれを呼び出すRestTemplate一度サービスを使用するようにしてください!
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/ribbon-consumer")
public String helloConsumer() {
// 这里访问的是服务名,而不是一个具体的地址(为了实现负载均衡策略),在服务治理框架中,这是一个非常重要的特性。
ResponseEntity<String> result = restTemplate.getForEntity("http://cloud-eureka-client/hello", String.class);
return result.getBody();
}
}
5つの追加
- デフォルトでは、ユーレカジャージーおよびサーバーとクライアント間の通信プロトコルXStreamのJSONの交配として使用します。
- 実際には意味YAML:もう一つのマークアップ言語は、 - (それは少し笑っように見える)まだマークアップ言語です。
- SpringBoot性プロファイルで、int型$ {ランダム}構成、長い文字列または文字列値を使用してランダム値を生成します。
- {プロファイル}識別使用環境に対応する前記スプリングブーツにおいて、マルチファイル名の構成は用途向け{プロファイル}を満たすために必要とされるフォーマットを、の.properties。アクティブな環境変数を指定する--spring.profiles.active =テストパラメータで起動します。