1. Viper এর পরিচিতি
জিও অ্যাপ্লিকেশনে কনফিগারেশন সমাধানের প্রয়োজনীয়তা
বিশ্বস্ত এবং রক্ষণীয় সফ্টওয়্যার তৈরির জন্য, ডেভেলপারদের এপ্লিকেশনের লজিক থেকে কনফিগারেশনকে আলাদা করা প্রয়োজন হয়। এটি আপনাকে এপ্লিকেশনের আচরণ পরিবর্তন করার সুযোগ দেয় কোডবেস পরিবর্তন না করে। এই আলাদা করার ছাড়া কনফিগারেশন সমাধানটি কনফিগারেশন ডেটা এক্সটারনালাইজেশন দ্বারা এই বিভিন্ন পরিবেশের সমর্থন করে।
গো অ্যাপ্লিকেশনগুলি এই ধরনের সিস্টেম থেকে বিশেষ সুবিধা পাবে, স্পেশালি যখন তারা জটিলতায় বড় হয় এবং বিভিন্ন ডিপ্লয়মেন্ট এনভায়রনমেন্টের সামনে টাকাপ করে। এই প্রতিটি পরিবেশই ডাটাবেস সংযোগ, এপিআই কী, পোর্ট নম্বর এবং অন্যান্য সেটিংসের জন্য বিভিন্ন সেটিং প্রয়োজন করে পারে। এই মানগুলি হার্ডকোড করা সমস্যাপূর্ণ এবং ত্রুটিপূর্ণ হতে পারে, যেহেতু এটি বিভিন্ন কনফিগারেশন রকমগুলি রক্ষণা করার জন্য পরিবর্তন করা এবং সংবেদনশীল ডেটা প্রদর্শনের ঝুঁকি বাড়ায়।
Viper এর মতো একটি কনফিগারেশন সমাধান এই সমস্যাগুলি ঠিক করে, যা বিভিন্ন কনফিগারেশন সংক্রান্ত প্রয়োজন এবং বিন্যাস সমর্থন করে।
Viper এর ওভারভিউ এবং কনফিগারেশন ব্যবস্থাপনায় তার ভূমিকা
Viper হল গো অ্যাপ্লিকেশনগুলির জন্য একটি ব্যাপক কনফিগারেশন লাইব্রেরি, যা সব ধরনের কনফিগারেশন প্রয়োজনের জন্য অধিকারী সমাধান হতে লক্ষ্য করে। এটি বার্ষিকা এ্যাপ মেথডোলজিতে স্বাধীন স্থানে কনফিগারেশন সংরক্ষণ প্রচুর করার প্রথাগত অনুশীলন করে।
Viper কনফিগারেশন ব্যবস্থাপনায় গুরুত্বপূর্ণ ভূমিকা পালন করে এদ্বারা:
- JSON, TOML, YAML, HCL এবং অন্যান্য ফরম্যাটে কনফিগারেশন ফাইল পড়া এবং unmarshaling করা।
- বাহ্যিক কনফিগারেশন সিদ্ধান্ত প্রযোজনে দেওয়া পর্যবেক্ষণ মাধ্যমে বায়োর কনফিগারেশন মান অভিবাদনে পতিতকর।
- রানটাইমে পারমিটার বিন্যাসের জন্য কমান্ড লাইন ফ্ল্যাগ বাইন্ডিং এবং পড়া মাধ্যমে পড়া।
- বাহ্যিকভাবে প্রদান করা না হলে অ্যাপ্লিকেশনের জন্য ডিফল্ট সেট করা।
- কনফিগারেশন ফাইলে পরিবর্তনের জন্য নজর রাখার এবং লাইভ রিলোডিং, যা সংবেদনশীলতা প্রদান এবং কনফিগ পরিবর্তন নিরাপত্তা কমান।
2. ইনস্টল এবং সেটআপ
Go মডিউল ব্যবহার করে Viper ইনস্টল করা
ভাইপার আপনার গো প্রজেক্টে যোগ করার জন্য, নিশ্চিত করুন যে আপনার প্রজেক্টটি ডিপেন্ডেন্সি ম্যানেজমেন্টের জন্য ইতিমধ্যে গো মডিউল ব্যবহার করছে। যদি আপনার ইতিমধ্যে গো প্রজেক্ট থাকে, তাহলে সাধারণভাবে আপনার প্রজেক্টের মূল ফোল্ডারে একটি go.mod
ফাইল থাকবে। যদি না থাকে, তাহলে নিচের কমান্ড চালিয়ে গো মডিউল ইনিশিয়ালাইজ করতে পারেন:
go mod init <মডিউল-নাম>
<মডিউল-নাম>
এর প্লেসহোল্ডারে আপনার প্রজেক্টের নাম বা পথ রিপ্লেস করুন। আপনার প্রজেক্টে গো মডিউল ইনিশিয়ালাইজ করার পরে, আপনি Viper-কে একটি ডিপেন্ডেন্সি হিসেবে যোগ করতে পারেন:
go get github.com/spf13/viper
এই কমান্ডটি Viper প্যাকেজটি ধরে দেয় এবং আপনার go.mod
ফাইলে এর সংস্করণ রেকর্ড করে।
গো প্রজেক্টে Viper আরম্ভ করা
আপনার গো প্রজেক্টে Viper ব্যবহার করতে, আপনাকে প্যাকেজটি ইম্পোর্ট করে নতুন ভাইপারের ইনস্ট্যান্স তৈরি করতে এবং প্রিডিফাইনড সিঙ্গলটন ব্যবহার করার জন্য আগে সেট করতে হবে। নিচে এই দুটি কাজই করার একটি উদাহরণ দেয়া হল:
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
// প্রিডিফাইনড সিঙ্গলটন ব্যবহার করা, যা প্রি-কনফিগার এবং ব্যবহারের জন্য প্রস্তুত
viper.SetDefault("সেবা-নাম", "আমার অসাধারণ সেবা")
// বা, একটি নতুন ভাইপার ইন্স্ট্যান্স তৈরি করা
আমারভাইপার := viper.New()
আমারভাইপার.SetDefault("সেবা-নাম", "আমার নতুন সেবা")
// সিঙ্গলটন ইন্স্ট্যান্স ব্যবহার করে একটি কনফিগারেশন মানের অ্যাক্সেস
serviceName := viper.GetString("সেবা-নাম")
fmt.Println("সেবা নাম:", serviceName)
// নতুন ইন্স্ট্যান্স ব্যবহার করে একটি কনফিগারেশন মানের অ্যাক্সেস
newServiceName := আমারভাইপার.GetString("সেবা-নাম")
fmt.Println("নতুন সেবা নাম:", newServiceName)
}
উপরের কোডে, SetDefault
ব্যবহার করা হয়েছে কনফিগারেশন কীর জন্য একটি ডিফল্ট মান সংজ্ঞায়িত করার জন্য। GetString
মেথডটি একটি মান পোঁছে। যখন আপনি এই কোডটি চালিয়ে, তখন এটি আমরা যে সেবা নামগুলি নির্ধারণ করেছি, তা সিঙ্গেলটন ইন্স্ট্যান্স এবং নতুন ইন্স্ট্যান্সগুলির মাধ্যমে প্রিন্ট করে।
3. কনফিগারেশন ফাইল পড়া এবং লিখা
কনফিগারেশন ফাইলের সাথে কাজ বেয়ে চলা Viper এ
কনফিগারেশন ফরম্যাট সেটআপ (JSON, TOML, YAML, HCL, ইত্যাদি)
Viper এ পাঁচটি কনফিগারেশন ফরম্যাট (JSON, TOML, YAML, HCL, ইত্যাদি) সমর্থন করে। শুরু করতে, আপনাকে কনফিগারেশন ফাইল যেটা Viper খোঁজোর জন্য দেখবে সেট করতে হবে:
v := viper.New()
v.SetConfigName("app") // কনফিগারেশন ফাইল এর নাম (এক্সটেনশন ছাড়া)
v.SetConfigType("yaml") // "json", "toml", "yml", "hcl", ইত্যাদি
// কনফিগারেশন ফাইল অনুসন্ধানের পাথ। যদি আপনার কনফিগারেশন ফাইলের লোকেশন পারিবর্তিত হয়।
v.AddConfigPath("$HOME/.appconfig") // টিপিকাল UNIX ব্যবহারকারীর কনফিগ লোকেশন
v.AddConfigPath("/etc/appconfig/") // UNIX সিস্টেম-ওয়াইড কনফিগারেশন পাথ
v.AddConfigPath(".") // কাজের ডিরেক্টরি
কনফিগারেশন ফাইল থেকে পড়া এবং কনফিগারেশন ফাঁকা করা
Viper ইনস্ট্যান্স জানলে
5. দূরবর্তী কী/মান স্টোর সমর্থন
Viper এটিসিডি, Consul, অথবা Firestore এর মত দূরবর্তী কী/মান স্টোর ব্যবহার করে অ্যাপ্লিকেশন কনফিগারেশন পরিচালনা করার জন্য শক্তিশালী সমর্থন প্রদান করে। এটা কনফিগারেশনগুলির কেন্দ্রীকরণ এবং বিতরণযোগ্য সিস্টেমের মধ্যে পরিবর্তনশীল ভাবে আপডেট করার সুযোগ দেয়। তাছাড়া, Viper সাহায্য করে সহজ পদক্ষেপে সংবেদনশীল কনফিগারেশন নিয়ন্ত্রণ করা যায়।
ভাইপার কে দূরবর্তী কী/মান স্টোর সম্মিলিত করা (এটিসিডি, Consul, Firestore, ইত্যাদি)
দূরবর্তী কী/মান স্টোর সহ ভাইপার ব্যবহার শুরু করতে, আপনার গো অ্যাপ্লিকেশনে viper/remote
প্যাকেজের এক খালি ইম্পোর্ট করতে হবে:
import _ "github.com/spf13/viper/remote"
এটিসিডি সাথে সম্মিলিত করা সম্পর্কিত একটি উদাহরণ দেখা যাক:
import (
"log"
"github.com/spf13/viper"
_ "github.com/spf13/viper/remote"
)
func initRemoteConfig() {
viper.SetConfigType("json") // রিমোট কনফিগারেশন ফাইলের ধরন সেট করুন
viper.AddRemoteProvider("etcd", "http://127...1:4001", "/config/myapp.json")
err := viper.ReadRemoteConfig() // রিমোট কনফিগ পড়ানোর চেষ্টা করুন
if err != nil {
log.Fatalf("রিমোট কনফিগ পড়ানো ব্যর্থ: %v", err)
}
log.Println("রিমোট কনফিগারেশন সফলভাবে পড়া হয়েছে")
}
func main() {
initRemoteConfig()
// আপনার অ্যাপ্লিকেশন লজিক এখানে
}
এই উদাহরণে, Viper একটি এটিসিডি সার্ভারে যুক্ত হয় http://127...1:4001
এবং /config/myapp.json
অবস্থিত কনফিগারেশন পড়ে। Consul সহ অন্যান্য স্টোরে কাজ করার সময়, "etcd"
এর সাথে পরিবর্তন করতে হবে "consul"
এবং সরদার-নির্দিষ্ট প্যারামিটারগুলি পরিষ্কার করতে হবে।
এক্ষ্ণে গোপন কনফিগারেশনের পরিচালনা
API কী বা ডাটাবেস ক্রেডেনশিয়ালস এলাকায় স্থান রাখা উচিত নয়। Viper এসোয় এই সহজ পদক্ষেপে কনফিগারেশন করার জন্য গোপন কনফিগারেশন অন্যত্রিত বিবরণ চিন্তার সমর্থন করে।
এই বৈশিষ্ট্যটি ব্যবহার করতে, নিশ্চিত করুন যে এনক্রিপ্টেড সেটিংগগুলি আপনার কী/মান স্টোরে সংরক্ষণ করা আছে। তারপর Viper এর AddSecureRemoteProvider
ব্যবহার করুন। এটা এটিসিডির সাথে ব্যবহার করা উদাহরণ দেখানো হল:
import (
"log"
"github.com/spf13/viper"
_ "github.com/spf13/viper/remote"
)
func initSecureRemoteConfig() {
const secretKeyring = "/path/to/secret/keyring.gpg" // আপনার কী-মান ফাইলের পথ
viper.SetConfigType("json")
viper.AddSecureRemoteProvider("etcd", "http://127...1:4001", "/config/myapp.json", secretKeyring)
err := viper.ReadRemoteConfig()
if err != nil {
log.Fatalf("রিমোট কনফিগ পড়ানোর সমর্থন না: %v", err)
}
log.Println("রিমোট কনফিগারেশন সফলভাবে পড়া এবং ডিক্রিপ্ট করা হয়েছে")
}
func main() {
initSecureRemoteConfig()
// আপনার অ্যাপ্লিকেশন লজিক এখানে
}
উপরের উদাহরণে, AddSecureRemoteProvider
ব্যবহার করা হয়, ডিক্রিপশনের জন্য প্রয়োজনীয় কীগুলি ধারন করা গলয।
6. নাজেব এবং কনফিগ পরিবর্তনের হ্যান্ডলিং
Viper এর সাক্ষাৎ একটি শক্তিশালী বৈশিষ্ট্য হ'ল অ্যাপ্লিকেশন পুনরায় চালু করা ছাড়া ব্যাবস্থানিক কনফিগারেশন পরিবর্তনের মনিটর এবং প্রতিক্রিয়া দেওয়ার ক্ষমতা।
কনফিগারেশন পরিবর্তন এবং পরতিক্রিয়া দেওয়া
Viper একটি উপায় ব্যবহার করে fsnotify
প্যাকেজ দেখার জন্য আপনার কনফিগারেশন ফাইলের পরিবর্তনের জন্য ইভেন্ট ঘটে। আপনি একটি ওয়াচার সেটআপ করতে পারেন যাতে কোনও কনফিগারেশন ফাইলে পরিবর্তন হওয়ার সময় ইভেন্ট ট্রিগার করতে পারেন:
import (
"log"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
func watchConfig() {
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
log.Printf("কনফিগারেশন ফাইল পরিবর্তন হয়েছে: %s", e.Name)
// আপনি যদি প্রয়োজন হয়, তাহলে আপডেট কনফিগারেশন পড়াতে পারেন
// সার্ভিস পুনরায় আরম্ভ করার মতো যেকোনো ক্রিয়া অনুষ্ঠান করুন
})
}
func main() {
viper.SetConfigName("myapp")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
log.Fatalf("কনফিগারেশন ফাইল পড়ানোর গ্লিচ, %s", err)
}
watchConfig()
// আপনার অ্যাপ্লিকেশন লজিক এখানে
}
চালু অ্যাপ্লিকেশনে কনফিগারেশন আপডেট করার জন্য ট্রিগার
একটি চলমান অ্যাপ্লিকেশনে, আপনি বিভিন্ন ট্রিগারের জবাবে কনফিগারেশনগুলি আপডেট করতে চাইতে পারেন, যেমন একটি সিগনাল, সময়ের ভিত্তিতে জব, বা একটি API অনুরোধ। আপনি আপনার অ্যাপ্লিকেশনকে Viper's re-read configurations এর ভিত্তিতে তার অভ্যন্তরীণ অবস্থান নবায়ন করতে পারেন।
import (
"os"
"os/signal"
"syscall"
"time"
"log"
"github.com/spf13/viper"
)
func setupSignalHandler() {
signalChannel := make(chan os.Signal, 1)
signal.Notify(signalChannel, syscall.SIGHUP) // SIGHUP সিগনাল শুনতে
go func() {
for {
sig := <-signalChannel
if sig == syscall.SIGHUP {
log.Println("SIGHUP সিগনাল পেয়েছে। কনফিগারেশন পুনরায় পড়া... ")
err := viper.ReadInConfig() // কনফিগারেশন পুনরায় পড়া
if err != nil {
log.Printf("কনফিগ পুনরায় পড়া ব্যর্থ: %s", err)
} else {
log.Println("কনফিগারেশন সফলভাবে পুনরায় পড়া হয়েছে।")
// এখানে নতুন কনফিগারেশনের উপর ভিত্তি করে আপনার অ্যাপ্লিকেশনটি পুনরায় কনফিগার করুন
}
}
}
}()
}
func main() {
viper.SetConfigName("myapp")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
log.Fatalf("কনফিগ ফাইল পড়া ব্যর্থ, %s", err)
}
setupSignalHandler()
for {
// অ্যাপ্লিকেশনের মূল লজিক
time.Sleep(10 * time.Second) // কিছু কাজ সিমুলেট করা
}
}
এই উদাহরণে, আমরা SIGHUP
সিগনাল শুনতের জন্য একটি হ্যান্ডলার সেট আপ করছি। যখন পেয়ে গেল, Viper কনফিগারেশন ফাইল পুনরায় পড়া এবং অ্যাপ্লিকেশনটি তার কনফিগারেশন বা অবস্থা প্রয়োজনে আপডেট করা উচিত।
সবসময় মনে রাখবেন যে এই কনফিগারেশনগুলি টেস্ট করতে হবে যাতে আপনার অ্যাপ্লিকেশন পরিবর্তনশীল আপডেট সুবিধাজনকভাবে প্রকারবিধি করতে পারে।