שימוש ב- Couchbase ביישום אביב

1. הקדמה

במעקב זה למבוא שלנו ל- Couchbase, אנו יוצרים סט של שירותי Spring שניתן להשתמש בהם יחד ליצירת שכבת התמדה בסיסית ליישום Spring ללא שימוש ב- Spring Data.

2. שירות אשכולות

על מנת לספק את האילוץ שרק יחיד CouchbaseEnvironment עשוי להיות פעיל ב- JVM, אנו מתחילים בכתיבת שירות המתחבר לאשכול Couchbase ומספק גישה לדלי נתונים מבלי לחשוף ישירות את אֶשׁכּוֹל אוֹ CouchbaseEnvironment מקרים.

2.1. מִמְשָׁק

הנה שלנו ClusterService מִמְשָׁק:

ממשק ציבורי ClusterService {Bucket openBucket (שם מחרוזת, סיסמת מחרוזת); }

2.2. יישום

מחלקת היישום שלנו מיידית DefaultCouchbaseEnvironment ומתחבר לאשכול במהלך @PostConstruct שלב במהלך אתחול הקשר האביבי.

זה מבטיח שהאשכול אינו ריק וכי הוא מחובר כאשר הכיתה מוזרקת למחלקות שירות אחרות, ובכך מאפשרת להם לפתוח דלי נתונים אחד או יותר:

המחלקה הציבורית @Service ClusterServiceImpl מיישם את ClusterService {אשכול אשכול פרטי; @PostConstruct ריק ריק init () {CouchbaseEnvironment env = DefaultCouchbaseEnvironment.create (); אשכול = CouchbaseCluster.create (env, "localhost"); } ...}

לאחר מכן, אנו מספקים א ConcurrentHashMap להכיל את הדליים הפתוחים וליישם את openBucket שיטה:

דלי מפה פרטיים = ConcurrentHashMap חדש (); @Override Bucket openBucket ציבורי מסונכרן (שם מחרוזת, סיסמת מחרוזת) {if (! Buckets.containsKey (name)) {Bucket bucket = cluster.openBucket (שם, סיסמה); buckets.put (שם, דלי); } להחזיר דליים. get (שם); }

3. שירות דלי

תלוי איך אתה מתכנן את האפליקציה שלך, ייתכן שיהיה עליך לספק גישה לאותה דלי נתונים במספר שירותי Spring.

אם רק ניסינו לפתוח את אותה דלי בשני שירותים או יותר במהלך הפעלת היישום, השירות השני שניסה זאת עשוי להיתקל ב ConcurrentTimeoutException.

כדי להימנע מתרחיש זה, אנו מגדירים א BucketService ממשק ושיעור יישום לדלי. כל כיתת יישום משמשת כגשר בין ClusterService והשיעורים הזקוקים לגישה ישירה לפרט מסוים דְלִי.

3.1. מִמְשָׁק

הנה שלנו BucketService מִמְשָׁק:

ממשק ציבורי BucketService {Bucket getBucket (); }

3.2. יישום

המחלקה הבאה מספקת גישה ל"baeldung-tutorialדלי:

@Service @Qualifier ("TutorialBucketService") כיתה ציבורית TutorialBucketService מיישמת את BucketService {@ אוטומטית ClusterService בסיס בסיס; דלי דלי פרטי; @ PostConstruct ריק ריק init () {bucket = couchbase.openBucket ("מדריך baeldung", ""); } @Override Bucket ציבורי getBucket () {דלי להחזיר; }}

על ידי הזרקת ה- ClusterService בשלנו TutorialBucketService כיתת יישום ופתיחת הדלי בשיטה שמסומנת עליה @PostConstruct, הבטחנו שהדלי יהיה מוכן לשימוש כאשר ה- TutorialBucketService ואז מוזרק לשירותים אחרים.

4. שכבת התמדה

כעת, כשיש לנו שירות להשיג דְלִי למשל, ניצור שכבת התמדה דמוית מאגר המספקת פעולות CRUD עבור מחלקות ישויות לשירותים אחרים מבלי לחשוף את דְלִי מופע אליהם.

4.1. ישות האדם

הנה ה אדם מחלקת ישויות שאנו מעוניינים להתמיד בה:

