마이크로 서비스의 "Cosul 서비스 등록 및 검색"

서비스 등록 및 발견

Consul은 마이크로 서비스의 프레임 워크이자 서비스 등록 및 검색을위한 솔루션입니다. Consul에 대해 이야기하기 전에 그것이 무엇인지 봅시다 服务注册与发现.

마이크로 서비스 시스템에서 서비스 등록과 서비스 검색은 두 가지 핵심 모듈입니다. 서비스 A가 서비스 B를 호출하면 서비스 검색 모듈을 통해 서비스 B를 찾아야하며 서비스 B IP和端口列表의 인스턴스는 시작될 때 서비스 IP 및 포트를 서비스 레지스트리에 등록해야합니다. 일반적인 구조는 다음과 같습니다.

즉, ServiceA는로되어 ServiceRegistry를 찾을 필요가 “发现”ServiceB가되어 ServiceRegistry에가 시작할 때마다 자신의 서비스를 보낼 필요가 있지만, ServiceB ip+port“注册”ServiceB합니다.

서비스 등록

현재, 인기 레지스트리가 더 일반적이다 zookeeper, ectd, consul, eureka등.

일반적으로 세 가지 등록이 있습니다 自注册서비스 : 第三方注册, 注册中心主动同步,.

  • 자체 등록
    자체 등록은 이름에서 알 수 있듯이 服务提供方서비스 시작시 서비스 IP와 포트를 등록 센터 전송하고 心跳方式건전한 상태를 유지하는 것입니다. 서비스 오프라인 상태가되면 해당 데이터는 자동으로 삭제됩니다. . 일반적인 예는 eureka클라이언트를 사용하여 마이크로 서비스를 게시하는 것입니다.
  • 제 3 자 등록
    제 3 자 등록은 서비스가 시작되거나 중지 될 때 레지스트리에 서비스 데이터를 추가하거나 삭제하는 제 3 자 시스템의 존재를 의미합니다. 일반적인 사용법은 devops시스템 또는 컨테이너 스케줄링 시스템이 등록 센터 인터페이스 등록 서비스를 적극적으로 조정하는 것입니다.
  • 활성 등록 센터 동기화
    타사 등록 방법과 유사하게 활성 등록 방법은 등록 센터와 스케줄링 또는 게시 시스템이 연결되어 최신 서비스 IP 목록을 능동적으로 동기화하는 것을 의미합니다. 예를 들어 kubernetes시스템 coredns구독 api server데이터 있습니다 .

서비스 발견

실제로 서비스 호출을 시작하기 전에 호출자는 레지스트리에서 사용할 수있는 해당 서비스 IP和端口列表, 즉 服务发现. 서비스 검색은 애플리케이션의 침입 성에서 두 가지 범주로 나눌 수 있습니다.

  • 이 SDK 기반
    서비스의 검색 방법은 사업에 방해되는 서비스 호출을 구현하기 위해 해당 SDK에 의존하고 명시 적으로 SDK 코드를 호출하는 호출자가 필요합니다. 전형적인 예는 eureka, zookeeper
  • DNS 기반
    DNS 자체는 도메인 이름 확인 시스템으로, 두 당사자가 포트, 직렬화 프로토콜 등에 동의하는 것과 같은 간단한 서비스 검색 시나리오를 충족 할 수 있습니다. 그러나 이것은 실제 마이크로 서비스 시나리오의 요구 사항을 충족시키지 못합니다. 최근에는 업계에서 DNS 기반 서비스 검색이 제안되었습니다.

서비스 검색 상호 작용 프로토콜

마이크로 서비스 아키텍처에서 서비스 등록 및 검색을위한 통신 프로토콜은 크게 두 가지 범주로 나눌 수 있습니다.

  • 하나는 “私有”协议같은 dubbo+ zkeureka;
  • 다른 하나는 + DNS协议와 같은 보편적 입니다.k8scoredns
  1. "비공개"계약

"비공개"프로토콜은 높은 수준의 사용자 정의 기능을 가지고 있으며 푸시 및 긴 연결을 지원할 수있는 zk + dubbo와 같은 특정 제품으로 더 고급 기능을 구현할 수 있습니다. 그러나 "비공개"프로토콜은 또 다른 문제를 가져옵니다. 즉, 개방성이 매우 열악하고 타사 액세스가 특정 SDK를 사용해야하며 교차 언어 기능이 좋지 않습니다. 마이크로 서비스 또는 클라우드 환경에서 언어 간 서비스 등록 및 검색은 매우 일반적인 시나리오입니다.

  1. DNS 프로토콜

DNS 프로토콜은 "오래된"프로토콜이며 가장 기본적이고 일반적인 프로토콜 중 하나입니다. DNS 프로토콜을 기반으로 한 서비스 검색은 다재다능하며 거의 모든 언어에 원활하게 액세스 할 수 있습니다. "개인"프로토콜의 서비스 검색과 비교할 때 DNS 프로토콜을 기반으로하는 서비스 검색에는 포트 문제 및 언어 프레임 워크의 캐싱 문제와 같은 해결해야 할 몇 가지 문제가 있습니다.

