Запуск Wildfly в службе приложений Azure, как настроить JGroups для репликации сеансов
Запуск Wildfly в качестве службы приложений Azure стал возможен с помощью пользовательского Java-приложения [ https://azure.microsoft.com/en-us/documentation/articles/web-sites-java-custom-upload/]. Однако узлы службы приложений не знают внутренний IP-адрес при регистрации в JGroups. Они всегда выставляют 127.0.0.1. Для того чтобы члены кластера JGroups могли взаимодействовать, нам нужен хорошо известный IP-адрес узла.
Как Wildfly может определить внутренний IP-адрес хоста, который он может использовать для регистрации в кластере JGroups?
3 ответа
По моему опыту, я думаю, вы можете попробовать использовать Azure SDK для Java, чтобы получить внутренний IP-адрес хоста из WebSiteManagementClient
,
Ниже приведен пример кода для получения внутреннего IP-адреса.
String userName = "<user-name>";
String password = "<password>";
String resourceGroupName = "<resource-group-name>";
String name = "<webapp-name>";
ServiceClientCredentials credentials = new BasicAuthenticationCredentials(userName, password);
WebSiteManagementClient webSiteManagementClient = new WebSiteManagementClientImpl(credentials);
HostingEnvironmentsOperations hostingEnvironmentsOperations = webSiteManagementClient.getHostingEnvironmentsOperations();
ServiceResponse<AddressResponse> serviceResponse = hostingEnvironmentsOperations.getHostingEnvironmentVips(resourceGroupName, name);
AddressResponse addressResponse = (AddressResponse) serviceResponse.getBody();
String internalIp = addressResponse.getInternalIpAddress();
Чтобы запустить приведенный выше пример, вам нужно добавить зависимые библиотеки в ваш проект Maven, см. Зависимости ниже.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-svc-mgmt-websites</artifactId>
<version>0.9.2</version>
</dependency>
Подробнее о ключевых классах в приведенном выше примере кода см. Ниже.
Вы можете использовать код Питера (выше) для определения доступных IP-адресов, а затем установить bind_addr
в JGroups, например, так:
InetAddress bind_addr; // detect address by using Azure's SDK
JChannel ch=new JChannel("config.xml");
TP transport=ch.getProtocolStack().getTransport();
transport.setBindAddress(bind_addr);
ch.connect("mycluster");
Важно то, что вам нужно установить адрес привязки перед подключением канала.
Вы можете использовать специальное ключевое слово для bind_addr
подробнее см. [1]. Например bind_addr=match-address:192.168.1.*
попытаться выбрать IP-адрес в данной подсети.