Cloud Workstations और Cloud Code के साथ डेवलप करना

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

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

आपको क्या सीखने को मिलेगा

इस लैब में, आपको GCP में कंटेनर को डेवलप करने के तरीकों के बारे में जानकारी मिलेगी. जैसे:

  • Cloud Workstations की मदद से InsideLoop डेवलपमेंट
  • नया Java स्टार्टर ऐप्लिकेशन बनाना
  • डेवलपमेंट प्रोसेस की जानकारी
  • सीआरयूडी रेस्ट सर्विस की सुविधा आसानी से बनाई जा रही है
  • GKE (जीकेई) क्लस्टर पर ऐप्लिकेशन डीबग करना
  • ऐप्लिकेशन को CloudSQL डेटाबेस से कनेक्ट किया जा रहा है

58a4cdd3ed7a123a.png

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा.
  • आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

Cloudshell एडिटर शुरू करें

इस लैब को Google Cloud Shell Editor के साथ इस्तेमाल करने के लिए डिज़ाइन और टेस्ट किया गया था. एडिटर को ऐक्सेस करने के लिए,

  1. https://console.cloud.google.com पर जाकर, अपना Google प्रोजेक्ट ऐक्सेस करें.
  2. सबसे ऊपर दाएं कोने में मौजूद, Cloud Shell एडिटर आइकॉन पर क्लिक करें

8560cc8d45e8c112.png

  1. आपकी विंडो के सबसे नीचे एक नया पैनल खुलेगा
  2. 'एडिटर' बटन पर क्लिक करें

