1.領事の紹介
Consulは、HashiCorpがGo言語を使用して開発したオープンソースの分散サービス検出および構成管理システムです。
マイクロサービスシステムのサービス管理、構成センター、制御バス、およびその他の機能を提供します。これらの各機能を個別に、または一緒に使用して、フルサービスネットワークを構築できます。つまり、Consulは完全なサービスグリッドソリューションを提供します。
多くの利点があります:以下を含みます:いかだプロトコルに基づいて、比較的簡単です。ヘルスチェックをサポートし、HTTPとDNSプロトコルを同時にサポートし、クロスデータセンターWANクラスターをサポートし、グラフィカルインターフェイス、クロスプラットフォームを提供し、Windows、Linux、Macをサポートします。
- サービス検出:HTTPとDNSの2つの検出方法を提供します
- ヘルスモニタリング:複数のプロトコル、HTTP、TCP、Docker、シェルスクリプトのカスタマイズをサポート
- KVストレージ:キーと値のストレージ方法
- 複数のデータセンター:領事は複数のデータセンターをサポートしています
- ビジュアルWebインターフェース
2.領事のインストール
チュートリアル:https://www.springcloud.cc/spring-cloud-consul.html
2.1Dockerバージョン
ダウンロードアドレス:https://www.consul.io/downloads.htmlが
遅すぎるため、dockerを使用してインストールできます
docker pull consul:1.6.1
docker run --name consul -p 8500:8500 -d consul:1.6.1
アクセス:領事がいるホストのIP:8500
2.2Windowsバージョン
- ダウンロードが完了した後、consul.exeファイルは1つだけです。ダブルクリックしてハードディスクパスの下で実行し、バージョン情報を表示します。
consul --version
- 開発モードから始める
consul agent -dev
訪問:http; // localhost:8500
3サービスプロバイダー
3.1ビルドモジュール
新しいcloud-providerconsul-payment8006モジュールを作成します
3.2POMの変更
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-demo</artifactId>
<groupId>com.lele.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-providerconsul-payment8006</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.3建l
server:
port: 8006
spring:
application:
name: consul-provider-payment
# consul注册中心地址
cloud:
consul:
host: localhost #consul所在服务器的ip
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${
spring.application.name}
heartbeat:
enabled: true
3.4メインスタートアップクラス
package com.lele.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author: lele
* @date: 2021/3/12 7:17
* @description:
*/
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class, args);
}
}
3.5コントローラー
package com.lele.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @author: lele
* @date: 2021/3/12 7:19
* @description:
*/
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping(value = "/payment/consul")
public String paymentConsul() {
return "spring cloud with consul:" + serverPort + "\t" + UUID.randomUUID().toString();
}
}
3.6テスト
8006を開始し、http:// localhost:8006 / Payment / consulにアクセスします
4.サービス消費者
4.1ビルドモジュール
新しいcloud-consumerconsul-order80モジュールを作成します
4.2 POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-demo</artifactId>
<groupId>com.lele.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumerconsul-order80</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
4.3マール
server:
port: 80
spring:
application:
name: cloud-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${
spring.application.name}
heartbeat:
enabled: true
4.4メインスタートアップクラス
package com.lele.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author: lele
* @date: 2021/3/13 18:49
* @description:
*/
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class OrderConsulMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderConsulMain80.class, args);
}
}
- ApplicationContextConfig
package com.lele.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author: lele
* @date: 2021/3/13 18:56
* @description:
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
4.5コントローラー
package com.lele.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @author: lele
* @date: 2021/3/13 19:00
* @description:
*/
@RestController
@Slf4j
public class OrderConsulController {
public static final String INVOKE_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/consul")
public String paymentInfo() {
String result = restTemplate.getForObject(INVOKE_URL+"/payment/consul", String.class);
return result;
}
}
4.6テスト
8006を起動し、http:// localhost:8006 / Payment / consulにアクセスします。
Consul80を再起動し、http:// localhost / Consumer / payment / consulにアクセスします
5.3つの登録センターの類似点と相違点
キャップ
- C:一貫性(強い一貫性)
- A:可用性
- P:パーティショントレランス(パーティショントレランス)
CAP理論は、システム全体の設計戦略ではなく、データの粒度に焦点を当てています。
クラシックCAP図
- せいぜい、2つを同時に満たすことができます。
- CAP理論の中核は、分散システムが整合性、可用性、パーティションフォールトトレランスの3つの要件を同時に満たすことはできないため、CAPの原則に従って、NoSQLデータベースはCAの原則を満たすことと、 CPの原則とAPの満足。原則の3つのカテゴリ:
- CA-シングルポイントクラスター、一貫性と可用性を満たすシステムであり、通常、スケーラビリティーはそれほど強力ではありません
- CP-満足のいく一貫性、パーティションフォールトトレランスシステム、通常、パフォーマンスは特に高くありません
- AP-可用性とパーティションのフォールトトレランスを満たすシステムでは、通常、整合性の要件が低くなる可能性があります。
AP(Eureka)
APアーキテクチャでは、ネットワークパーティションが表示されると、可用性を確保するために、システムBは古い値を返してシステムの可用性を確保できます。
結論:整合性Cの要件に違反し、可用性とパーティションのフォールトトレランス、つまりAPのみを満たしました。
CP(Zookeeper / Consul)
CPアーキテクチャ、ネットワークパーティションが表示された場合、整合性を確保するために、要求を拒否する必要があります。そうしないと、整合性を保証できません。
結論:可用性Aの要件に違反し、整合性とパーティションフォールトのみを満たします。公差、すなわちCP。