영사

Consul은 분산 시스템의 서비스 검색 및 구성을 구현하는 데 사용되는 HashiCorp에서 출시 한 오픈 소스 도구입니다. 다른 솔루션은 분산 서비스 등록에 내장 된 프로그램보다 "원 스톱"의 영사 발견과 비교 服务注册与发现框架,, 分布一致性协议实现, 健康检查, Key/Value存储, 多数据中心方案기타 도구에 의존하는 더 이상 필요 (등 사육사, 등), 상대적으로 사용하기 간단합니다.

영사는 이동 언어로 작성, 그래서 자연의 이동성 (지원이 Linux, Windows그리고를 Mac OS X) 설치 패키지는 배포 편리하고 실행 파일이 포함되어 Docker다른 경량 컨테이너 원활하게 작동 할 수 있습니다.

영사 설치

Consul 공식 웹 사이트를 방문하여 운영 체제 유형에 따라 최신 버전의 Consul을 다운로드하도록 선택하십시오. 다운로드 주소는 https://www.consul.io/downloads.html입니다.
여기에 사진 설명 삽입
다운로드 된 zip압축 패키지 압축 해제 후 exe실행 파일입니다.

영사 시작

터미널 consul은 실행 파일이 있는 폴더에 들어가서 다음 명령을 실행하여 시작합니다.

consul agent -dev

시작 프로세스 정보는 다음과 같습니다.

[superfarr@19:20:59]:~->cd /Users/superfarr/Documents/iCollections/casaba/consul[superfarr@19:21:08]:~/Documents/iCollections/casaba/consul->consul agent -dev
==> Starting Consul agent...
           Version: '1.8.2'
           Node ID: 'f011f480-5d47-e343-c26a-6bbd32675721'
         Node name: 'superfarrdeMacBook-Pro.local'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

==> Log data will now stream in as it occurs:

    2020-10-11T19:21:18.633+0800 [DEBUG] agent: Using random ID as node ID: id=f011f480-5d47-e343-c26a-6bbd32675721
    2020-10-11T19:21:18.638+0800 [WARN]  agent: Node name will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.: node_name=superfarrdeMacBook-Pro.local
    2020-10-11T19:21:18.650+0800 [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:f011f480-5d47-e343-c26a-6bbd32675721 Address:127.0.0.1:8300}]"
...

시작에 성공하면 http : // localhost : 8500을 방문합니다. 아래 그림과 같이 Consul 서비스 관리 인터페이스가 보이면 레지스트리 서버가 정상적으로 서비스를 제공 할 수 있음을 의미합니다.
여기에 사진 설명 삽입

프로젝트 예 : SpringBoot 구성 서비스 등록 및 검색

  1. 새로운 Maven 프로젝트serviceA

  2. 종속성 추가

에서 pom.xml추가 Spring Cloud, Consul레지스트리 및 봄 부팅 종속성을 관련.

  • 참고 : Spring Boot 2.1 이상 버전은 구성 변경 또는 지원 방법 변경으로 인해 Consul 서비스 등록에 문제가있을 수 있으므로 여기서 Spring Boot 버전을 2.0.4Spring Cloud 버전으로 조정합니다 Finchley.RELEASE.
<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hory</groupId>
    <artifactId>service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <!-- spring boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- spring-boot-admin -->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-server</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-server-ui</artifactId>
            <version>2.0.4</version>
        </dependency>

        <!--consul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    </dependencies>

    <!--spring cloud-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  1. 구성 파일 추가

에서 resources새로운 경우 application.yml구성 파일, 서비스 레지스트리 설정을 추가 :

server:
  port: 8000
spring:
  application:
    name: serviceA
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        serviceName: ${
    
    spring.application.name}	# 注册到consul的服务名称
  1. 수업 시작

java 디렉토리에 새 패키지를 만들고 패키지에 com.hory.serviceA새 시작 클래스를 만듭니다 ServiceApplication.

@EnableDiscoveryClient서비스 검색 지원을 사용하려면 설명을 추가하십시오 .

import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @Author Hory
 * @Date 2020/10/11
 */
@EnableAdminServer
@EnableDiscoveryClient  //开启服务发现
@SpringBootApplication
public class ServiceApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(ServiceApplication.class, args);
    }
}

테스트

서비스 모니터링 서버를 시작하고 http : // localhost : 8500을 방문하여 서비스가 레지스트리에 성공적으로 등록되었는지 확인합니다.
여기에 사진 설명 삽입
테스트 후 Consul을 끄는 것을 잊지 마십시오 (터미널이 Ctrl+CConsul을 닫음).

추천

출처blog.csdn.net/weixin_44471490/article/details/109016074