Spring Cloud(5):領事サービスの登録と発見

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。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/houwanle/article/details/114681143