[Оригинал статьи, пожалуйста, указывайте источник для перепечатки, спасибо!]
Обнаружение службы GRPC и управление службами, в настоящее время существует два типа распространенных решений.
- Nginx + consul + consul-template
- Envoy
В этой статье кратко объясняются преимущества и недостатки двух схем.
1. nginx + консул + консул-шаблон
Этапы реализации
- Микросервис grpc зарегистрирован в консуле, и консул будет периодически отправлять тактовые импульсы микросервису grcp.
- Когда узел консула обновляется, consul-template генерирует файл nginx-consul.conf.
- Nginx Reload завершает обновление службы, обновляет при наличии запроса, UPSTREAM перенаправляет на микросервис GRPC.
Nginx-consul.conf примерно выглядит следующим образом
# nginx需要安装grpc模块
upstream User {
server 127.0.0.1:17000;
server 127.0.0.1:18000;
}
server {
listen 19000 http2;
server_name _;
location /protobuf.User {
default_type application/grpc;
grpc_pass grpc://User;
}
}
преимущество
- Простота использования, богатая документация
недостаток
- Сердцебиение консула основано только на пинге порта tcp, и невозможно определить, нормально ли отвечает служба.
- Когда узел переходит в онлайн или офлайн, требуется перезагрузка nginx. Существует определенный риск (микросервисы неизбежно будут вызывать скрытые ошибки или паники при работе. Если перезагрузка nginx требуется каждый раз для обеспечения правильной маршрутизации, я думаю, что стоимость слишком высока)
Два .envoy.
Все обнаружили что на этой картинке отсутствует реестр консула.Значит ли использование Envoy не требует реестра?Ответ зависит от ситуацииEnvoy разработан для крупномасштабной современной архитектуры SOA (Service Oriented Architecture) L7 и коммуникационной шины. Является одним из важных компонентов istio
Поскольку Envoy поддерживает динамическую настройку, он используется с пилотом в Istio.Pilot может получать онлайн-ноды через центры регистрации, такие как консул и etcd, а затем динамически регистрироваться в Envoy.
envoy.yaml
node:
id: id_1
cluster: test_cluster
watchdog:
miss_timeout: 0.2s
megamiss_timeout: 1s
kill_timeout: 0s
multikill_timeout: 0s
admin:
access_log_path: /var/log/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 10000 }
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 127.0.0.1, port_value: 19000 }
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
stat_prefix: ingress_http
codec_type: HTTP2
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/protobuf.User" }
route: { cluster: xds_cluster }
http_filters:
- name: envoy.router
clusters:
- name: xds_cluster
connect_timeout: { seconds: 1 }
type: STATIC
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
hosts:
- socket_address: { address: 127.0.0.1, port_value: 18000 }
- socket_address: { address: 127.0.0.1, port_value: 17000 }
health_checks:
- grpc_health_check: {service_name: YourServiceName}
unhealthy_threshold : 1
healthy_threshold: 1
timeout: 0.5s
interval: 0.5s
interval_jitter: 0.5s
Это конфигурация статической маршрутизации с проверкой работоспособности grpc, есть четыре ключевых момента.
- слушатели: слушайте 127.0.0.1:19000
- фильтры: фильтрация запросов grpc и маршрутизация к xds_cluster
- кластеры : кластеры хостов
- Health_checks: Check Health GRPC
Как реализовать проверку работоспособности grpc
# 引入protobuf包google.golang.org/grpc/health/grpc_health_v1并实现里面的Check和Watch方法
package health
import(
"log"
"context"
pb "google.golang.org/grpc/health/grpc_health_v1"
)
type Health struct{}
func New() *Health {
return &Health{}
}
func (h *Health) Check(ctx context.Context, in *pb.HealthCheckRequest) (*pb.HealthCheckResponse, error){
log.Printf("checking............%s", in.Service)
var s pb.HealthCheckResponse_ServingStatus = 1
return &pb.HealthCheckResponse{
Status : s,
}, nil
}
func (h *Health) Watch(in *pb.HealthCheckRequest, w pb.Health_WatchServer) (error){
log.Printf("watching............%s", in.Service)
var s pb.HealthCheckResponse_ServingStatus = 1
r := &pb.HealthCheckResponse{
Status : s,
}
for {
w.Send(r)
}
return nil
}
# 服务注册
pb.RegisterHealthServer(grpcServer, health.New())
После запуска служб envoy и grpc grpc получит пульс (пульс по умолчанию — 60 секунд, а параметр пульса yaml — 0,5 секунды).
YourServiceName — это параметр service_name для grpc_health_check в yaml, здесь вы можете настроить метод, который хотите отслеживать.
преимущество
- Легкий, ненавязчивый. Обнаружение службы активно обнаруживается посланником, grpc не требует специальной настройки,
- Поставляется с проверкой работоспособности grpc
- Динамическая конфигурация
недостаток
- Есть несколько соответствующих китайских документов
Суммировать
По сравнению с nginx я предпочитаю envoy.Во-первых, envoy — это инструмент балансировки нагрузки для микросервисов.Проверка работоспособности grpc — важная часть микросервисов.Однако у nginx есть активное сообщество, и, возможно, в ближайшем будущем их станет больше , Плагин для проверки работоспособности grpc.