9e504cb98a6a8005.png

  1. दाईं ओर एक्सप्लोरर और बीच वाले हिस्से में एडिटर खुलेगा
  2. स्क्रीन के सबसे नीचे टर्मिनल पैनल भी उपलब्ध होना चाहिए
  3. अगर टर्मिनल खुला नहीं है, तो नई टर्मिनल विंडो खोलने के लिए `ctrl+`` के कुंजी कॉम्बिनेशन का इस्तेमाल करें

gcloud सेट अप करें

Cloud Shell में, अपना प्रोजेक्ट आईडी और वह इलाका सेट करें जहां आपको अपना ऐप्लिकेशन डिप्लॉय करना है. उन्हें PROJECT_ID और REGION वैरिएबल के तौर पर सेव करें.

export REGION=us-central1
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

सोर्स कोड का क्लोन बनाएं

इस लैब का सोर्स कोड, GitHub पर GoogleCloudPlatform में कंटेनर-developer-वर्कशॉप में मौजूद है. नीचे दिए गए निर्देश से इसे क्लोन करें और फिर डायरेक्ट्री में बदलें.

git clone https://github.com/GoogleCloudPlatform/container-developer-workshop.git
cd container-developer-workshop/labs/spring-boot

इस लैब में इस्तेमाल किए जा रहे इन्फ़्रास्ट्रक्चर का प्रावधान करें

इस लैब में, आपको GKE (जीकेई) पर कोड डिप्लॉय करना होगा. साथ ही, CloudSQL डेटाबेस में सेव किए गए डेटा को ऐक्सेस करना होगा. नीचे दी गई सेटअप स्क्रिप्ट आपके लिए यह इन्फ़्रास्ट्रक्चर तैयार करती है. प्रावधान की प्रोसेस में 25 मिनट से ज़्यादा लगेंगे. अगले सेक्शन पर जाने से पहले, स्क्रिप्ट के पूरा होने का इंतज़ार करें.

./setup_with_cw.sh &

क्लाउड वर्कस्टेशन क्लस्टर

Cloud Console में Cloud Workstations खोलें. क्लस्टर के READY स्टेटस में होने का इंतज़ार करें.

305e1a3d63ac7ff6.png

Workstations कॉन्फ़िगरेशन बनाएं

अगर आपका Cloud Shell सेशन डिसकनेक्ट हो गया है, तो "फिर से कनेक्ट करें" पर क्लिक करें और फिर प्रोजेक्ट आईडी सेट करने के लिए gcloud cli कमांड चलाएं. कमांड चलाने से पहले, नीचे दिए गए सैंपल प्रोजेक्ट आईडी को अपने qwiklabs प्रोजेक्ट आईडी से बदलें.

gcloud config set project qwiklabs-gcp-project-id

Cloud Workstations कॉन्फ़िगरेशन बनाने के लिए, नीचे दी गई स्क्रिप्ट को टर्मिनल में चलाएं.

cd ~/container-developer-workshop/labs/spring-boot
./workstation_config_setup.sh

कॉन्फ़िगरेशन सेक्शन में जाकर, नतीजों की पुष्टि करें. READY स्थिति में बदलने में दो मिनट लगेंगे.

7a6af5aa2807a5f2.png

कंसोल में Cloud Workstations खोलें और नया इंस्टेंस बनाएं.

a53adeeac81a78c8.png

नाम को my-workstation में बदलें और मौजूदा कॉन्फ़िगरेशन को चुनें: codeoss-java.

f21c216997746097.png

Workstations सेक्शन में जाकर, नतीजों की पुष्टि करें.

66a9fc8b20543e32.png

वर्कस्टेशन लॉन्च करें

वर्कस्टेशन शुरू और लॉन्च करें.

c91bb69b61ec8635.png

पता बार में मौजूद आइकॉन पर क्लिक करके, तीसरे पक्ष की कुकी को अनुमति दें. 1b8923e2943f9bc4.png

fcf9405b6957b7d7.png

"साइट काम नहीं कर रही है?" पर क्लिक करें.

36a84c0e2e3b85b.png

"कुकी की अनुमति दें" पर क्लिक करें.

2259694328628fba.png

वर्कस्टेशन लॉन्च होने के बाद, आपको कोड OSS IDE दिखेगा. "हो गया के रूप में चिह्नित करें" पर क्लिक करें 'शुरू करें' पेज पर, वर्कस्टेशन IDE पर

94874fba9b74cc22.png

3. नया Java स्टार्टर ऐप्लिकेशन बनाना

इस सेक्शन में, आपको spring.io के दिए गए सैंपल ऐप्लिकेशन का इस्तेमाल करके, शुरुआत से एक नया Java Spring बूट ऐप्लिकेशन बनाना होगा. नया टर्मिनल खोलें.

c31d48f2e4938c38.png

सैंपल ऐप्लिकेशन का क्लोन बनाएं

  1. कोई स्टार्टर ऐप्लिकेशन बनाएँ
curl  https://start.spring.io/starter.zip -d dependencies=web -d type=maven-project -d javaVersion=17 -d packageName=com.example.springboot -o sample-app.zip

अगर आपको यह मैसेज दिखता है, तो 'अनुमति दें' बटन पर क्लिक करें, ताकि आप उसे कॉपी करके वर्कस्टेशन में चिपका सकें.

58149777e5cc350a.png

  1. ऐप्लिकेशन को अनज़िप करें
unzip sample-app.zip -d sample-app
  1. "सैंपल-ऐप्लिकेशन" खोलें फ़ोल्डर
cd sample-app && code-oss-cloud-workstations -r --folder-uri="$PWD"

स्प्रिंग-बूट-डेवलपर टूल जोड़ें और जिब

Spring बूट DevTools चालू करने के लिए, अपने एडिटर में एक्सप्लोरर से pom.xml खोलें और उसे खोलें. इसके बाद, ब्यौरे वाली लाइन के बाद इस कोड को चिपकाएं, जिस पर <description>Demo project for Spring Boot</description> लिखा हो

  1. pom.xml में Spring-boot-devtools जोड़ें

pom.xml को प्रोजेक्ट के रूट में खोलें. Description एंट्री के बाद, नीचे दिया गया कॉन्फ़िगरेशन जोड़ें.

pom.xml

  <!--  Spring profiles-->
  <profiles>
    <profile>
      <id>sync</id>
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
        </dependency>
      </dependencies>
    </profile>
  </profiles>
  1. pom.xml में jib-maven-plugin को चालू करें

Jib, Google का एक ओपन सोर्स Java कंटेनरिंग टूल है. इसकी मदद से, Java डेवलपर उन Java टूल का इस्तेमाल करके कंटेनर बना सकते हैं जिनके बारे में उन्हें पता है. Jib एक तेज़ और आसान कंटेनर इमेज बिल्डर है जो आपके ऐप्लिकेशन को कंटेनर इमेज में पैक करने के सभी चरणों को पूरा करता है. इसके लिए आपको Dockerfile लिखना या डॉकर इंस्टॉल करना ज़रूरी नहीं है. साथ ही, इसे सीधे Maven और Gradle में इंटिग्रेट किया गया है.

pom.xml फ़ाइल में नीचे की ओर स्क्रोल करें और Jib प्लगिन को शामिल करने के लिए, Build सेक्शन को अपडेट करें. बिल्ड पूरा होने पर, इस सेक्शन में इनसे जुड़ी जानकारी मौजूद होनी चाहिए.

pom.xml

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <!--  Jib Plugin-->
      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>3.2.0</version>
      </plugin>
       <!--  Maven Resources Plugin-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.1.0</version>
      </plugin>
    </plugins>
  </build>

मेनिफ़ेस्ट जनरेट करें

Skaffold, कंटेनर डेवलपमेंट को आसान बनाने के लिए इंटिग्रेट किए गए टूल उपलब्ध कराता है. इस चरण में, Skaffold की प्रोसेस शुरू की जाएगी, जिससे Kubernetes YAML फ़ाइलें अपने-आप बन जाएंगी. यह प्रोसेस, Dockerfile जैसी कंटेनर इमेज की परिभाषाओं वाली डायरेक्ट्री की पहचान करने की कोशिश करती है. इसके बाद, हर डायरेक्ट्री के लिए डिप्लॉयमेंट और सर्विस मेनिफ़ेस्ट बनाती है.

प्रक्रिया शुरू करने के लिए, Terminal में नीचे दिए गए निर्देश का इस्तेमाल करें.

d869e0cd38e983d7.png

  1. टर्मिनल में नीचे दिया गया निर्देश चलाएं
skaffold init --generate-manifests
  1. जब कहा जाए, तब:
  • अपने कर्सर को Jib Maven Plugin पर ले जाने के लिए, ऐरो का इस्तेमाल करें
  • विकल्प चुनने के लिए, स्पेसबार दबाएं.
  • जारी रखने के लिए Enter दबाएं
  1. पोर्ट के लिए 8080 डालें
  2. कॉन्फ़िगरेशन सेव करने के लिए, y डालें

फ़ाइल फ़ोल्डर skaffold.yaml और deployment.yaml में दो फ़ाइलें जोड़ी गई हैं

स्केफ़ोल्ड आउटपुट:

b33cc1e0c2077ab8.png

ऐप्लिकेशन का नाम अपडेट करें

कॉन्फ़िगरेशन में शामिल डिफ़ॉल्ट मान वर्तमान में आपके ऐप्लिकेशन के नाम से मेल नहीं खाते. फ़ाइलों को डिफ़ॉल्ट मानों की बजाय अपने ऐप्लिकेशन के नाम का संदर्भ देने के लिए अपडेट करें.

  1. Skaffold कॉन्फ़िगरेशन में एंट्री बदलें
  • skaffold.yaml खोलें
  • इमेज के उस नाम को चुनें जो फ़िलहाल pom-xml-image के तौर पर सेट है
  • राइट क्लिक करें और 'सभी घटनाएं बदलें' को चुनें
  • नया नाम, demo-app के तौर पर लिखें
  1. Kubernetes कॉन्फ़िगरेशन में एंट्री बदलें
  • deployment.yaml फ़ाइल खोलें
  • इमेज के उस नाम को चुनें जो फ़िलहाल pom-xml-image के तौर पर सेट है
  • राइट क्लिक करें और 'सभी घटनाएं बदलें' को चुनें
  • नया नाम, demo-app के तौर पर लिखें

अपने-आप सिंक मोड चालू करें

ऑप्टिमाइज़ किए गए हॉट रीलोड के अनुभव को बेहतर बनाने के लिए, आपको Jib की सिंक करने की सुविधा का इस्तेमाल करना होगा. इस चरण में, बिल्ड प्रोसेस में स्केल को इस सुविधा का इस्तेमाल करने के लिए कॉन्फ़िगर किया जाएगा.

ध्यान दें कि "सिंक करें" यह प्रोफ़ाइल, Skaffold कॉन्फ़िगरेशन में कॉन्फ़िगर की जा रही है, "सिंक करें" सुविधा का इस्तेमाल करती है वह प्रोफ़ाइल जिसे आपने पिछले चरण में कॉन्फ़िगर किया है, जहां आपने Spring-dev-tools के लिए सहायता चालू की है.

  1. Skaffold कॉन्फ़िगरेशन को अपडेट करें

skaffold.yaml फ़ाइल में, फ़ाइल के पूरे बिल्ड सेक्शन को इन स्पेसिफ़िकेशन से बदलें. फ़ाइल के अन्य सेक्शन में बदलाव न करें.

skaffold.yaml

build:
  artifacts:
  - image: demo-app
    jib:
      project: com.example:demo
      type: maven
      args: 
      - --no-transfer-progress
      - -Psync
      fromImage: gcr.io/distroless/java17-debian11:debug
    sync:
      auto: true

डिफ़ॉल्ट रास्ता जोड़ें

/src/main/java/com/example/springboot/ फ़ोल्डर में HelloController.java नाम की फ़ाइल बनाएं.

a624f5dd0c477c09.png

डिफ़ॉल्ट http रूट बनाने के लिए, नीचे दिए गए कॉन्टेंट को फ़ाइल में चिपकाएं.

HelloController.java

package com.example.springboot;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;

@RestController
public class HelloController {

    @Value("${target:local}")
    String target;

    @GetMapping("/") 
    public String hello()
    {
        return String.format("Hello from your %s environment!", target);
    }
}

4. डेवलपमेंट प्रोसेस की जानकारी

इस सेक्शन में, आपको बुनियादी प्रोसेस जानने और स्टार्टर ऐप्लिकेशन के कॉन्फ़िगरेशन और सेटअप की पुष्टि करने के लिए, Cloud Code प्लगिन का इस्तेमाल करने के कुछ चरणों के बारे में बताया जाएगा.

Cloud Code, आपके डेवलपमेंट प्रोसेस को बेहतर बनाने के लिए Skaffold के साथ इंटिग्रेट होता है. जब इन चरणों को GKE (जीकेई) पर डिप्लॉय किया जाता है, तो Cloud Code और Skaffold, आपके कंटेनर की इमेज अपने-आप बनाएंगे, उसे कंटेनर रजिस्ट्री में पुश करेंगे, और आपके ऐप्लिकेशन को GKE (जीकेई) पर डिप्लॉय कर देंगे. ऐसा, पर्दे के पीछे की गतिविधियों और डेवलपर फ़्लो से जुड़ी जानकारी को समझकर किया जा सकता है. Cloud Code, कंटेनर पर आधारित डेवलपमेंट के लिए पारंपरिक डीबग और हॉटसिंक क्षमताएं देकर आपकी डेवलपमेंट प्रोसेस को बेहतर बनाता है.

Google Cloud में साइन इन करें

Cloud Code आइकॉन पर क्लिक करें और "Google Cloud में साइन इन करें" को चुनें:

1769afd39be372ff.png

"साइन इन करने के लिए आगे बढ़ें" पर क्लिक करें.

923bb1c8f63160f9.png

Terminal में आउटपुट देखें और लिंक खोलें:

517fdd579c34aa21.png

अपने Qwiklabs छात्र-छात्राओं के क्रेडेंशियल के साथ लॉगिन करें.

db99b345f7a8e72c.png

"अनुमति दें" चुनें:

a5376553c430ac84.png

पुष्टि करने वाला कोड कॉपी करें और Workstation टैब पर वापस जाएं.

6719421277b92eac.png

पुष्टि करने के लिए भेजा गया कोड चिपकाएं और Enter दबाएं.

e9847cfe3fa8a2ce.png

Kubernetes क्लस्टर जोड़ें

  1. कोई क्लस्टर जोड़ें

62a3b97bdbb427e5.png

  1. Google Kubernetes Engine चुनें:

9577de423568bbaa.png

  1. प्रोजेक्ट चुनें.

c5202fcbeebcd41c.png

  1. "कोट-क्लस्टर" चुनें जो शुरुआती सेटअप में बनाया गया था.

366cfd8bc27cd3ed.png

9d68532c9bc4a89b.png

gcloud cli का इस्तेमाल करके मौजूदा प्रोजेक्ट आईडी सेट करें

qwiklabs पेज से इस लैब का प्रोजेक्ट आईडी कॉपी करें.

fcff2d10007ec5bc.png

प्रोजेक्ट आईडी सेट करने के लिए, gcloud cli कमांड चलाएं. कमांड चलाने से पहले, सैंपल प्रोजेक्ट आईडी बदलें.

gcloud config set project qwiklabs-gcp-project-id

आउटपुट का उदाहरण:

f1c03d01b7ac112c.png

Kubernetes पर डीबग करें

  1. बाएं पैनल में सबसे नीचे मौजूद, क्लाउड कोड चुनें.

60b8e4e95868b561.png

  1. डेवलपर सेशन में दिखने वाले पैनल में, Kubernetes पर डीबग चुनें.

अगर विकल्प नहीं दिख रहा है, तो नीचे की ओर स्क्रोल करें.

7d30833d96632ca0.png

  1. "हां" चुनें ताकि मौजूदा संदर्भ का इस्तेमाल किया जा सके.

a024a69b64de7e9e.png

  1. "कोट-क्लस्टर" चुनें जिसे शुरुआती सेटअप के दौरान बनाया गया था.

faebabf372e3caf0.png

  1. कंटेनर रिपॉज़िटरी चुनें.

fabc6dce48bae1b4.png

  1. प्रोग्रेस और सूचनाएं देखने के लिए, सबसे नीचे मौजूद पैनल में आउटपुट टैब चुनें
  2. "Kubernetes: रन/डीबग - ज़्यादा जानकारी" चुनें अतिरिक्त विवरण और कंटेनर से लाइव स्ट्रीमिंग लॉग देखने के लिए दाईं ओर दिए गए चैनल ड्रॉप-डाउन में

86b44c59db58f8f3.png

आवेदन के डिप्लॉय होने का इंतज़ार करें.

9f37706a752829fe.png

  1. Cloud Console में, GKE (जीकेई) पर डिप्लॉय किए गए ऐप्लिकेशन की समीक्षा करें.

6ad220e5d1980756.png

  1. "Kubernetes: रन/डीबग" चुनकर, आसान बनाए गए व्यू पर वापस जाएं OUTPUT टैब पर ड्रॉपडाउन से.
  2. बिल्ड और टेस्ट पूरे होने के बाद, आउटपुट टैब में यह मैसेज दिखता है: Resource deployment/demo-app status completed successfully और एक यूआरएल दिखता है: "सर्विस डेमो-ऐप्लिकेशन से फ़ॉरवर्ड किया गया यूआरएल: http://localhost:8080"
  3. Cloud Code टर्मिनल में, आउटपुट (http://localhost:8080) में मौजूद यूआरएल पर कर्सर घुमाएं. इसके बाद, टूल टिप में दिखने वाले 'लिंक 'फ़ॉलो करें' चुनें.

28c5539880194a8e.png

नया टैब खुलेगा और आपको आउटपुट यहां दिखेगा:

d67253ca16238f49.png

ब्रेकपॉइंट इस्तेमाल करें

  1. /src/main/java/com/example/springboot/HelloController.java पर मौजूद HelloController.java ऐप्लिकेशन खोलें
  2. return String.format("Hello from your %s environment!", target); को देखने वाले रूट पाथ के लिए, रिटर्न स्टेटमेंट ढूंढें
  3. लाइन नंबर की बाईं ओर मौजूद खाली जगह पर क्लिक करके, उस लाइन में एक ब्रेकपॉइंट जोड़ें. ब्रेकपॉइंट सेट होने का पता लगाने के लिए, लाल रंग का इंंडिकेटर दिखेगा

5027dc6da2618a39.png

  1. अपने ब्राउज़र को फिर से लोड करें और ध्यान दें कि डीबगर, ब्रेकपॉइंट पर प्रोसेस को रोक देता है. साथ ही, इससे आपको GKE (जीकेई) में रिमोट तरीके से चल रहे ऐप्लिकेशन के वैरिएबल और स्थिति की जांच करने की अनुमति मिलती है

71acfb426623cec2.png

  1. जब तक आपको "टारगेट" नहीं मिल जाता, तब तक वैरिएबल सेक्शन में नीचे की ओर क्लिक करें वैरिएबल.
  2. मौजूदा वैल्यू को "स्थानीय" के तौर पर देखें

a1160d2ed2bb5c82.png

  1. वैरिएबल के नाम "टारगेट" पर दो बार क्लिक करें और पॉप-अप में,

वैल्यू को बदलकर "Cloud Workstations" कर दें

e597a556a5c53f32.png

  1. डीबग कंट्रोल पैनल में 'जारी रखें' बटन पर क्लिक करें

ec17086191770d0d.png

  1. अपने ब्राउज़र में उस जवाब की समीक्षा करें जो अब आपकी डाली गई अपडेट की गई वैल्यू दिखाता है.

6698a9db9e729925.png

  1. लाइन नंबर की बाईं ओर मौजूद लाल रंग के इंंडिकेटर पर क्लिक करके, ब्रेकपॉइंट हटाएं. ऐसा करने से, जब आप इस लैब में आगे बढ़ेंगे, तो आपका कोड इस लाइन पर एक्ज़ीक्यूशन नहीं रोक पाएगा.

फिर से लोड करें

  1. कोई दूसरी वैल्यू दिखाने के लिए स्टेटमेंट बदलें. जैसे, "%s कोड का हैलो"
  2. फ़ाइल अपने-आप सेव हो जाती है और GKE (जीकेई) के रिमोट कंटेनर में सिंक हो जाती है
  3. अपडेट किए गए नतीजे देखने के लिए, अपना ब्राउज़र रीफ़्रेश करें.
  4. डीबग टूलबार में लाल वर्ग पर क्लिक करके डीबगिंग सेशन को रोकें

a541f928ec8f430e.png c2752bb28d82af86.png

"हर रन के बाद 'हां, स्टोरेज खाली करें" चुनें.

984eb2fa34867d70.png

5. सीआरयूडी रेस्ट सर्विस की सुविधा आसानी से बनाई जा रही है

इस समय आपका ऐप्लिकेशन कंटेनर वाले डेवलपमेंट के लिए पूरी तरह से कॉन्फ़िगर हो गया है और आपने Cloud Code के साथ बेसिक डेवलपमेंट वर्कफ़्लो को समझ लिया है. नीचे दिए गए सेक्शन में, Google Cloud में मैनेज किए जा रहे डेटाबेस से कनेक्ट करके REST सर्विस एंडपॉइंट को जोड़कर, उन चीज़ों की प्रैक्टिस की जाती है जो आपने सीखी हैं.

डिपेंडेंसी कॉन्फ़िगर करें

ऐप्लिकेशन कोड, बाकी सेवा से जुड़े डेटा को बनाए रखने के लिए, डेटाबेस का इस्तेमाल करता है. पक्का करें कि ये डिपेंडेंसी उपलब्ध हैं. इसके लिए, pom.xl में ये चीज़ें जोड़ें

  1. pom.xml फ़ाइल खोलें और इन्हें कॉन्फ़िगरेशन के डिपेंडेंसी सेक्शन में जोड़ें

pom.xml

    <!--  Database dependencies-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.flywaydb</groupId>
      <artifactId>flyway-core</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>javax.persistence-api</artifactId>
      <version>2.2</version>
    </dependency>

कोड REST सेवा

Quote.java

/src/main/java/com/example/springboot/ में Quote.java नाम की फ़ाइल बनाएं और नीचे दिए गए कोड में कॉपी करें. यह ऐप्लिकेशन में इस्तेमाल किए गए कोटेशन ऑब्जेक्ट के लिए, इकाई के मॉडल के बारे में बताता है.

package com.example.springboot;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

import java.util.Objects;

@Entity
@Table(name = "quotes")
public class Quote
{
    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name="quote")
    private String quote;

    @Column(name="author")
    private String author;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getQuote() {
        return quote;
    }

    public void setQuote(String quote) {
        this.quote = quote;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
        Quote quote1 = (Quote) o;
        return Objects.equals(id, quote1.id) &&
                Objects.equals(quote, quote1.quote) &&
                Objects.equals(author, quote1.author);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, quote, author);
    }
}

QuoteRepository.java

src/main/java/com/example/springboot पर QuoteRepository.java नाम की फ़ाइल बनाएं और यहां दिए गए कोड को कॉपी करें

package com.example.springboot;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface QuoteRepository extends JpaRepository<Quote,Integer> {

    @Query( nativeQuery = true, value =
            "SELECT id,quote,author FROM quotes ORDER BY RANDOM() LIMIT 1")
    Quote findRandomQuote();
}

यह कोड, डेटा को सेव करके रखने के लिए JPA का इस्तेमाल करता है. यह क्लास Spring JPARepository इंटरफ़ेस को बड़ा करती है और कस्टम कोड बनाने की अनुमति देती है. आपने कोड में, पसंद के मुताबिक findRandomQuote तरीका जोड़ा है.

QuoteController.java

सेवा के लिए एंडपॉइंट दिखाने के लिए, QuoteController क्लास यह सुविधा देगी.

src/main/java/com/example/springboot पर QuoteController.java नाम की फ़ाइल बनाएं और यहां दिए गए कॉन्टेंट में उसे कॉपी करें

package com.example.springboot;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class QuoteController {

    private final QuoteRepository quoteRepository;

    public QuoteController(QuoteRepository quoteRepository) {
        this.quoteRepository = quoteRepository;
    }

    @GetMapping("/random-quote") 
    public Quote randomQuote()
    {
        return quoteRepository.findRandomQuote();  
    }

    @GetMapping("/quotes") 
    public ResponseEntity<List<Quote>> allQuotes()
    {
        try {
            List<Quote> quotes = new ArrayList<Quote>();
            
            quoteRepository.findAll().forEach(quotes::add);

            if (quotes.size()==0 || quotes.isEmpty()) 
                return new ResponseEntity<List<Quote>>(HttpStatus.NO_CONTENT);
                
            return new ResponseEntity<List<Quote>>(quotes, HttpStatus.OK);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return new ResponseEntity<List<Quote>>(HttpStatus.INTERNAL_SERVER_ERROR);
        }        
    }

    @PostMapping("/quotes")
    public ResponseEntity<Quote> createQuote(@RequestBody Quote quote) {
        try {
            Quote saved = quoteRepository.save(quote);
            return new ResponseEntity<Quote>(saved, HttpStatus.CREATED);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return new ResponseEntity<Quote>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }     

    @PutMapping("/quotes/{id}")
    public ResponseEntity<Quote> updateQuote(@PathVariable("id") Integer id, @RequestBody Quote quote) {
        try {
            Optional<Quote> existingQuote = quoteRepository.findById(id);
            
            if(existingQuote.isPresent()){
                Quote updatedQuote = existingQuote.get();
                updatedQuote.setAuthor(quote.getAuthor());
                updatedQuote.setQuote(quote.getQuote());

                return new ResponseEntity<Quote>(updatedQuote, HttpStatus.OK);
            } else {
                return new ResponseEntity<Quote>(HttpStatus.NOT_FOUND);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return new ResponseEntity<Quote>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }     

    @DeleteMapping("/quotes/{id}")
    public ResponseEntity<HttpStatus> deleteQuote(@PathVariable("id") Integer id) {
        Optional<Quote> quote = quoteRepository.findById(id);
        if (quote.isPresent()) {
            quoteRepository.deleteById(id);
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        } else {
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

}

डेटाबेस कॉन्फ़िगरेशन जोड़ें

application.yaml

सेवा से ऐक्सेस किए जाने वाले बैकएंड डेटाबेस के लिए कॉन्फ़िगरेशन जोड़ें. application.yaml फ़ाइल नाम की फ़ाइल को src/main/resources में बदलाव करें या बनाएं. साथ ही, बैकएंड के लिए पैरामीटर वाला Spring कॉन्फ़िगरेशन जोड़ें.

target: local

spring:
  config:
    activate:
      on-profile: cloud-dev
  datasource:
    url: 'jdbc:postgresql://${DB_HOST:127.0.0.1}/${DB_NAME:quote_db}'
    username: '${DB_USER:user}'
    password: '${DB_PASS:password}'
  jpa:
    properties:
      hibernate:
        jdbc:
          lob:
            non_contextual_creation: true
        dialect: org.hibernate.dialect.PostgreSQLDialect
    hibernate:
      ddl-auto: update

डेटाबेस माइग्रेशन जोड़ें

src/main/resources में db/migration फ़ोल्डर बनाएं

एसक्यूएल फ़ाइल बनाएं: V1__create_quotes_table.sql

नीचे दिए गए कॉन्टेंट को फ़ाइल में चिपकाएं

V1__create_quotes_table.sql

CREATE TABLE quotes(
   id INTEGER PRIMARY KEY,
   quote VARCHAR(1024),
   author VARCHAR(256)
);

INSERT INTO quotes (id,quote,author) VALUES (1,'Never, never, never give up','Winston Churchill');
INSERT INTO quotes (id,quote,author) VALUES (2,'While there''s life, there''s hope','Marcus Tullius Cicero');
INSERT INTO quotes (id,quote,author) VALUES (3,'Failure is success in progress','Anonymous');
INSERT INTO quotes (id,quote,author) VALUES (4,'Success demands singleness of purpose','Vincent Lombardi');
INSERT INTO quotes (id,quote,author) VALUES (5,'The shortest answer is doing','Lord Herbert');

Kubernetes कॉन्फ़िगरेशन

deployment.yaml फ़ाइल में नीचे दिए गए बदलाव, ऐप्लिकेशन को CloudSQL इंस्टेंस से कनेक्ट करने की अनुमति देते हैं.

  • TARGET - वैरिएबल को कॉन्फ़िगर करके उस परिवेश का संकेत देता है, जहां ऐप्लिकेशन निष्पादित होता है
  • SPRING_PROFILES_ACTIVE - सक्रिय Spring प्रोफ़ाइल दिखाता है, जिसे cloud-dev पर कॉन्फ़िगर किया जाएगा
  • DB_Host - डेटाबेस का निजी आईपी, जिसे डेटाबेस इंस्टेंस बनाए जाने के बाद या Google Cloud Console के नेविगेशन मेन्यू में SQL पर क्लिक करके नोट किया जाता है - कृपया वैल्यू बदलें !
  • DB_USER और DB_PASS - जैसा कि CloudSQL इंस्टेंस कॉन्फ़िगरेशन में सेट किया गया है, उसे GCP में सीक्रेट के तौर पर स्टोर किया गया है

नीचे दिए गए कॉन्टेंट का इस्तेमाल करके, अपने डिप्लॉयमेंट.yaml को अपडेट करें.

deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: demo-app
  labels:
    app: demo-app
spec:
  ports:
  - port: 8080
    protocol: TCP
  clusterIP: None
  selector:
    app: demo-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
  labels:
    app: demo-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
      - name: demo-app
        image: demo-app
        env:
          - name: PORT
            value: "8080"
          - name: TARGET
            value: "Local Dev - CloudSQL Database - K8s Cluster"
          - name: SPRING_PROFILES_ACTIVE
            value: cloud-dev
          - name: DB_HOST
            value: ${DB_INSTANCE_IP}   
          - name: DB_PORT
            value: "5432"  
          - name: DB_USER
            valueFrom:
              secretKeyRef:
                name: gke-cloud-sql-secrets
                key: username
          - name: DB_PASS
            valueFrom:
              secretKeyRef:
                name: gke-cloud-sql-secrets
                key: password
          - name: DB_NAME
            valueFrom:
              secretKeyRef:
                name: gke-cloud-sql-secrets
                key: database

DB_Host वैल्यू को अपने डेटाबेस के पते से बदलें. इसके लिए, टर्मिनल में नीचे दिए गए कमांड चलाएं:

export DB_INSTANCE_IP=$(gcloud sql instances describe quote-db-instance \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")

envsubst < deployment.yaml > deployment.new && mv deployment.new deployment.yaml

डिप्लॉयमेंट.yaml को खोलें और पुष्टि करें कि DB_Host वैल्यू, इंस्टेंस आईपी के साथ अपडेट की गई हो.

fd63c0aede14beba.png

ऐप्लिकेशन डिप्लॉय करें और उसकी पुष्टि करें

  1. Cloud Shell Editor में सबसे नीचे मौजूद पैनल में, Cloud Code चुनें. इसके बाद, स्क्रीन पर सबसे ऊपर मौजूद Kubernetes पर डीबग करें चुनें.

33a5cf41aae91adb.png

  1. बिल्ड और टेस्ट पूरे होने के बाद, आउटपुट टैब में यह मैसेज दिखता है: Resource deployment/demo-app status completed successfully और एक यूआरएल दिखता है: "सर्विस डेमो-ऐप्लिकेशन से फ़ॉरवर्ड किया गया यूआरएल: http://localhost:8080". ध्यान दें कि कभी-कभी पोर्ट, 8081 की तरह अलग हो सकता है. अगर ऐसा है, तो सही वैल्यू सेट करें. टर्मिनल में यूआरएल का मान सेट करें
export URL=localhost:8080
  1. रैंडम कोट देखें

Terminal से, रैंडम-कोट एंडपॉइंट के लिए नीचे दिए गए निर्देश को कई बार चलाएं. बार-बार किए गए कॉल पर अलग-अलग कोट के रूप में आने पर देखें

curl $URL/random-quote | jq
  1. कोटेशन जोड़ें

नीचे दिए गए निर्देश का इस्तेमाल करके, id=6 का इस्तेमाल करके एक नया कोटेशन बनाएं और देखें कि अनुरोध वापस आया है

curl -H 'Content-Type: application/json' -d '{"id":"6","author":"Henry David Thoreau","quote":"Go confidently in the direction of your dreams! Live the life you have imagined"}' -X POST $URL/quotes
  1. कोटेशन मिटाना

अब मिटाने के तरीके से जोड़े गए कोटेशन को मिटाएं और HTTP/1.1 204 रिस्पॉन्स कोड देखें.

curl -v -X DELETE $URL/quotes/6
  1. सर्वर की गड़बड़ी

एंट्री मिटाए जाने के बाद पिछला अनुरोध फिर से चलाकर, गड़बड़ी की स्थिति का अनुभव करें

curl -v -X DELETE $URL/quotes/6

ध्यान दें कि रिस्पॉन्स, HTTP:500 Internal Server Error दिखाता है.

ऐप्लिकेशन को डीबग करना

पिछले सेक्शन में, आपको ऐप्लिकेशन में एक गड़बड़ी की स्थिति दिखी थी. ऐसा तब हुआ था, जब आपने ऐसी एंट्री को मिटाने की कोशिश की थी जो डेटाबेस में नहीं थी. इस सेक्शन में, समस्या का पता लगाने के लिए एक ब्रेकपॉइंट सेट किया जाएगा. DELETE कार्रवाई के दौरान यह गड़बड़ी हुई. इसलिए, छूट कंट्रोलर क्लास के साथ काम किया जाएगा.

  1. src/main/java/com/example/springboot/QuoteController.java खोलें
  2. deleteQuote() तरीका ढूंढें
  3. यह लाइन खोजें: Optional<Quote> quote = quoteRepository.findById(id);
  4. लाइन नंबर की बाईं ओर मौजूद खाली जगह पर क्लिक करके, उस लाइन पर एक ब्रेकपॉइंट सेट करें.
  5. एक लाल इंंडिकेटर दिखेगा कि ब्रेकपॉइंट सेट हो गया है
  6. delete निर्देश फिर से चलाएं
curl -v -X DELETE $URL/quotes/6
  1. बाईं ओर मौजूद कॉलम में मौजूद आइकॉन पर क्लिक करके, डीबग व्यू पर वापस जाएं
  2. ChatController क्लास में रोकी गई डीबग लाइन को देखें.
  3. डीबगर में, step over आइकॉन b814d39b2e5f3d9e.png पर क्लिक करें
  4. देखें कि कोड, क्लाइंट को अंदरूनी सर्वर गड़बड़ी एचटीटीपी 500 दिखाता है, जो सही नहीं है.
   Trying 127.0.0.1:8080...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> DELETE /quotes/6 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 500
< Content-Length: 0
< Date: 
<
* Connection #0 to host 127.0.0.1 left intact

कोड अपडेट करना

यह कोड गलत है और एचटीटीपी 404 'नहीं मिला' स्टेटस कोड को वापस भेजने के लिए, else ब्लॉक को रीफ़ैक्टर किया जाना चाहिए.

गड़बड़ी ठीक करें.

  1. डीबग सेशन अब भी चल रहा है. इसके बाद, "जारी रखें" को दबाकर अनुरोध को पूरा करें बटन पर क्लिक करें.
  2. इसके बाद, else ब्लॉक को कोड में बदलें:
       else {
                return new ResponseEntity<HttpStatus>(HttpStatus.NOT_FOUND);
            }

तरीका कुछ ऐसा दिखना चाहिए

@DeleteMapping("/quotes/{id}")
public ResponseEntity<HttpStatus> deleteQuote(@PathVariable("id") Integer id) {
        Optional<Quote> quote = quoteRepository.findById(id);
        if (quote.isPresent()) {
            quoteRepository.deleteById(id);
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        } else {
            return new ResponseEntity<HttpStatus>(HttpStatus.NOT_FOUND);
        }
    }
  1. मिटाएं निर्देश को फिर से चलाएं
curl -v -X DELETE $URL/quotes/6
  1. डीबगर पर जाएं और कॉलर को मिला एचटीटीपी 404 नहीं मिला को देखें.
   Trying 127.0.0.1:8080...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> DELETE /quotes/6 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404
< Content-Length: 0
< Date: 
<
* Connection #0 to host 127.0.0.1 left intact
  1. डीबग टूलबार में लाल वर्ग पर क्लिक करके डीबगिंग सेशन को रोकें

12bc3c82f63dcd8a.png

6f19c0f855832407.png

6. बधाई हो

बधाई हो! इस लैब में, आपने शुरुआत से एक नया Java ऐप्लिकेशन बनाया है और उसे कंटेनर के साथ असरदार तरीके से काम करने के लिए कॉन्फ़िगर किया है. इसके बाद, आपने पुराने ऐप्लिकेशन स्टैक में मिलने वाले डेवलपर फ़्लो का इस्तेमाल करके, अपने ऐप्लिकेशन को किसी रिमोट GKE क्लस्टर में डिप्लॉय और डीबग किया.

आपने क्या सीखा

  • Cloud Workstations की मदद से InsideLoop डेवलपमेंट
  • नया Java स्टार्टर ऐप्लिकेशन बनाना
  • डेवलपमेंट प्रोसेस की जानकारी
  • एक आसान CRUD REST सर्विस डेवलप करना
  • GKE (जीकेई) क्लस्टर पर ऐप्लिकेशन डीबग करना
  • ऐप्लिकेशन को CloudSQL डेटाबेस से कनेक्ट किया जा रहा है