אדם בכיתה ציבורית {מזהה מחרוזת פרטי; סוג מחרוזת פרטי; שם מחרוזת פרטי; בית מחרוזת פרטי; // סטרים וקובעים סטנדרטיים}

4.2. המרת כיתות ישות ל- JSON וממנו

להמיר שיעורי ישות אל וממנו JsonDocument אובייקטים בהם משתמש Couchbase בפעולות ההתמדה שלו, אנו מגדירים את JsonDocumentConverter מִמְשָׁק:

ממשק ציבורי JsonDocumentConverter {JsonDocument toDocument (T t); T fromDocument (JsonDocument doc); }

4.3. יישום ממיר JSON

בשלב הבא עלינו ליישם א JsonConverter ל אדם ישויות.

@Service בכיתה ציבורית PersonDocumentConverter מיישם את JsonDocumentConverter {...}

נוכל להשתמש ב- ג'קסון הספרייה בשיתוף עם JsonObject כיתות toJson ו מג'ייסון שיטות לסידור והעלאת סדר הערך שלישויות, אולם יש תקורה נוספת בכך.

במקום זאת, עבור לתעד נשתמש בשיטות הקולחות של JsonObject מחלקה ליצור ולאכלס א JsonObject לפני שעוטפים אותו א JsonDocument:

@ ביטול ציבורי JsonDocument toDocument (אדם p) {JsonObject content = JsonObject.empty () .put ("type", "Person") .put ("name", p.getName ()) .put ("homeTown", p .getHomeTown ()); להחזיר את JsonDocument.create (p.getId (), תוכן); }

ובשביל מ- Document נשתמש ב-JsonObject כיתות getString השיטה יחד עם הקובעים ב אדם בכיתה שלנו מ- Document שיטה:

@ לציין אדם ציבורי מ- Document (JsonDocument doc) {JsonObject content = doc.content (); אדם p = אדם חדש (); p.setId (doc.id ()); p.setType ("אדם"); p.setName (content.getString ("שם")); p.setHomeTown (content.getString ("בית העיר")); החזר p; }

4.4. ממשק CRUD

כעת אנו יוצרים כללי CrudService ממשק המגדיר פעולות התמדה עבור כיתות ישויות:

ממשק ציבורי CrudService {void create (T t); T לקרוא (מזהה מחרוזת); T readFromReplica (מזהה מחרוזת); עדכון ריק (T t); מחיקה בטלה (מזהה מחרוזת); בוליאני קיים (מחרוזת מזהה); }

4.5. הטמעת שירות CRUD

עם כיתות הישות והממיר במקום, אנו מיישמים כעת את ה- CrudService בשביל ה אדם ישות, מזריק את שירות הדלי וממיר המסמכים שמוצג לעיל ואוחזר את הדלי במהלך האתחול:

@Service מחלקה ציבורית PersonCrudService מיישמת את CrudService {@ TutorialBucketService פרטית אוטומטית: bucketService; ממיר אישי ממיר PersonDocumentConverter @; דלי דלי פרטי; @PostConstruct ריק ריק init () {bucket = bucketService.getBucket (); } @ ביטול ריק ריק ציבורי (אדם אדם) {if (person.getId () == null) {person.setId (UUID.randomUUID (). ToString ()); } מסמך JsonDocument = converter.toDocument (אדם); bucket.insert (מסמך); } @ Public ציבורי קרא (מזהה מחרוזת) {JsonDocument doc = bucket.get (id); return (doc! = null? converter.fromDocument (doc): null); } @Override אדם ציבורי readFromReplica (מזהה מחרוזת) {רשימה docs = bucket.getFromReplica (id, ReplicaMode.FIRST); return (docs.isEmpty ()? null: converter.fromDocument (docs.get (0))); } @ עדכון ריקול ציבורי @ (אדם אדם) {מסמך JsonDocument = converter.toDocument (אדם); bucket.upsert (מסמך); } @ עקירה מחיקה של ריק ריק (מזהה מחרוזת) {bucket.remove (מזהה); } @ Override בוליאני ציבורי קיים (מזהה מחרוזת) {return bucket.exists (id); }}

5. לשים את הכל ביחד

עכשיו שיש לנו את כל החלקים של שכבת ההתמדה שלנו במקום, הנה דוגמה פשוטה לשירות רישום המשתמש ב- PersonCrudService להתמיד ולאחזר את הנרשמים:

@Service מחלקה ציבורית RegistrationService {@ PersonCrudService פרטי פרטי. register void registerNewPerson (שם מחרוזת, מחרוזת homeTown) {אדם אדם = אדם חדש (); person.setName (שם); person.setHomeTown (homeTown); crud.create (אדם); } אדם ציבורי findRegistrant (מזהה מחרוזת) {try {return crud.read (id); } לתפוס (CouchbaseException e) {return crud.readFromReplica (id); }}}

6. מסקנה

הראינו כי עם כמה שירותי Spring בסיסיים, זה טריוויאלי למדי לשלב את Couchbase ביישום Spring ולהטמיע שכבת התמדה בסיסית מבלי להשתמש בנתוני Spring.

קוד המקור המוצג במדריך זה זמין בפרויקט GitHub.

תוכל ללמוד עוד על ה- Couchbase Java SDK באתר התיעוד הרשמי של מפתחי Couchbase.


$config[zx-auto] not found$config[zx-overlay] not found