Este guia demonstra como migrar do App Engine Datastore para o Firestore no modo Datastore (também conhecido como Datastore).
O Firestore no modo Datastore é semelhante ao Datastore do App Engine, uma vez que ambos se referem ao mesmo serviço Datastore subjacente. Embora o App Engine Datastore só seja acessível através dos serviços agrupados legados do App Engine, o Firestore no modo Datastore é um produto autónomo Google Cloud que é acedido através das bibliotecas de cliente da nuvem.
O Firestore no modo Datastore também oferece um nível gratuito e permite-lhe gerir uma base de dados de documentos NoSQL altamente escalável, bem como dá-lhe flexibilidade no futuro para migrar para o Cloud Run ou outra plataforma de alojamento de apps. Google Cloud
Antes de começar
Reveja os diferentes modos da base de dados do Firestore para garantir que compreende o melhor exemplo de utilização para a sua app. Tenha em atenção que este guia aborda como migrar para o modo Datastore.
Reveja e compreenda os preços e as quotas do Firestore no modo Datastore.
O Firestore no modo Datastore oferece utilização gratuita com limites diários e armazenamento, leitura e operações de escrita ilimitados para contas pagas. Embora as apps do App Engine estejam desativadas, não recebem tráfego para incorrer em custos. No entanto, a utilização do Datastore pode ser faturável se exceder os limites da quota gratuita.
Ative as seguintes APIs no projeto que contém a sua app:
- API Artifact Registry para armazenar e gerir os seus artefactos de compilação
- API Cloud Build para criar, testar e implementar continuamente a sua aplicação.
API Cloud Datastore para migrar do Datastore incluído no App Engine para o Firestore no modo Datastore.
Ter uma app do App Engine existente a executar o Java 8 ou 11 que esteja ligada ao serviço App Engine Datastore.
Vista geral do processo
A um nível elevado, o processo de migração para o Firestore no modo Datastore a partir do App Engine Datastore consiste nos seguintes passos:
- Atualize os ficheiros de configuração
- Atualize a sua app Java
- Confirme a transação
- Resultados da consulta
Atualize os ficheiros de configuração
Atualize os ficheiros de configuração para usar as bibliotecas de cliente do modo Datastore.
Atualize o ficheiro pom.xml da sua app Java de base:
Remova as importações do SDK do App Engine
appengine-api-1.0-sdk, como as seguintes:<dependency> <groupId>com.google.appengine</groupId> <artifactId>appengine-api-1.0-sdk</artifactId> <version>2.0.4</version> </dependency>Adicione o cliente
Datastore, como o seguinte:<dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-datastore</artifactId> <!-- Use latest version --> <version>2.2.9</version> </dependency>
Atualize a sua app Java
Atualize as declarações de importação
Modifique os ficheiros da aplicação atualizando as linhas de importação e inicialização:
Remova as seguintes declarações de importação do App Engine para o armazenamento de dados do App Engine
com.google.appengine.api.datastore.*:import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.Query;Adicione as seguintes importações do Firestore no modo Datastore:
com.google.cloud.datastore.*import com.google.cloud.Timestamp; import com.google.cloud.datastore.Datastore; import com.google.cloud.datastore.DatastoreOptions; import com.google.cloud.datastore.Entity; import com.google.cloud.datastore.Key; import com.google.cloud.datastore.FullEntity; import com.google.cloud.datastore.KeyFactory; import com.google.cloud.datastore.Query; import com.google.cloud.datastore.QueryResults; import com.google.cloud.datastore.StructuredQuery;
Modifique a forma como a sua app acede ao serviço Datastore
O Firestore no modo Datastore usa a classe Datastore em vez de DatastoreService. Para modificar a forma como a sua app acede ao serviço Datastore:
Encontre as linhas que usam o método
DatastoreServiceFactory.getDatastoreService(), como o seguinte:// Initialize a client DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();Substitua o método
DatastoreServiceFactory.getDatastoreService()porDatastoreOptions.getDefaultInstance().getService(), como no seguinte exemplo:// Initialize a client Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
Obtenha uma chave gerada pelo Datastore
Depois de inicializar um cliente, obtenha a chave criando um novo KeyFactory do Kind adequado e, em seguida, peça ao Datastore para gerar um para si. Para obter uma chave gerada pelo Datastore:
Crie um
newKeyFactory.Chame o método
setKind()para determinar okindda entidade usada para categorizações de consultas.Anexe o método
newKey()para gerar uma chave do Datastore://Prepare a new entity String kind = "visit"; Key key = datastore.allocateId(datastore.newKeyFactory().setKind(kind).newKey());
Modifique a criação de entidades
Depois de obter uma chave do Datastore, crie entidades através dos seguintes métodos:
Use
Entity.newBuildere transmita a chave gerada pelo Datastore.Encontre as linhas que usam a chamada do construtor
Entity, como a seguinte:Entity visit = new Entity(kind);Substitua a chamada do construtor
Entitypela chamada do construtorEntity.newBuilder, como no seguinte exemplo:Entity visit = Entity.newBuilder(key);Use o método
setpara definir propriedades em entidades.O primeiro parâmetro é a propriedade pretendida e o segundo é o valor. No caso da propriedade
timestamp, o valor é umTimestampem vez de umInstant.toString().Encontre as linhas que usam o método
setProperty, como as seguintes:visit.setProperty("user_ip", userIp); visit.setProperty("timestamp", Instant.now().toString());Substitua o método
setPropertypelo métodoset, como no exemplo seguinte:Entity visit = Entity.newBuilder(key).set("user_ip", userIp).set("timestamp", Timestamp.now()).build();
Confirme a sua transação
A biblioteca cliente do Firestore no modo Datastore usa o método add()
para confirmar uma transação. Para confirmar a transação:
Encontre linhas que usam o método
put(), como as seguintes:// Save the entity datastore.put(visit);Substitua o método
put()pelo métodoadd(), como no exemplo seguinte:// Save the entity datastore.add(visit);
Resultados da consulta
As consultas obtêm entities
que cumprem um conjunto de condições especificado. Pode usar os seguintes métodos para
apresentar resultados:
O método
OrderByapresenta os resultados por ordem ascendente ou descendente.O método
Limitlimita o número máximo de resultados obtidos através de no mesmo criador.
A consulta usa um método de padrão de criação com a variável kind. A variável kind
está definida como Visit a partir do passo Obtenha uma chave gerada pelo Datastore.
Para obter os primeiros 10 resultados:
Encontre linhas que usam o método
addSort(), como as seguintes:// Retrieve the last 10 visits from the datastore, ordered by timestamp. Query query = new Query(kind).addSort("timestamp", Query.SortDirection.DESCENDING); List<Entity> results = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10));Substitua o método
addSort()pelo métodosetOrderBy()e anexe o métodosetLimit(), da seguinte forma:// Retrieve the last 10 visits from the datastore, ordered by timestamp. Query<Entity> query = Query.newEntityQueryBuilder() .setKind(kind) .setOrderBy(StructuredQuery.OrderBy.desc("timestamp")) .setLimit(10) .build();Quando a consulta estiver pronta, execute o código com
datastore.run()e recolha os resultados numa coleçãoQueryResultsEntity.O objeto
QueryResultsresultante é um iterador com uma funçãohasNext().Verifique se o conjunto de resultados tem um objeto
nextpara processamento, em vez de percorrer a lista de resultados. Por exemplo:QueryResults<Entity> results = datastore.run(query); resp.setContentType("text/plain"); PrintWriter out = resp.getWriter(); out.print("Last 10 visits:\n"); while (results.hasNext()) { Entity entity = results.next(); out.format( "Time: %s Addr: %s\n", entity.getTimestamp("timestamp"), entity.getString("user_ip")); }
Exemplos
Para ver um exemplo de como migrar uma app Java 8 para o Firestore no modo Datastore, compare o exemplo de código do App Engine Datastore para Java 8 e o exemplo de código do Firestore no modo Datastore no GitHub.
Próximos passos
- Saiba como usar o Firestore no modo Datastore.
- Consulte a documentação do Firestore no modo Datastore para ver mais detalhes.
- Saiba como migrar dos serviços incluídos antigos para Java.