Cloud Spanner के साथ स्प्रिंग बूट ऐप्लिकेशन

1. खास जानकारी

Cloud Spanner एक बहुत उपलब्ध, हॉरिज़ॉन्टल तौर पर बढ़ाने लायक, और एक से ज़्यादा रीजनल आरडीबीएमएस है.यह कोड लैब, Cloud Spanner के सबसे छोटे इंस्टेंस का इस्तेमाल करेगा, लेकिन काम पूरा हो जाने पर इसे बंद करना न भूलें!

आपको इनके बारे में जानकारी मिलेगी

  • स्प्रिंग बूट की मदद से डेटा को सेव और वापस पाने के लिए, Cloud Spanner को इस्तेमाल करने का तरीका

आपको किन चीज़ों की ज़रूरत होगी

  • Google Cloud Platform प्रोजेक्ट
  • ब्राउज़र, जैसे कि Chrome या Firefox

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

इसे सिर्फ़ पढ़ें इसे पढ़ें और कसरतों को पूरा करें

Google Cloud Platform की सेवाएं इस्तेमाल करने का आपका अनुभव कैसा रहा?

शुरुआती इंटरमीडिएट कुशल

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेटअप करना

  1. Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. (अगर आपके पास पहले से Gmail या G Suite खाता नहीं है, तो आपको एक खाता बनाना होगा.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

प्रोजेक्ट आईडी याद रखें. यह Google Cloud के सभी प्रोजेक्ट के लिए एक खास नाम होता है (ऊपर दिया गया नाम पहले ही ले लिया गया है और यह आपके लिए काम नहीं करेगा!). बाद में, इस कोडलैब को इस कोडलैब में PROJECT_ID के तौर पर दिखाया जाएगा.

  1. इसके बाद, आपको Google Cloud के संसाधनों का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी.

इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. "साफ़ करना" सेक्शन में दिए गए निर्देशों का पालन करना न भूलें सेक्शन में, संसाधनों को बंद करने का तरीका बताया गया है. इससे इस ट्यूटोरियल के अलावा बिलिंग की सुविधा नहीं मिलेगी. Google Cloud के नए उपयोगकर्ता, 300USD डॉलर के मुफ़्त में आज़माने वाले प्रोग्राम में हिस्सा ले सकते हैं.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJANnQF0iBuUyfp1RzVad_4nCa0zLUDZLGFGFl पर क्लिक करें.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

अगर आपने Cloud Shell का इस्तेमाल पहले कभी नहीं किया है, तो आपको इसके बारे में जानकारी देने वाली एक इंटरमीडिएट स्क्रीन (पेज के फ़ोल्ड के नीचे) दिखेगी. अगर ऐसा है, तो जारी रखें पर क्लिक करें (यह आपको फिर कभी नहीं दिखेगा). एक बार इस्तेमाल होने वाली स्क्रीन कुछ इस तरह दिखती है:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रक्रिया को बेहतर बनाने में मदद मिलती है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम बस किसी ब्राउज़र या आपके Chromebook से किया जा सकता है.

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है. साथ ही, यह प्रोजेक्ट पहले से ही आपके प्रोजेक्ट आईडी पर सेट है.

  1. यह पुष्टि करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं कि आपकी पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. क्लाउड स्पैनर शुरू करना

gcloud सीएलआई का इस्तेमाल करके Cloud Spanner API को चालू करें:

gcloud services enable spanner.googleapis.com

Cloud Spanner इंस्टेंस बनाएं:

gcloud spanner instances create spanner-instance \
 --config=regional-us-central1 \
 --nodes=1 --description="A Spanner Instance"

इंस्टेंस में डेटाबेस बनाएं:

gcloud spanner databases create orders \
  --instance=spanner-instance

डेटा स्कीमा की जानकारी देने के लिए, schema.ddl फ़ाइल बनाएं:

cat << EOF > schema.ddl
CREATE TABLE orders (
  order_id STRING(36) NOT NULL,
  description STRING(255),
  creation_timestamp TIMESTAMP,
) PRIMARY KEY (order_id);

CREATE TABLE order_items (
  order_id STRING(36) NOT NULL,
  order_item_id STRING(36) NOT NULL,
  description STRING(255),
  quantity INT64,
) PRIMARY KEY (order_id, order_item_id),
  INTERLEAVE IN PARENT orders ON DELETE CASCADE;
EOF

क्लाउड स्पैनर डेटाबेस पर स्कीमा लागू करें:

gcloud spanner databases ddl update orders \
  --instance=spanner-instance \
  --ddl="$(<schema.ddl)"

4. नए Spring बूट Java ऐप्लिकेशन को बूटस्ट्रैप करें

Cloud Shell एनवायरमेंट से, नए Spring बूट ऐप्लिकेशन को शुरू करने और बूटस्ट्रैप करने के लिए नीचे दिए गए कमांड का इस्तेमाल करें:

$ curl https://start.spring.io/starter.tgz \
  -d packaging=jar \
  -d dependencies=cloud-gcp,web,lombok \
  -d baseDir=spanner-example \
  -d type=maven-project \
  -d bootVersion=3.2.6 | tar -xzvf -

$ cd spanner-example

ऐसा करने से, नए Maven प्रोजेक्ट के साथ एक नई spanner-example/ डायरेक्ट्री बन जाएगी. साथ ही, Maven का pom.xml, एक Maven रैपर, और ऐप्लिकेशन एंट्रीपॉइंट भी उपलब्ध होगा.

pom.xml फ़ाइल में, Spring Data Cloud Spanner स्टार्टर जोड़ें.

spanner-example/pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add Spring Cloud GCP Spanner Starter -->
        <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-data-spanner</artifactId>
        </dependency>

        ...

  </dependencies>

  ...
</project>

ऐप्लिकेशन.प्रॉपर्टी में, स्पैनर डेटाबेस कनेक्शन की जानकारी कॉन्फ़िगर करें:

spanner-example/src/main/resources/application.properties

spring.cloud.gcp.spanner.instance-id=spanner-instance
spring.cloud.gcp.spanner.database=orders

पक्का करें कि JAVA_HOME को सही वर्शन पर सेट किया गया हो:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

आपका Maven कॉन्फ़िगरेशन सही है, यह पक्का करने के लिए ऐप्लिकेशन को फिर से बनाएं:

./mvnw package

5. इकाइयां बनाएं

Spring Cloud GCP के स्प्रिंग डेटा स्पैनर टूल की मदद से, आसानी से Java ऑब्जेक्ट बनाया जा सकता है. साथ ही, स्प्रिंग डेटा का इस्तेमाल करके स्पैनर टेबल में मुहावरेदार ओआरएम मैपिंग आसानी से की जा सकती है.

सबसे पहले, ऑर्डर आइटम की क्लास बनाएं.

spanner-example/src/main/java/com/example/demo/OrderItem.java

package com.example.demo;

import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;

@Table(name="order_items")
@Data
class OrderItem {
  @PrimaryKey(keyOrder = 1)
  @Column(name="order_id")
  private String orderId;

  @PrimaryKey(keyOrder = 2)
  @Column(name="order_item_id")
  private String orderItemId;

  private String description;
  private Long quantity;
}

स्पैनर में माता-पिता/बच्चे के संबंध के लिए, आपको एक कंपोज़िट प्राथमिक कुंजी का इस्तेमाल करना चाहिए. इस उदाहरण में, कंपोज़िट की order_id और order_item_id हैं.

इसके बाद, एक ऑर्डर क्लास बनाएं:

spanner-example/src/main/java/com/example/demo/Order.java

package com.example.demo;

import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.Interleaved;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;

@Table(name="orders")
@Data
public class Order {
  @PrimaryKey
  @Column(name="order_id")
  private String id;

  private String description;

  @Column(name="creation_timestamp")
  private LocalDateTime timestamp;

  @Interleaved
  private List<OrderItem> items;
}

यह क्लास, @Interleaved एनोटेशन का इस्तेमाल करके, ऑर्डर आइटम के साथ एक से ज़्यादा संबंध बनाती है.

6. OrderRepository इंटरफ़ेस बनाना

इस कॉन्टेंट के साथ OrderRepository क्लास बनाएं:

spanner-example/src/main/java/com/example/demo/OrderRepository.java

package com.example.demo;

import com.google.cloud.spring.data.spanner.repository.SpannerRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderRepository extends SpannerRepository<Order, String> {
}

इंटरफ़ेस SpannerRepository<Order, String> को बड़ा करता है, जहां Order डोमेन श्रेणी है और String प्राथमिक कुंजी प्रकार है. इस इंटरफ़ेस के ज़रिए, Spring Data अपने-आप CRUD का ऐक्सेस देगा. इसके लिए, आपको कोई और कोड बनाने की ज़रूरत नहीं होगी.

7. बुनियादी कामों के लिए REST कंट्रोलर बनाएं

मुख्य ऐप्लिकेशन DemoApplication क्लास खोलें और उसमें बदलाव करके, ऐसा करें:

spanner-example/src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

import java.time.LocalDateTime;
import java.util.UUID;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

@SpringBootApplication
public class DemoApplication {
        public static void main(String[] args) {
                SpringApplication.run(DemoApplication.class, args);
        }
}

@RestController
class OrderController {
  private final OrderRepository orderRepository;

        OrderController(OrderRepository orderRepository) {
                this.orderRepository = orderRepository;
        }

        @GetMapping("/api/orders/{id}")
        public Order getOrder(@PathVariable String id) {
          return orderRepository.findById(id)
                                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, id + " not found"));
        }

        @PostMapping("/api/orders")
        public String createOrder(@RequestBody Order order) {
                // Spanner currently does not auto generate IDs
                // Generate UUID on new orders
                order.setId(UUID.randomUUID().toString());
                order.setTimestamp(LocalDateTime.now());

                order.getItems().forEach(item -> {
                        // Assign parent ID, and also generate child ID
                        item.setOrderId(order.getId());
                        item.setOrderItemId(UUID.randomUUID().toString());
                });

          Order saved = orderRepository.save(order);
          return saved.getId();
        }
}

