Іменування та виявлення gRPC
etcd надає gRPC резолвер для підтримки альтернативної системи імен, яка отримує точки доступу з etcd для виявлення gRPC сервісів. Основний механізм базується на спостереженні за оновленнями ключів з префіксом імені сервісу.
Зверніть увагу, що ця функція є експериментальною, оскільки вона залежить від пакунку google.golang.org/grpc/resolver, який досі є експериментальним у grpc-go.
Використання etcd discovery з go-grpc
Клієнт etcd надає gRPC резолвер для вирішення gRPC точок доступу з бекендом etcd. Резолвер ініціалізується клієнтом etcd:
import (
clientv3 "go.etcd.io/etcd/client/v3"
etcdnaming "go.etcd.io/etcd/client/v3/naming/resolver"
"google.golang.org/grpc"
)
...
cli, err := clientv3.NewFromURL("http://localhost:2379")
if err != nil {
// ...
}
r, err := etcdnaming.NewBuilder(cli)
if err != nil {
// ...
}
conn, gerr := grpc.NewClient("my-service", grpc.WithResolvers(r), ...)
Управління точками доступу сервісу
Резолвер etcd обробляє всі ключі з префіксом цільового розвʼязання після “/” (наприклад, “foo/bar/my-service/”) з JSON-кодованими (історично go-grpc naming.Update) значеннями як потенційні точки доступу сервісу. Точки доступу додаються до сервісу шляхом створення нових ключів і видаляються з сервісу шляхом видалення ключів.
Додавання точки доступу
Нові точки доступу можуть бути додані до сервісу через etcdctl:
ETCDCTL_API=3 etcdctl put foo/bar/my-service/1.2.3.4 '{"Addr":"1.2.3.4"}'
Метод клієнта etcd endpoints.Manager також може реєструвати нові точки доступу з ключем, що відповідає Addr:
em := endpoints.NewManager(client, "foo/bar/my-service")
err := em.AddEndpoint(context.TODO(),"foo/bar/my-service/e1", endpoints.Endpoint{Addr:"1.2.3.4"})
Щоб увімкнути балансування навантаження round-robin при підключенні до сервісу з кількома точками доступу, ви можете налаштувати підключення з внутрішнім балансувальником навантаження grpc round-robin:
conn, gerr := grpc.NewClient("etcd:///foo", grpc.WithResolvers(etcdResolver),
grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`))
Видалення точки доступу
Хости можуть бути видалені з сервісу через etcdctl:
ETCDCTL_API=3 etcdctl del foo/bar/my-service/1.2.3.4
Метод клієнта etcd endpoints.Manager також підтримує видалення точок доступу:
em := endpoints.NewManager(client, "foo/bar/my-service")
err := em.DeleteEndpoint(context.TODO(), "foo/bar/my-service/e1")
Реєстрація точки доступу з орендою
Реєстрація точки доступу з орендою гарантує, що якщо хост не зможе підтримувати keepalive heartbeat (наприклад, його машина вийде з ладу), він буде видалений з сервісу:
lease=`ETCDCTL_API=3 etcdctl lease grant 5 | cut -f2 -d' '`
ETCDCTL_API=3 etcdctl put --lease=$lease my-service/1.2.3.4 '{"Addr":"1.2.3.4"}'
ETCDCTL_API=3 etcdctl lease keep-alive $lease
У golang:
em := endpoints.NewManager(client, "foo/bar/my-service")
err := em.AddEndpoint(context.TODO(), "foo/bar/my-service/e1", endpoints.Endpoint{Addr:"1.2.3.4"})
Атомарне оновлення точок доступу
Якщо потрібно змінити кілька точок доступу в одній транзакції, можна використовувати endpoints.Manager безпосередньо:
em := endpoints.NewManager(c, "foo")
err := em.Update(context.TODO(), []*endpoints.UpdateWithOpts{
endpoints.NewDeleteUpdateOpts("foo/bar/my-service/e1", endpoints.Endpoint{Addr: "1.2.3.4"}),
endpoints.NewAddUpdateOpts("foo/bar/my-service/e1", endpoints.Endpoint{Addr: "1.2.3.14"})})
Зворотний зв’язок
Чи була ця сторінка корисною?
Раді чути! Будь ласка, повідомте нам, як ми можемо зробити краще.
Дуже шкода це чути. Будь ласка, повідомте нам, як ми можемо зробити краще.