Consul
Consul – это программное обеспечение с открытым исходным кодом, запущенное HashiCorp. Оно написано на языке GO и предоставляет такие услуги, как регистрация и обнаружение сервисов, конфигурация и решения для обеспечения высокой доступности для нескольких центров обработки данных. Оно поддерживает распределенную согласованность.алгоритм плотаЕго легко внедрить и интегрировать с платформами микросервисов, такими как Spring Cloud, он очень прост в использовании и обладает характеристиками простоты, простоты использования и подключаемости. Короче говоря, Consul предоставляет комплексное решение для сервисной сети.
Консул имеет следующие особенности и функции
- Обнаружение службы: клиенты Consul могут регистрировать в Consul службы, такие как службы API или службы mysql, а другие клиенты могут использовать Consul для обнаружения поставщиков услуг. Consul поддерживает использование DNS или HTTP для регистрации и обнаружения сервисов.
- Проверки работоспособности во время выполнения: клиенты Consul могут предоставлять любое количество механизмов проверки работоспособности, либо для данной службы («Да, веб-сервер вернул 200 OK»), либо для локального узла («Использование памяти ниже 90%). Эта информация может использоваться для мониторинга работоспособности кластера, а компоненты обнаружения служб могут использовать эту информацию мониторинга для направления трафика от неработоспособных служб.
- Хранилище KV: приложения могут использовать хранилище ключей и значений Consul для любых нужд, включая динамическую настройку, тегирование функций, координацию, выборы лидера и многое другое. Он принимает HTTP API, чтобы упростить его использование.
- Безопасная служебная связь: Consul может генерировать и распространять сертификаты TLS для служб для установления взаимных соединений TLS.
- Несколько центров обработки данных: Consul поддерживает несколько центров обработки данных. Это означает, что пользователям Consul не нужно беспокоиться о создании дополнительных уровней абстракции для масштабирования на несколько регионов.
Консульский принцип
На каждом узле, предоставляющем услуги, работает агент Consul.Запуск агента не требует обнаружения службы и получения настроенной пары ключ-значение KV.Агент отвечает только за мониторинг и проверку. Узлы агента могут взаимодействовать с одним или несколькими серверами Consul. Сервер Consul — это место, где данные хранятся и реплицируются. Сервер сам выбирает лидера. Хотя Consul может работать на одном сервере, рекомендуется использовать от 3 до 5, чтобы избежать сбоев, которые приводят к потере данных. Рекомендуется использовать набор серверов Consul для каждого дата-центра.
Если вашему компоненту необходимо обнаружить службы, он может запросить любой сервер Consul или любой клиент Consul, и клиент Consul автоматически перенаправит запрос на сервер Consul.
Компоненты инфраструктуры, которым необходимо обнаружить другие службы или узлы, могут запрашивать любой сервер Consul или любой прокси-сервер Consul. Прокси автоматически перенаправляет запрос на сервер. В каждом центре обработки данных работает кластер серверов Consul. Когда возникает запрос на обнаружение или настройку службы между центрами обработки данных, локальный сервер Consul перенаправляет запрос в удаленный центр обработки данных и возвращает результат.
срок
-
Агент агента: это процесс-демон, который всегда работает на каждом члене кластера Consul. Начните с запуска агента консула. Агент может работать в режиме клиента или сервера. Указать узел в качестве клиента или сервера очень просто, если нет других экземпляров агента. Все агенты могут запускать интерфейсы DNS или HTTP и несут ответственность за проверки во время выполнения и синхронизацию служб.
-
Клиент Клиент — это прокси, который перенаправляет все RPC на сервер. Этот клиент относительно не имеет гражданства. Единственное фоновое действие, выполняемое клиентом, — это присоединение к пулу сплетен в локальной сети. Это имеет минимальные накладные расходы на ресурсы и потребляет лишь небольшую часть пропускной способности сети.
-
Сервер: Сервер — это прокси с набором расширенных функций, включая участие в выборах Raft, поддержание состояния кластера, ответ на RPC-запросы, взаимодействие с другими дата-центрами, сплетни WAN и пересылку запросов лидерам или удаленным дата-центрам.
-
Центр обработки данных Хотя определение центра обработки данных очевидно, необходимо учитывать некоторые тонкие детали. Например, в EC2 считается, что несколько зон доступности составляют центр обработки данных? Мы определяем центр обработки данных как частную сетевую среду с низкой задержкой и высокой пропускной способностью. Это не включает доступ к общедоступной сети, но для нас несколько зон доступности в одном и том же EC2 могут считаться частью одного центра обработки данных.
-
Консенсус: в нашей документации мы используем Консенсус для обозначения соглашения о порядке выборов лидера и транзакций. Поскольку эти транзакции применяются к конечным автоматам, консенсус подразумевает непротиворечивость реплицированных конечных автоматов.
-
Gossip: Consul построен на базе Serf, который предоставляет полный протокол для многоадресной рассылки. Serf обеспечивает членство, обнаружение сбоев и широковещательную рассылку событий. Более подробная информация описана в документации gossip. Этого достаточно, чтобы знать, что сплетни используют случайную двухточечную связь по протоколу UDP.
-
LAN Gossip Содержит все узлы, находящиеся в одной локальной сети или центре обработки данных.
-
WAN Gossip: Он содержит только сервер. Эти серверы в основном распределены в разных центрах обработки данных и обычно обмениваются данными через Интернет или глобальную сеть. Удаленный вызов процедуры RPC. Это механизм запроса/ответа, который позволяет клиенту запрашивать сервер.
Давайте разберем эту диаграмму и опишем каждую часть. Во-первых, мы видим, что есть два центра обработки данных, помеченные «1» и «2». Consul имеет первоклассную поддержку для нескольких центров обработки данных, и, надеюсь, это распространенный случай.
В каждом центре обработки данных клиенты и серверы смешаны. Обычно рекомендуется иметь 3-5 серверов. Это основано на компромиссе между доступностью и производительностью в случае сбоя, поскольку чем больше машин подключается, тем медленнее достигается консенсус. Однако количество клиентов не ограничено, их можно легко масштабировать до тысяч или десятков тысяч.
Все узлы в одном центре обработки данных должны присоединиться к протоколу сплетен. Это означает, что протокол сплетен включает все узлы в данном центре обработки данных. Это служит нескольким целям: во-первых, нет необходимости настраивать адрес сервера на клиенте. Обнаружение выполняется автоматически. Во-вторых, работа по обнаружению отказов узлов не размещается на сервере, а распределяется. Это сделано для обнаружения сбоев, которое более масштабируемо, чем механизм сердцебиения. В-третьих, он используется в качестве уровня сообщений для уведомления о событиях, например, когда происходят выборы лидера.
Серверы в каждом центре обработки данных являются частью набора узлов Raft. Это означает, что они работают вместе и выбирают лидера, сервер с дополнительной работой. Лидер обрабатывает все запросы и транзакции. Транзакции также должны быть реплицированы на все остальные узлы в рамках консенсусного протокола. Из-за этого требования, когда сервер, не являющийся лидером, получает запрос RPC, он перенаправляет запрос лидеру кластера.
Серверный узел также действует как часть пула сплетен WAN. Этот пул отличается от пула LAN тем, что он оптимизирован для более высокой задержки в Интернете и содержит только другие серверные узлы Consul. Цель этого пула — позволить центрам обработки данных обнаруживать друг друга с минимальным вмешательством. Это позволяет новому центру обработки данных легко присоединиться к существующим сплетням WAN. Поскольку все серверы работают в этом пуле, он также поддерживает запросы между центрами обработки данных. Когда сервер получает запрос из другого центра обработки данных, он перенаправляет его на сервер с правильными данными. Затем сервер перенаправляет его локальному лидеру.
Это оставляет только очень низкую связь между центрами обработки данных, но благодаря обнаружению сбоев, кэшированию соединений и мультиплексированию запросы между центрами обработки данных выполняются относительно быстро и надежно.
Процесс обнаружения регистрации службы Консул
Консул наиболее широко используется в отрасли в качестве реестра услуг. Как и тип Eureka, консул используется в качестве реестра услуг. Процесс его регистрации и обнаружения выглядит следующим образом:
В приведенной выше блок-схеме есть три роли, а именно: реестр услуг, поставщик услуг и потребитель услуг.
- Когда поставщик услуг запущен, он отправит в Consul запрос на отправку метаданных, таких как его хост, IP-адрес, имя приложения, проверка работоспособности и т. д., в Consul.
- После получения регистрации Провайдера Консул периодически отправляет Провайдеру запрос на проверку работоспособности, чтобы проверить работоспособность Провайдера.
- Потребитель службы Потребитель получит список регистрации службы из центра регистрации Консул.Когда потребитель службы использует службу, он получит конкретный экземпляр службы (один или несколько) из списка регистрации службы в соответствии с именем приложения, тем самым завершив сервисный звонок.
Консул против Эврики
Согласно вышеуказанному таблицу сравнения центра регистрации, мы знаем, что самая большая разница между консулом и Eureka заключается в том, что консуль гарантирует CA, а Eureka гарантирует AP.
Сильная последовательность Консула приносит:
Регистрация в сервисе немного медленнее, чем в Eureka. Поскольку плотный протокол Consul требует, чтобы более половины узлов были успешно записаны, прежде чем регистрация будет считаться успешной. Когда лидер умирает, весь консул недоступен во время переизбрания. Сильная согласованность гарантируется за счет доступности.
Eureka гарантирует высокую доступность (A) и окончательную согласованность:
Регистрация службы выполняется относительно быстро, так как нет необходимости ждать, пока регистрационная информация будет реплицирована на другие узлы, и нет гарантии, что регистрационная информация реплицируется успешно. [Когда данные противоречивы](nuggets.capable/post/684490…), хотя регистрационная информация на A и B не совсем одинакова, каждый узел Eureka по-прежнему может нормально предоставлять услуги внешнему миру.Это приведет к тому, что, если A не может быть найден при запросе служебной информации, B может быть найден при запросе . Это обеспечивает доступность, но жертвует согласованностью.
Скачать и установить Консул
ссылка для скачивания:woohoo.consul.IO/downloads.Также…
Linux
Команда запуска:
nohup consul agent -server -bootstrap-expect 1 -config-dir /etc/consul.d/ -data-dir /tmp/consul -ui -bind=0.0.0.0 >> /var/opt/consul/consul.log 2>&1
Mac
# 安装
brew install consul
# 修改 Consul 启动参数
vim /usr/local/opt/consul/homebrew.mxcl.consul.plist
# 修改 ProgramArguments 部分
<key>ProgramArguments</key><array><string>/usr/local/opt/consul/bin/consul</string><string>agent</string><string>-server</string><string>-bootstrap</string><string>-advertise</string><string>127.0.0.1</string><string>-data-dir</string><string>./data</string><string>-ui</string></array>
# Consul 启动
bashbrew services start consul
Посетите веб-интерфейс
доступ:http://localhost:8500
-bootstrap:启动模式,此模式下,节点可以选举自己为leader,一个数据中心只能有一个此模式启动的节点。机群启动后,新启动的节点不建议使用这种模式。
-bootstrap-expect:设定一个数据中心需要的服务节点数,可以不设置,设置的数字必须和实际的服务节点数匹配。consul会等待直到数据中心下的服务节点满足设定才会启动集群服务。初始化leader选举,不能和bootstrap混用。必须配合-server配置。
-bind:绑定的内部通讯地址,默认0.0.0.0,即,所有的本地地址,会将第一个可用的ip地址散播到集群中,如果有多个可用的ipv4,则consul启动报错。[::]ipv6,TCP UDP协议,相同的端口。防火墙配置。
-client:客户端模式,http dns,默认127.0.0.1,回环令牌网址
-config-file:配置文件位置
-config-dir:配置文件所在文件夹,会加载其下所有配置文件,.json或者.hcl文件,加载顺序为字母表顺序;可用配置多个此配置,从而加载多个文件夹,子文件夹的配置不会被加载。
-config-format:配置文件格式,配置了,则加载相应个是的文件。不配置,则consul自动识别。
-data-dir:状态数据存储文件夹,所有的节点都需要。文件夹位置需要不收consul节点重启影响,必须能够使用操作系统文件锁,unix-based系统下,文件夹文件权限为0600,注意做好账户权限控制,
-datacenter:数据中心名称,默认dc1,一个数据中心的所有节点都必须在一个LAN中。
-dev:开发模式,去掉所有持久化选项,内存服务器模式。
-disable-host-node-id:不使用host信息生成node ID,适用于同一台服务器部署多个实例用于测试的情况。随机生成nodeID
-dns-port:v7.0以后,自定义dns 端口,覆盖默认8600
-enable-script-checks:是否允许使用脚本进行健康检查,默认false,最好配置enable acl
-encrypt:consul网络通讯加密key,base64加密,16比特;consul keygen产生。集群中的每个实例必须提供相同的,只需提供一次,然后会保存到数据文件。重启自动加载。consul节点启动后提供,会被忽略。
-hcl:添加hcl格式配置,和已有的配置合并。可以使用多个此配置。
-http-port:http api端口,覆盖默认的8500。适用于云环境指定。
-log-file:日志记录文件,如果没有提供文件名,则默认Consul-时间戳.log
-log-level:日志级别,默认info,包含:trace,debug,info,warn,err;consul monitor监控
-log-rotate-bytes:新日志文件生成大小阈值。
-log-rotate-rotation:新日志生成时间阈值
-join:需要加入的其它节点地址,可以多次使用,加入多个节点。
-retry-join:会进行加入重试,适用于认定加入节点最终会正常的情况。ipv4,ipv6,dns
-retry-interval:上述,重试间隔,默认30s
-retry-max:重试次数,默认0,无限次重试
-join-wan, -retry-join-wan, -retry-interval-wan, -retry-max-wan
-node:节点名称,默认主机名
-node-id:节点ID,
-pid-file:consul 存储 pid 的文件位置,用于主动发信号。如停止节点,重载配置等。
-protocol:使用的协议,升级时使用。consul -v查看协议版本
-raft-protocol:使用raft协议版本,默认3
-raft-snapshot-threshold:raft执行快照,提交次数阈值。一般不需要设置,io密集型应用可以调高。避免所有的节点同一时间快照。此值过大,会造成相应日志文件变大,节点重启恢复会耗费更长时间。1.1.0后,默认16384,之前8192.
-raft-snapshot-interval:执行快照间隔,影响类似上个配置,1.1.0后默认30s,之前5s。
-rejoin:节点会尝试重新加入集群。
-server:服务端节点模式。
-server-port:服务端RPC端口,v1.2.2后提供。
-non-voting-server:服务节点不参与选举,接受日志复制,用于横向扩展,服务查询请求。(类比zookeeper 观察者节点)
-syslog:linux OSX系统,配置日志输出到系统日志。
-ui:内置web ui界面。
-ui-dir:web ui 资源文件夹,使用此配置,则不需也不能使用再-ui配置。
Конкретные параметры:woohoo.consul.IO/docs/argentina/…
Порты, используемые по умолчанию:
- Сервер RPC: по умолчанию 8300, TCP.
- Serl LAN: обработка сплетен в локальной сети, по умолчанию 8301, TCP UDP.
- Serl WAN: обработка сплетен в локальной сети, по умолчанию 8302, TCP UDP.
- HTTP API: 8500, TCP.
- DNS: 8600, TCP, UDP.
Консул клиент
добавить зависимости
добавить пом-зависимости
<!--监控,提供了健康检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
Изменить настройку
bootstrap.yml
spring:
cloud:
consul:
host: xxx.xxx.xxx.xxx # 地址
port: 8500 # 端口
discovery:
register: true # 是否注册到 consul
prefer-ip-address: true # ip 优先,以ip方式注册到 consul
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address} # 实例名称
healthCheckInterval: 15s # 健康检查时间间隔
health-check-url: http://${spring.cloud.client.ip-address}:${server.port}/actuator/ # 健康检查地址
стартовый класс
Добавить к@EnableDiscoveryClient
аннотации или непосредственно@SpringCloudApplication
@SpringCloudApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
Включить элементы конфигурации, связанные с файлом конфигурации
spring:
application:
name: consul-provider
cloud:
consul:
config:
enabled: true
format: yaml
prefix: config
profile-separator: ':'
data-key: data
Посетите интерфейс управления KV-хранилищем консула на веб-странице, а именно http://localhost:8500/ui/dc1/kv, и создайте запись конфигурации.
Конфигурация динамического обновления с использованием @Refreshscope
@RestController
@RefreshScope
public class FooBarController {
@Value("${foo.bar}")
String fooBar;
@GetMapping("/foo")
public String getFooBar() {
return fooBar;
}
}
Параметр Описание
spring:
cloud:
consul:
host: xxx.xxx.xxx.xxx # 地址
port: 8500 # 端口
discovery:
register: true # 是否注册到 consul
serviceName: service-producer
prefer-ip-address: true # ip 优先,以ip方式注册到 consul
tags: version=1.0 # key-value
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address} # 实例名称
healthCheckInterval: 15s # 健康检查时间间隔
health-check-url: http://${spring.cloud.client.ip-address}:${server.port}/actuator/ # 健康检查地址
Атрибут имени зарегистрированной службыspring.cloud.consul.discovery.serviceName
, а не как в Eurekaspring.application.name=xx
.
API
-
http://localhost:8500/v1/agent/checks: получить текущее состояние работоспособности всех служб.
-
http://localhost:8500/v1/acl/bootstrap: создать токен
-
http://localhost:8500/v1/acl/create: Создать конфигурацию ACL
-
http://127.0.0.1:8500/v1/agent/service/deregister/my-service-id: Автономный сервис
Смотрите также:Детали API
ACL
Настройка сервера Консул
сгенерировать токен
Доступ с PUThttp://localhost:8500/v1/acl/bootstrap, возьмите SecretID или ID и вы обнаружите, что эти два значения на самом деле одинаковы.
{
"ID": "e292b56b-eee4-76c6-07a1-af7a81fc8c38",
"AccessorID": "3aea8f1b-f30a-5a0a-3970-14135c4ce1a3",
"SecretID": "e292b56b-eee4-76c6-07a1-af7a81fc8c38",
"Description": "Bootstrap Token (Global Management)",
"Policies": [
{
"ID": "00000000-0000-0000-0000-000000000001",
"Name": "global-management"
}
],
"Local": false,
"CreateTime": "2019-12-16T16:11:54.159198+08:00",
"Hash": "oyrov6+GFLjo/KZAfqgxF/X4J/3LX0435DOBy9V22I0=",
"CreateIndex": 1061,
"ModifyIndex": 1061
}
Измените файл конфигурации сервера Consul
По пути конфигурации, где находится служба Consul (/etc/consul.d
),Создаватьacl.json
файл, выполните следующую настройку, завершите настройку и перезапустите службу Consul.
{
"acl_master_token": "e292b56b-eee4-76c6-07a1-af7a81fc8c38",
"acl_default_policy": "deny",
"server": true,
"log_level": "INFO",
"bootstrap_expect": 1,
"client_addr": "0.0.0.0"
}
мы увидим онлайнacl_token
Элемент конфигурации, который используется для аутентификации клиента Consul.
Имя файла acl.json не должно называться произвольно, может быть проблема в том, что элементы конфигурации не распознаются
Создание правил ACL
Доступ с PUThttp://localhost:8500/v1/acl/create
Параметры запроса следующие:
{
"Name": "AgentToken",
"Type": "client",
"Rules": "node \"\" { policy = \"read\" } node \"\" { policy = \"write\" } service \"\" { policy = \"read\" } service \"\" { policy = \"write\" } key \"\" { policy = \"read\" } key \"\" { policy = \"write\" } agent \"\" { policy = \"read\" } agent \"\" { policy = \"write\" } session \"\" { policy = \"read\" } session \"\" { policy = \"write\" }"
}
Проверьте, действителен ли сертификат
# 命令行下,返回空
consul members
# 返回列表数据
consul members -token e292b56b-eee4-76c6-07a1-af7a81fc8c38
Настройка клиента Консул
Конфигурация клиента Spring Cloud Consul
Настроить на клиенте Consulacl-token
Пункт конфигурации, рекомендуется поставить его вbootstrap.yml
под файлом
spring:
cloud:
consul:
discovery:
enabled: true
healthCheckPath: ${management.server.servlet.context-path}/health
healthCheckInterval: 15s
prefer-ip-address: true
register: true
acl-token: e292b56b-eee4-76c6-07a1-af7a81fc8c38
host: localhost
port: 8500
Rules
Элемент описания конфигурации правила на третьем шаге выше.
Policy | Scope |
---|---|
agent |
Utility operations in the Agent API, other than service and check registration |
event |
Listing and firing events in the Event API |
key |
Key/value store operations in the KV Store API |
keyring |
Keyring operations in the Keyring API |
node |
Node-level catalog operations in the Catalog API, Health API, Prepared Query API, Network Coordinate API, and Agent API |
operator |
Cluster-level operations in the Operator API, other than the Keyring API |
query |
Prepared query operations in the Prepared Query API |
service |
Service-level catalog operations in the Catalog API, Health API, Prepared Query API, and Agent API |
session |
Session operations in the Session API |
Включая вопросы недействительности токена, описания параметров и т. д., вы можете просмотретьКонсул Контроль доступа (ACLS).
Смотрите также:Официальная конфигурация ACL
Безопасность веб-интерфейса Consul
Консул сам по себе не обеспечивает гарантии безопасности веб-интерфейса. Пока это позволяет брандмауэр, любой человек во внешней сети также может получить доступ к его веб-интерфейсу, что опасно. Здесь мы используем базовыйauth_basic
Для обеспечения безопасности веб-интерфейса консула решение кратко описано следующим образом:
-
Сервер, на котором работает агент-консул в режиме сервера, настраивает сетевую политику, которая разрешает другим узлам в интрасети получать доступ только к его порту 8500.
-
Узел, на котором работает агент консула в режиме клиента, если он откроет веб-интерфейс, будет привязан только к адресу 127.0.0.1; он может подключиться к агенту сервера консула через порт 8500, но при использовании функций, связанных с консулом, токен клиента или должен использоваться токен управления.
-
Используйте nginx или apache в качестве обратного прокси-сервера в интрасети для порта 8500 узла агента сервера consul и настройте его в nginx или apache
auth_basic
Сертификация. обратный прокси иauth_basic
Конфигурация аутентификации выглядит следующим образом:yum install -y httpd-tools htpasswd -c /etc/nginx/htpsswd consul_access # 执行后会要求你输入密码,完了就完成了账号密码的生成 # 下面以配置nginx示例,apache的配置类似 upstream consul { server 10.12.142.216:8500; server 10.12.142.217:8500; server 10.12.142.218:8500; } server { listen 18500; server_name consul.xxxx.com; location / { proxy_pass http://consul; proxy_read_timeout 300; proxy_connect_timeout 300; proxy_redirect off; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/htpasswd; } }
-
Настройте сетевую политику, разрешите доступ только к обратному прокси-адресу nginx во внешней сети, вам нужно ввести
auth_basic
Аутентификационная информация, а при использовании функций, связанных с консулом, должен использоваться клиентский токен (в принципе управляющий токен нельзя выводить во внешнюю сеть).
Конфигурация Spring Cloud Consul
основные параметры
элемент конфигурации | По умолчанию |
---|---|
spring.cloud.consul.enabled | true |
spring.cloud.consul.host | localhost |
spring.cloud.consul.port | 8500 |
Для других конфигураций параметров см.:Spring Cloud Consul от входа до мастерства
проблема
1. Есть критическая проблема
Причина может быть в том, что нет ссылкиspring-boot-starter-actuator
Зависимость приводит к
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2,Spring Cloud Consul
Сообщение об ошибке следующее, причина в том, что в приложении СЦ нет настроекacl-token
, к бутстрапу и приложению это не имеет никакого отношения, если проблема все же есть, то можно проверить правильность имени конфигурационного файла или отладить операцию инициализации конфигураций в классе ConsulDiscoveryProperties.
com.ecwid.consul.v1.OperationException: OperationException(statusCode=403, statusMessage='Forbidden', statusContent='Permission denied')
Расширенное чтение
Полное руководство по гринвичской версии Spring Cloud Consul
микросервисная система springcloud (2) - 2.0G версия построения регистрационного центра Consul