1. खास जानकारी
Cloud Spanner एक ऐसा RDBMS है जो कई क्षेत्रों में उपलब्ध है. साथ ही, इसे हॉरिज़ॉन्टली स्केल किया जा सकता है. इस कोड लैब में, Cloud Spanner के सबसे छोटे इंस्टेंस का इस्तेमाल किया जाएगा. हालांकि, काम पूरा होने के बाद इसे बंद करना न भूलें!
आपको क्या सीखने को मिलेगा
- Spring Boot की मदद से, डेटा को सेव करने और वापस पाने के लिए Cloud Spanner का इस्तेमाल कैसे करें
आपको किन चीज़ों की ज़रूरत होगी
इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?
Google Cloud Platform की सेवाओं को इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेट अप करना
- Cloud Console में साइन इन करें. इसके बाद, नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. (अगर आपके पास पहले से Gmail या G Suite खाता नहीं है, तो आपको एक खाता बनाना होगा.)
प्रोजेक्ट आईडी याद रखें. यह सभी Google Cloud प्रोजेक्ट के लिए एक यूनीक नाम होता है. ऊपर दिया गया नाम पहले ही इस्तेमाल किया जा चुका है. इसलिए, यह आपके लिए काम नहीं करेगा. माफ़ करें! इस कोड लैब में इसे बाद में PROJECT_ID के तौर पर दिखाया जाएगा.
- इसके बाद, Google Cloud संसाधनों का इस्तेमाल करने के लिए, आपको Cloud Console में बिलिंग चालू करनी होगी.
इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. "सफ़ाई करना" सेक्शन में दिए गए निर्देशों का पालन करना न भूलें. इसमें बताया गया है कि संसाधनों को कैसे बंद किया जाए, ताकि इस ट्यूटोरियल के बाद आपको बिलिंग न करनी पड़े. Google Cloud के नए उपयोगकर्ता, मुफ़्त में आज़माने के लिए 300 डॉलर के प्रोग्राम में शामिल हो सकते हैं.
Cloud Shell चालू करें
- Cloud Console में, Cloud Shell चालू करें
पर क्लिक करें.
अगर आपने पहले कभी Cloud Shell का इस्तेमाल नहीं किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर ऐसा होता है, तो जारी रखें पर क्लिक करें. इसके बाद, आपको यह स्क्रीन कभी नहीं दिखेगी. एक बार दिखने वाली स्क्रीन ऐसी दिखती है:
Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.
इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम, सिर्फ़ ब्राउज़र या Chromebook की मदद से किया जा सकता है.
Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर पहले ही सेट कर दिया गया है.
- पुष्टि करें कि आपने 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. Cloud Spanner को शुरू करना
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
स्कीमा को Cloud Spanner डेटाबेस पर लागू करें:
gcloud spanner databases ddl update orders \ --instance=spanner-instance \ --ddl="$(<schema.ddl)"
4. नया Spring Boot Java ऐप्लिकेशन बूटस्ट्रैप करना
Cloud Shell एनवायरमेंट में, नया 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/ डायरेक्ट्री बन जाएगी. इसमें एक नया Maven प्रोजेक्ट, Maven का pom.xml, Maven रैपर, और ऐप्लिकेशन एंट्रीपॉइंट होगा.
pom.xml फ़ाइल में, Spring Data Cloud Spanner starter जोड़ें.
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>
application.properties में, Spanner डेटाबेस कनेक्शन की जानकारी कॉन्फ़िगर करें:
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 में Spring Data Spanner की सुविधा उपलब्ध है. इसकी मदद से, Spring Data का इस्तेमाल करके आसानी से Java ऑब्जेक्ट बनाया जा सकता है. साथ ही, स्पैनर टेबल के लिए 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;
}
Spanner में पैरंट/चाइल्ड के संबंधों के लिए, आपको कंपोज़िट प्राइमरी की का इस्तेमाल करना चाहिए. इस उदाहरण में, कंपोज़िट की 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 एनोटेशन का इस्तेमाल करती है.
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 पर जाएं. इसके बाद, Spanner → Spanner इंस्टेंस → ऑर्डर डेटाबेस → ऑर्डर टेबल → डेटा पर जाएं.

9. व्यवस्थित करें
स्टोरेज खाली करने के लिए, Spanner इंस्टेंस को मिटा दें, ताकि आपसे आगे कोई शुल्क न लिया जाए!
gcloud spanner instances delete spanner-instance -q
10. बधाई हो!
इस कोडलैब में, आपने एक इंटरैक्टिव सीएलआई ऐप्लिकेशन बनाया है. यह Cloud Spanner से डेटा को सेव और वापस पा सकता है!
ज़्यादा जानें
- Cloud Spanner: https://cloud.google.com/spanner/
- GCP प्रोजेक्ट पर Spring: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/
- GCP GitHub रिपॉज़िटरी पर Spring: https://github.com/spring-cloud/spring-cloud-gcp
- Google Cloud Platform पर Java: https://cloud.google.com/java/
लाइसेंस
इस काम के लिए, Creative Commons एट्रिब्यूशन 2.0 जेनेरिक लाइसेंस के तहत लाइसेंस मिला है.