Оглавление
- 概述
- Разработка среды
- API интерфейс
- Использование API
Обзор
Для распределённой системы обнаружения имён предоставляется Java-клиент в виде jar-пакета. Он предоставляет функции для запроса информации об узлах службы, отправки данных и другие возможности. В этой статье кратко описывается API интерфейса, а также объясняется, как использовать этот API, чтобы пользователи могли быстро начать работу.
Разработка среды
Информацию о том, как установить JDK и Maven, можно найти самостоятельно. Здесь она не приводится.
С помощью IDE или командной строки создайте проект Maven. Здесь в качестве примера используется Eclipse: File -> New -> Project -> Maven Project -> maven-archetype-webapp (или archetype-quickstart, в зависимости от ваших потребностей). Это создаст проект Maven.
Добавьте зависимость Tseer в файл pom.xml только что созданного проекта.
<dependency>
<groupId>qq-cloud-central</groupId>
<artifactId>Tseer-client</artifactId>
<version>1.0.1</version>
</dependency>
API интерфейс
Сначала необходимо запросить ключ API для своего бизнеса на странице управления. Этот ключ будет использоваться в качестве параметра при инициализации API. Вот как это делается:
RouterConfig.setSeerApiKey("your server's API key"); // Замените на реальный ключ API вашего сервера
Номер | Название интерфейса или класса | Описание функции |
---|---|---|
1 | RouterFactory | Класс фабрики для создания экземпляров интерфейса маршрутизации. Реализует одноэлементный паттерн, позволяя создавать экземпляры интерфейса маршрутизации двумя способами: через Agent или чистый API. |
2 | RouterConfig | Класс конфигурации для маршрутизации имён. |
3 | Router | Интерфейс маршрутизации, предоставляемый внешним пользователям для поиска узлов служб, отправки данных мониторинга и других функций. |
3.1 Инициализация интерфейса маршрутизации
Метод | Параметры | Возвращаемое значение | Класс |
---|---|---|---|
Router createAgentRouter() | Без параметров | Экземпляр Router в режиме Agent | RouterFactory |
Router createApiRouter() | Без параметров | Экземпляр Router в чистом API режиме | RouterFactory |
3.2 Получение отдельного узла службы
Обзор | Получение информации о конкретном узле службы в соответствии с указанным способом |
---|---|
Метод | Result getRouter(RouterRequest request); |
Параметры | Запрос: входные данные, содержащие информацию о запросе службы, включая имя службы, способ получения, метод балансировки нагрузки и т. д. |
Возвращаемое значение | Включает код возврата и информацию о маршруте (RouterResponse). Код возврата равен 0 для успеха, -1 для неудачи, и в случае неудачи будет содержать сообщение об ошибке. |
Примечание | Структура классов RouterRequest и RouterResponse приведена ниже. |
RouterRequest:
public class RouterRequest {
private String obj; // Имя службы для запроса, обязательно
private LBGetType lbGetType; // Способ получения: IDC, set или all (по умолчанию ALL), опционально
private String setInfo; // Информация о set, обязательна при получении через set
private LBType lbType; // Тип балансировки нагрузки, по умолчанию циклический, опционально
private long hashKey; // Ключ хеширования, обязателен при использовании хеш-балансировки
private String callModuleName; // Имя основного модуля вызова, требуется для отправки данных мониторинга, если пусто, заменяется локальным IP, необязательно (рекомендуется заполнить)
.... Опущены методы getter и setter
}
LBGetType:
public enum LBGetType {
LB_GET_IDC(0), // По IDC
LB_GET_SET(1), // По set
LB_GET_ALL(2); // Все узлы
}
LBType:
public enum LBType {
LB_TYPE_LOOP(0), // Циклический
LB_TYPE_RANDOM(1), // Случайный
LB_TYPE_STATIC_WEIGHT(2), // Статический вес
LB_TYPE_CST_HASH(3), // Хеш-балансировка
LB_TYPE_ALL(4); // Все узлы, не устанавливайте этот тип при вызове метода getRouter, иначе по умолчанию будет возвращён первый узел в списке
}
RouterResponse:
public class RouterResponse {
private ServerNode serverNode; // Узел службы
private String responseMsg; // Ответное сообщение
...
}
ServerNode:
public class ServerNode {
private String sIP; // IP службы
private int port; // Порт службы
private int timeout; // Время ожидания доступа к узлу
private boolean bTcp; // Является ли это TCP-соединением
...
}
3.3 Получение списка узлов службы
Обзор | Получение всех узлов службы в соответствии с заданным способом |
---|---|
Метод | Result getRouters(RoutersRequest request); |
Параметры | Запрос: входные данные, необходимые для получения информации о службе, включая имя службы и способ получения. |
Возвращаемое значение | Включает код возврата и информацию о маршрутах (RoutersResponse). Код возврата равен 0 для успеха, -1 для неудачи, и в случае неудачи будет содержать сообщение об ошибке |
Примечание | Классы RoutersRequest и RoutersResponse приведены ниже. |
RoutersRequest:
public class RoutersRequest {
private String obj;
private LBGetType lbGetType;
private String setInfo;
...
}
RoutersResponse:
public class RoutersResponse {
private String responseMsg;
private List<ServerNode> node; // Список узлов
...
}
3.4 Отправка данных мониторинга
Обзор | Отправка результатов вызовов служб (успех, тайм-аут, исключение, время выполнения) после завершения бизнес-запроса. Рекомендуется вызывать этот метод после каждого успешного бизнес-вызова, чтобы отправлять реальные результаты вызовов служб. Это помогает SeerAgent и чистому API обнаруживать неисправные узлы служб, а также отправлять данные на платформу мониторинга |
---|---|
Метод | Result resultReport(RouterRequest req, RouterResponse res, int ret, long timecost); |
Параметры | req: входные параметры метода getRouter. res: результат метода getRouter. ret: код возврата метода getRouter. timecost: время вызова службы (мс) |
Возвращаемое значение | Возврат значения включает в себя возврат кода и возврат информации, поясняющей сообщение. Возврат кода 0 означает успех, -1 — неудачу. |
Router router = RouterFactory.getInstance().createAgentRouter(); // Инициализация маршрута, использование режима агента. Если вы хотите использовать чистый API-способ, используйте метод инициализации в следующем комментарии.
// Router router = RouterFactory.getInstance().createApiRouter();
RouterRequest request = new RouterRequest(); // Создание запроса на поиск одного узла.
request.setObj("tencent.tencentServer.HelloService"); // Установка имени запрашиваемого сервиса, которое необходимо зарегистрировать заранее на платформе управления. Используйте фактическое имя сервиса. Обязательно.
request.setLbGetType(LBGetType.LB_GET_SET); // Установка способа получения узла, который можно выбрать по группам, IDC или получить все. По умолчанию используется ALL, опционально.
request.setSetInfo("sz.a.b"); // Информация о наборе, которая должна быть заполнена при выборе группы по набору.
request.setLbType(LBType.LB_TYPE_CST_HASH); // Выбор алгоритма балансировки нагрузки для узлов, доступных в настоящее время: циклический перебор, статический вес, случайный и согласованный хэш. По умолчанию используется циклический перебор. Опционально.
request.setHashKey((long)10086); // Ключ хэша, который должен быть заполнен при использовании метода согласованного хэша.
request.setCallModuleName("seerClientDemo"); // Имя основного модуля вызова, которое должно быть изменено при отправке данных моделирования. Выберите или оставьте пустым, используя локальный IP-адрес для заполнения. Заполните в соответствии с фактическим значением.
Result<RouterResponse> result = router.getRouter(request); // Вызов интерфейса получения узла маршрута, передача запроса в качестве параметра.
int ret_code = result.getRet(); // Возвращаемый код результата.
if (ret_code == 0) { // Если код результата равен 0, вызов успешен.
String IP = result.getData().getIP(); // Получение IP-адреса возвращаемого узла.
int port = result.getData().getPort(); // Получение порта возвращаемого узла.
boolean istcp = result.getData().isbTcp(); // Получение информации о том, использует ли возвращаемый узел TCP-связь. True означает использование TCP, false означает использование UDP.
System.out.println("get HelloService node: IP " + IP + " port " + port +
" protol " + (istcp ? " tcp": " udp"));
// Имитация вызова сервиса, доступ к возвращённому узлу.
long start_time = System.currentTimeMillis();
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
int call_result = 0; // Результат вызова возвращается, 0 указывает на успешный вызов, -1 указывает на аномалию вызова, -2 указывает на превышение времени вызова. Обратите внимание, что здесь возвращаемое значение относится к завершению вызываемого сервиса после вызова, а не к возвращаемому значению вызова интерфейса getRouter!
long timecost = System.currentTimeMillis()-start_time; // Время вызова сервиса, единица измерения — миллисекунды.
router.resultReport(request, result.getData(), call_result, timecost); // Вызов интерфейса отчёта о результатах, передача запроса, возвращаемых данных и результатов вызова вместе с информацией о времени вызова сервиса.
} else {
System.out.println(result.getData().getResponseMsg()); // Ошибка поиска маршрута, печать информации об ошибке.
System.out.println(result.getData().getIP());
}
RouterConfig.setSeerApiKey("apikey_from_ClientDemo"); // Настройка глобального ключа API, опционально, рекомендуется заполнить. Заполнить в соответствии с реальным apikey. Здесь только пример.
Router router = RouterFactory.getInstance().createAgentRouter(); // Инициализация маршрута, использование режима агента. Если вы хотите использовать чистый API-способ, используйте метод инициализации в следующем комментарии.
// Router router = RouterFactory.getInstance().createApiRouter();
RoutersRequest request = new RoutersRequest(); // Создание запроса на получение списка узлов. Обратите внимание на разницу между запросом одного узла и этим запросом.
request.setObj("tencent.tencentServer.HelloService"); // Установка имени моделируемого сервиса, который необходимо зарегистрировать заранее на платформе управления. Заполнение в соответствии с фактическим именем сервиса. Обязательно.
request.setLbGetType(LBGetType.LB_GET_SET); // Установка способа получения узлов, которые можно выбрать по группам, IDC или получить все. По умолчанию используется ALL, опционально.
request.setSetInfo("sz.a.b"); // Информация о наборе, которая должна быть заполнена при выборе группы по набору.
Result<RoutersResponse> result = router.getRouters(request);
int ret_code = result.getRet(); // Возвращаемый код результата.
if (ret_code == 0) { // Если код результата равен 0, вызов успешен.
List<ServerNode> nodes = result.getData().getNode(); // Получение списка узлов.
for (ServerNode node : nodes) {
String IP = node.getsIP();
int port = node.getPort();
boolean istcp = node.isbTcp();
System.out.println("get HelloService node: IP " + IP + " port " + port +
" protol " + (istcp ? " tcp": " udp"));
}
} else {
System.out.println(result.getData().getResponseMsg()); // Ошибка поиска маршрута, печать информации об ошибке.
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )