서비스 등록 및 발견
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
+zk
와eureka
; - 다른 하나는 +
DNS协议
와 같은 보편적 입니다.k8s
coredns
- "비공개"계약
"비공개"프로토콜은 높은 수준의 사용자 정의 기능을 가지고 있으며 푸시 및 긴 연결을 지원할 수있는 zk + dubbo와 같은 특정 제품으로 더 고급 기능을 구현할 수 있습니다. 그러나 "비공개"프로토콜은 또 다른 문제를 가져옵니다. 즉, 개방성이 매우 열악하고 타사 액세스가 특정 SDK를 사용해야하며 교차 언어 기능이 좋지 않습니다. 마이크로 서비스 또는 클라우드 환경에서 언어 간 서비스 등록 및 검색은 매우 일반적인 시나리오입니다.
- 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 구성 서비스 등록 및 검색
-
새로운 Maven 프로젝트
serviceA
-
종속성 추가
에서 pom.xml
추가 Spring Cloud
, Consul
레지스트리 및 봄 부팅 종속성을 관련.
- 참고 : Spring Boot 2.1 이상 버전은 구성 변경 또는 지원 방법 변경으로 인해 Consul 서비스 등록에 문제가있을 수 있으므로 여기서 Spring Boot 버전을
2.0.4
Spring 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>
- 구성 파일 추가
에서 resources
새로운 경우 application.yml
구성 파일, 서비스 레지스트리 설정을 추가 :
server:
port: 8000
spring:
application:
name: serviceA
cloud:
consul:
host: localhost
port: 8500
discovery:
serviceName: ${
spring.application.name} # 注册到consul的服务名称
- 수업 시작
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+C
Consul을 닫음).