Статьи

Приобретение и выпуск облачных серверов в Java с использованием JClouds

В этой статье мы рассмотрим пример программного приобретения и выпуска облачных серверов с использованием API-интерфейса JClouds . JClouds API работает с большим количеством облачных провайдеров, включая Amazon EC2 и Rackspace, и позволяет выполнять большое количество операций с использованием Java-кода, а не взаимодействовать с отдельными API-интерфейсами этих провайдеров. В этом примере мы используем rackspace в качестве нашего облачного провайдера.

Давайте сначала достанем баночки для jclouds. Если вы используете Maven, ниже приведены зависимости maven. Возможно, вы захотите проверить, доступны ли более новые версии, когда вы планируете реализовать это.

<dependency>
     <groupId>org.jclouds</groupId>
     <artifactId>jclouds-allcompute</artifactId>
     <version>1.5.2</version>
</dependency>
<dependency>
     <groupId>org.jclouds.driver</groupId>
     <artifactId>jclouds-sshj</artifactId>
     <version>1.5.1</version>
</dependency>
<dependency>
     <groupId>org.jclouds.driver</groupId>
     <artifactId>jclouds-log4j</artifactId>
     <version>1.5.1</version>
</dependency>

Создание вычислительной службы

Давайте создадим класс «CloudService». В конструкторе этого класса мы установим информацию API, такую ​​как имя пользователя и ключ API, а также создадим экземпляр объекта ‘compute service’.

package co.syntx.examples.jclouds;

import static org.jclouds.compute.predicates.NodePredicates.inGroup;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;
import org.jclouds.ContextBuilder;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder;

public class CloudService {

    private ComputeService compute;
    private String location;
    public static final Logger logger = Logger.getLogger(CloudService.class);

    /**
     *  Constructor for the CloudService Class. Requires you to specify the cloud provider string, datacenter location,  the username and the API Key.
     * @param provider
     * @param location
     * @param username
     * @param apiKey
     */

     public CloudService(String provider, String location, String username, String apiKey) {
        this.location = location;  
         ComputeServiceContext context = ContextBuilder.newBuilder(provider).credentials(username, apiKey)
					.buildView(ComputeServiceContext.class);
         compute = context.getComputeService();
         logger.info("Cloud Compute Service Context Created");
     }

Функция для получения сервера

Далее мы напишем функцию, которая получает серверы от нашего облачного провайдера. Параметры функции:

  • Groupname:  если вы приобретаете несколько серверов, все серверы будут иметь Groupname в качестве префикса. Это помогает в идентификации и категоризации.
  • ОС:  название операционной системы
  • osVersion : версия операционной системы
  • оперативная память: размер оперативной памяти
  • количество : необходимое количество облачных серверов
    /**
    * Acquire Servers by specifying specs
    * @param groupName
    * @param os
    * @param osVersion
    * @param ram
    * @param count
    * @throws Exception
    */
    public void aquireServer(String groupName, String os, String osVersion, Integer ram, Integer count) throws Exception {
    
         TemplateBuilder templateBuilder = compute.templateBuilder();
         Template template = templateBuilder
                             .locationId(this.location)
                             .os64Bit(true)
                             .osDescriptionMatches(os)
                             .osVersionMatches(osVersion)
                             .minRam(ram)
                             .build();
    
          logger.info("Acquiring "+ count+ " server(s).");
          Set<? extends NodeMetadata> nodes = compute.createNodesInGroup(groupName,count, template);
          logger.info(nodes.size() + " server(s) acquired!");
    }

Функция для освобождения серверов, принадлежащих группе

Вы можете освободить серверы, принадлежащие группе, за один раз. Вы также можете освободить отдельные серверы. Следующий код освобождает все серверы, принадлежащие к определенной группе.

public void releaseGroup(String groupName) throws Exception {
    logger.info("Releasing server(s) from group " + groupName);
    Set<? extends NodeMetadata> servers = compute.destroyNodesMatching(inGroup(groupName));		
    logger.info(servers.size() + " released from group " + groupName);
}

Положить его вместе

Наконец, мы создадим экземпляр нашего класса и вызовем функции, которые мы написали ранее. Укажите параметры метода в соответствии с вашей средой. Прежде чем вызывать функцию получения, ваша панель мониторинга может выглядеть примерно так.

приборная панель стойки

CloudService cloudService = new CloudService("rackspace-cloudservers-us","DFW", "yourUsername", "yourAPIKey");
cloudService.aquireServer("my-test-servers","Ubuntu","12.04",512,2);

Вызов acquServer будет блокироваться до тех пор, пока серверы не будут успешно получены. Во время приобретения ваша приборная панель будет выглядеть примерно так.

панель инструментов стойки, ожидающие сервера

Наконец, вызов функции releaseGroup освобождает полученные серверы.

cloudService.releaseGroup("my-test-servers");

Это очень простой пример использования JClouds . Библиотека очень обширна и имеет гораздо больше функциональности. Самое приятное то, что JClouds абстрагирует ваш выбор облачного провайдера, и ваш код претерпит нулевые или минимальные изменения в случае, если вы решите сменить облачных поставщиков.