Compartir a través de


Compilación de una aplicación de consola de Go con Azure DocumentDB

En esta guía se explica cómo crear una aplicación de consola de Go para conectarse a un clúster de Azure DocumentDB. Configure el entorno de desarrollo, use el azidentity paquete del SDK de Azure para Go para autenticarse y realice operaciones comunes en documentos de la base de datos.

Prerrequisitos

  • Una suscripción de Azure

  • Un clúster de Azure DocumentDB existente

  • La autenticación de Microsoft Entra está configurada para el clúster con el rol root concedido a la identidad.

  • Última versión de Go.

Configuración de la aplicación de consola

A continuación, cree un nuevo proyecto de aplicación de consola e importe las bibliotecas necesarias para autenticarse en el clúster.

  1. Cree un nuevo módulo go para el proyecto mediante el go mod init comando .

    go mod init cosmicworks
    
  2. Instale el paquete azidentity para controlar la autenticación con Microsoft Entra ID.

    go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  3. Instale el paquete mongo para interactuar con su clúster.

    go get -u  go.mongodb.org/mongo-driver/v2/mongo
    
  4. Cree un nuevo archivo denominado main.go en el directorio del proyecto.

    touch main.go
    

Conectarse al clúster

Ahora, utilice la Azure.Identity biblioteca para obtener un TokenCredential que usará para conectarse a su clúster. El controlador oficial de MongoDB tiene una interfaz especial que se debe implementar para obtener tokens de Microsoft Entra para su uso al conectarse al clúster.

  1. Empiece por importar los paquetes necesarios en la parte superior del main.go archivo.

    import (
    	"context"
    	"crypto/tls"
    	"encoding/json"
    	"fmt"
    	"time"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    
    	"go.mongodb.org/mongo-driver/v2/bson"
    	"go.mongodb.org/mongo-driver/v2/mongo"
    	"go.mongodb.org/mongo-driver/v2/mongo/options"
    )
    
  2. Cree un contexto en segundo plano que se use en toda la aplicación.

     ctx := context.Background()
    
  3. Cree una instancia de DefaultAzureCredential que se use para autenticarse con el identificador de Microsoft Entra.

     credential, err := azidentity.NewDefaultAzureCredential(nil)
     if err != nil {
     	panic(err)
     }
    
  4. Cree una función de devolución de llamada que obtenga tokens de acceso cuando el controlador de MongoDB necesite autenticarse.

     azureIdentityTokenCallback := func(_ context.Context,
     	_ *options.OIDCArgs) (*options.OIDCCredential, error) {
     	accessToken, err := credential.GetToken(ctx, policy.TokenRequestOptions{
     		Scopes: []string{"https://ossrdbms-aad.database.windows.net/.default"},
     	})
     	if err != nil {
     		return nil, err
     	}
     	return &options.OIDCCredential{
     		AccessToken: accessToken.Token,
     	}, nil
     }
    
  5. Establezca el nombre del clúster y construya el URI de conexión.

     clusterName := "<azure-documentdb-cluster-name>"
     uri := fmt.Sprintf("mongodb+srv://%s.global.mongocluster.cosmos.azure.com/", clusterName)
    
  6. Configure las credenciales de autenticación para el cliente de MongoDB.

     auth := options.Credential{
     	AuthMechanism:       "MONGODB-OIDC",
     	OIDCMachineCallback: azureIdentityTokenCallback,
     }
    
  7. Configure las opciones de cliente con parámetros de conexión, configuración de seguridad de la capa de transporte (TLS) y autenticación.

     clientOptions := options.Client().
     	ApplyURI(uri).
     	SetConnectTimeout(2 * time.Minute).
     	SetRetryWrites(true).
     	SetTLSConfig(&tls.Config{}).
     	SetAuth(auth)
    
  8. Cree una instancia de cliente de MongoDB mediante las opciones configuradas.

     client, err := mongo.Connect(clientOptions)
     if err != nil {
     	panic(err)
     }
    
     fmt.Println("Client created")
    
  9. Agregue una instrucción de aplazamiento para asegurarse de que el cliente está desconectado correctamente cuando se cierra la aplicación.

     defer func() {
     	if err = client.Disconnect(ctx); err != nil {
     		panic(err)
     	}
     }()
    

Realización de operaciones comunes

Por último, use la biblioteca oficial para realizar tareas comunes con bases de datos, colecciones y documentos. Aquí, usará las mismas clases y métodos que usaría para interactuar con MongoDB o DocumentDB para administrar las colecciones y los elementos.

  1. Obtenga una referencia a su base de datos por nombre.

     database := client.Database("<database-name>")
    
     fmt.Println("Database pointer created")
    
  2. Obtenga una referencia a la colección dentro de la base de datos.

     collection := database.Collection("<collection-name>")
    
     fmt.Println("Collection pointer created")
    
  3. Defina una estructura de tipo Product para representar la estructura de su documento.

    type Product struct {
        ID        string `bson:"_id"`
        Category  string `bson:"category"`
        Name      string `bson:"name"`
        Quantity  int    `bson:"quantity"`
        Price     decimal128.Decimal128 `bson:"price"`
        Clearance bool   `bson:"clearance"`
    }
    
  4. Cree o actualice un documento mediante la collection.ReplaceOne operación configurada para upsert.

     opts := options.Replace().SetUpsert(true)
     upsertFilter := bson.D{{Key: "_id", Value: "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"}}
     priceDecimal, err := bson.ParseDecimal128("850.00")
     if err != nil {
     	panic(err)
     }
     document := Product{
     	ID:        "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
     	Category:  "gear-surf-surfboards",
     	Name:      "Yamba Surfboard",
     	Quantity:  12,
     	Price:     priceDecimal,
     	Clearance: false}
    
     result, err := collection.ReplaceOne(ctx, upsertFilter, document, opts)
     if err != nil {
     	panic(err)
     }
    
     fmt.Printf("Documents upserted count:\t%d\n", result.UpsertedCount)
    
  5. Lea un documento específico mediante collection.FindOne y un filtro con _id y category.

     readFilter := bson.D{{Key: "_id", Value: "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"}, {Key: "category", Value: "gear-surf-surfboards"}}
     var target Product
     err = collection.FindOne(ctx, readFilter).Decode(&target)
     if err != nil {
     	panic(err)
     }
    
     fmt.Printf("Read document name:\t%s\n", target.Name)
    
  6. Consulte varios documentos que coincidan con un específico category mediante collection.Find.

     queryFilter := bson.D{{Key: "category", Value: "gear-surf-surfboards"}}
     cursor, err := collection.Find(ctx, queryFilter)
     if err != nil {
     	panic(err)
     }
    
  7. Obtenga todos los documentos que coincidan del cursor.

     var products []Product
     if err = cursor.All(ctx, &products); err != nil {
     	panic(err)
     }
    
  8. Recorre en iteración y muestra todos los productos encontrados en la consulta.

     for _, product := range products {
     	json, err := json.Marshal(product)
     	if err != nil {
     		panic(err)
     	}
     	fmt.Printf("Found document:\t%s\n", string(json))
     }