ক্লাউড স্প্যানার সহ স্প্রিং বুট অ্যাপ্লিকেশন

১. সংক্ষিপ্ত বিবরণ

ক্লাউড স্প্যানার হলো একটি উচ্চ-উপলব্ধিযোগ্য, অনুভূমিকভাবে প্রসারণযোগ্য এবং বহু-আঞ্চলিক RDBMS। এই কোড ল্যাবে ক্লাউড স্প্যানারের সবচেয়ে ছোট ইনস্ট্যান্সটি ব্যবহার করা হবে, কিন্তু কাজ শেষ হলে এটি বন্ধ করতে ভুলবেন না!

আপনি যা শিখবেন

  • Spring Boot-এর সাহায্যে Cloud Spanner ব্যবহার করে কীভাবে ডেটা সংরক্ষণ ও পুনরুদ্ধার করা যায়

আপনার যা যা লাগবে

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু পুরোটা পড়ুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

গুগল ক্লাউড প্ল্যাটফর্ম পরিষেবা ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

২. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. ক্লাউড কনসোলে সাইন ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। (যদি আপনার আগে থেকে Gmail বা G Suite অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLpGtQd5Q55

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।

  1. এরপরে, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। "পরিষ্কার-পরিচ্ছন্নতা" (Cleaning up) বিভাগে দেওয়া নির্দেশাবলী অবশ্যই অনুসরণ করবেন, যেখানে রিসোর্স বন্ধ করার পরামর্শ দেওয়া হয়েছে, যাতে এই টিউটোরিয়ালের বাইরে আপনার কোনো বিল না আসে। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, Activate Cloud Shell-এ ক্লিক করুন। H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

আপনি যদি আগে কখনো ক্লাউড শেল চালু না করে থাকেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন (নিচে দেওয়া আছে) আপনার সামনে আসবে। যদি তাই হয়, তাহলে 'Continue'-তে ক্লিক করুন (এবং আপনি এটি আর কখনো দেখতে পাবেন না)। একবারের জন্য আসা সেই স্ক্রিনটি দেখতে এইরকম:

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

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার প্রায় সমস্ত কাজই শুধুমাত্র একটি ব্রাউজার বা আপনার ক্রোমবুক দিয়ে করা সম্ভব।

ক্লাউড শেলে সংযুক্ত হওয়ার পর আপনি দেখতে পাবেন যে, আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
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].

৩. ক্লাউড স্প্যানার চালু করুন

gcloud CLI ব্যবহার করে ক্লাউড স্প্যানার এপিআই সক্রিয় করুন:

gcloud services enable spanner.googleapis.com

একটি ক্লাউড স্প্যানার ইনস্ট্যান্স তৈরি করুন:

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)"

৪. একটি নতুন স্প্রিং বুট জাভা অ্যাপ্লিকেশন বুটস্ট্র্যাপ করুন

ক্লাউড শেল এনভায়রনমেন্ট থেকে, একটি নতুন Spring Boot অ্যাপ্লিকেশন ইনিশিয়ালাইজ এবং বুটস্ট্র্যাপ করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

$ 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

এটি একটি নতুন spanner-example/ ডিরেক্টরি তৈরি করবে, যেখানে একটি নতুন মেভেন প্রজেক্ট, মেভেনের pom.xml , একটি মেভেন র‍্যাপার এবং একটি অ্যাপ্লিকেশন এন্ট্রি পয়েন্ট থাকবে।

pom.xml ফাইলে Spring Data Cloud Spanner স্টার্টারটি যোগ করুন।

স্প্যানার-উদাহরণ/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>

application.propers-এ স্প্যানার ডাটাবেস সংযোগের তথ্য কনফিগার করুন:

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

৫. সত্তাগুলো তৈরি করুন

Spring Cloud GCP-এর Spring Data Spanner সাপোর্টের সাহায্যে, আপনি Spring Data ব্যবহার করে সহজেই একটি জাভা অবজেক্ট এবং একটি স্প্যানার টেবিলের জন্য ইডিওম্যাটিক ORM ম্যাপিং তৈরি করতে পারেন।

প্রথমে, একটি Order Item ক্লাস তৈরি করুন।

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

এরপরে, একটি Order ক্লাস তৈরি করুন:

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 অ্যানোটেশন ব্যবহার করে।

৬. 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 অ্যাক্সেস প্রদান করবে এবং এর জন্য আপনাকে কোনো অতিরিক্ত কোড তৈরি করতে হবে না।

৭. মৌলিক কার্যক্রমের জন্য একটি 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();
        }
}

৮. অ্যাপ্লিকেশনটি চালান।

অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালান!

./mvnw spring-boot:run

এটি সঠিকভাবে চালু হবে এবং ৮০৮০ পোর্টে লিসেন করবে।

আপনি এন্ডপয়েন্টে একটি অর্ডার রেকর্ড পোস্ট করতে পারেন:

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

ক্লাউড স্প্যানারে ডেটা কীভাবে সংরক্ষিত হয় তা দেখতে, ক্লাউড কনসোলে যান এবং Spanner → Spanner Instance → order database → orders table → Data - এই পথগুলো অতিক্রম করুন।

780f4947e4a864f6.png

৯. পরিষ্কার করুন

পরিষ্কার করার জন্য, স্প্যানার ইনস্ট্যান্সটি ডিলিট করে দিন যাতে এটি আর কোনো চার্জ তৈরি না করে!

gcloud spanner instances delete spanner-instance -q

১০. অভিনন্দন!

এই কোডল্যাবে, আপনি একটি ইন্টারেক্টিভ CLI অ্যাপ্লিকেশন তৈরি করেছেন যা ক্লাউড স্প্যানার থেকে ডেটা সংরক্ষণ এবং পুনরুদ্ধার করতে পারে!

আরও জানুন

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে রয়েছে।