Using Spring RestTemplate with Client Certificate

To configure Spring RestTemplate to use a client certification in a HTTPS connection, you can follow these steps:

  1. Defines and loads a KeyStore to store a client certificate. In this example, the certificate stored in a PKCS12 archive.
  2. Defines a SSLContextBuilder to custom and build the SSL context to be used with the RestTemplate. In this example, we need to connect to the host with self-signed certificate, so we have to load TrustSelfSignedStrategy() in the loadTrustMaterial() method.
  3. Defines a SSLConnectionSocketFactory with the SSLContextBuilder from step 2.
  4. Defines a ClosableHttpClient using HttpClients builder class and set SSLSocketFactory using SSLConnectionSocketFactory from step 3.
  5. Defines a HttpComponentsClientHttpRequestFactory using ClosableHttpClient  from step 4, and configure timeout values.

  6. Finally, create a RestTemplate using HttpComponentsClientHttpRequestFactory from step 5.
  7. To summarize.

     

นำ Redis มาใช้เป็น Cache ให้กับ Spring Boot Application

Remark: บทความนี้เขียนบน Spring Boot Version 1.5.10
Redis เป็น in-memory datastore ที่ได้รับความนิยมค่อนข้างมากในปัจจุบัน โดยใน blog entry นี้ เราจะนำ Redis มาใช้เป็น cache ให้กับ Spring Boot Application เพื่อช่วยลดการ query ข้อมูลจาก database หรือ get ข้อมูลจาก service อื่นๆ เพื่อมาใช้ในการประมวลผล การทำงานเบื้องต้นของ cache ที่เราจะใช้งานคือ

  1. ถ้าข้อมูลนั้นถูกเรียกใช้เป็นครั้งแรก จะถูกดึงมาจาก database หรือ external service และถูกเก็บลงใน cache
  2. การเรียกใช้ข้อมูลครั้งที่สองเป็นต้นไป ข้อมูลจะถูกดึงมาจาก cache
  3. ข้อมูลใน cache จะถูกลบในเวลาที่กำหนด และการทำงานจะกลับไปเริ่มที่ 1. อีกครั้ง
โดยมีวิธีการอย่างง่าย ดังนี้
  1. สร้าง class Message ขึ้นมาเพื่อเป็น model ของข้อมูลที่เราจะใช้งาน โดยในที่นี้เราจะใช้ project lombok ช่วยในการทำ getter, setter และ constructor
  2. สร้าง MessageService ที่ทำงานกับ model Message
  3. สร้าง controller และ API method ที่เรียกใช้งาน MessageService รวมถึง main class


    ตอนนี้เราจะได้ API ที่ทำงานกับ model Message โดยจะสร้าง object Message ขึ้นมาใหม่โดยมี property number และ text ตามที่เราส่งไปใน URL ที่เป็น GET method
    ในขั้นตอนต่อไปจะเป็นการใช้งาน Redis เพื่อเป็น cache ให้กับ application โดยมีการทำงานตามที่กล่าวไว้ด้านบน

    localhost:8080/send/100?text=mymessage

  4. เพิ่ม @EnableCaching เข้าไปใน main class ของ application เพื่อเปิดการใช้งาน cache ของ Spring Boot

  5. เพิ่ม configuration properties ที่จำเป็น เข้าไปใน application.properties

  6. เพิ่ม @Cacheable และกำหนด cache name ให้กับ method ที่ทำการดึงข้อมูลที่เราต้องการจะ cache

  7. สร้าง bean CacheManagerCustomizer เพื่อช่วยในการกำหนดการทำงานของ cache ให้เป็นไปตามที่เราต้องการ โดยเราต้องการกำหนดเวลาที่ cache จะ expire เพื่อที่จะไปดึงข้อมูลที่อัพเดทล่าสุดขึ้นมา

  8. ทำการทดสอบ จะได้ผลเป็นดังนี้
    8.1 เมื่อ call API ครั้งแรก method buildMessage() จะถูกเรียกใช้งานจริง และ println ข้อความที่เรากำหนดไว้

    localhost:8080/send/1000?text=mymessage1

    8.2 เมื่อ call API ครั้งถัดมา method buildMessage() จะ return ค่าที่ cache ไว้ สังเกตจาก ไม่มีการ println ข้อความที่เรากำหนด

    8.3 เมื่อครบกำหนดเวลาที่เราต้องการให้ cache expire ในตัวอย่างนี้คือ 20 วินาที แล้ว call API method buildMessage() จะถูกเรียกใช้งานจริง เนื่องจากข้อมูลที่ cache ไว้นั้น expire ไปแล้ว

    8.4 ถ้ามีการเปลี่ยนข้อมูลของ Message ที่ส่งไปกับ URL method buildMessage() จะถูกเรียกใช้งานจริง เนื่องจากข้อมูลใหม่นั้นยังไม่มีใน cache

    localhost:8080/send/1001?text=mymessage2



    เป็นอันเสร็จพิธี!