8. ऐप्लिकेशन चलाएं

ऐप्लिकेशन फिर से बनाएं और चलाएं!

./mvnw spring-boot:run

यह ठीक से शुरू होना चाहिए और पोर्ट 8080 पर सुनना चाहिए.

एंडपॉइंट पर ऑर्डर का रिकॉर्ड पोस्ट किया जा सकता है:

curl -H"Content-Type: application/json" -d'{"description": "My orders", "items": [{"description": "Android Phone", "quantity": "1"}]}' \
  http://localhost:8080/api/orders

इसे आदेश के UUID के साथ जवाब देना चाहिए.

इसके बाद, UUID की मदद से ऑर्डर वापस लाया जा सकता है:

curl http://localhost:8080/api/orders/REPLACE_WITH_ORDER_UUID

यह देखने के लिए कि डेटा, Cloud Spanner में कैसे सेव किया जाता है, Cloud Console पर जाएं और स्पैनर → स्पैनर इंस्टेंस → ऑर्डर डेटाबेस → ऑर्डर टेबल → डेटा पर जाएं.

780f4947e4a864f6.png

9. व्यवस्थित करें

साफ़ करने के लिए, स्पैनर इंस्टेंस को मिटा दें, ताकि अब इससे कोई शुल्क न लिया जा रहा हो!

gcloud spanner instances delete spanner-instance -q

10. बधाई हो!

इस कोडलैब में, आपने एक इंटरैक्टिव CLI ऐप्लिकेशन बनाया है, जो Cloud Spanner से डेटा स्टोर और वापस पा सकता है!

ज़्यादा जानें

लाइसेंस

इस काम को क्रिएटिव कॉमंस एट्रिब्यूशन 2.0 जेनरिक लाइसेंस के तहत लाइसेंस मिला है.