option_redis.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package config
  2. import (
  3. "crypto/tls"
  4. "crypto/x509"
  5. "fmt"
  6. "github.com/go-redis/redis/v7"
  7. "io/ioutil"
  8. )
  9. var _redis *redis.Client
  10. // GetRedisClient 获取redis客户端
  11. func GetRedisClient() *redis.Client {
  12. return _redis
  13. }
  14. // SetRedisClient 设置redis客户端
  15. func SetRedisClient(c *redis.Client) {
  16. if _redis != nil && _redis != c {
  17. _redis.Shutdown()
  18. }
  19. _redis = c
  20. }
  21. type RedisConnectOptions struct {
  22. Network string `yaml:"network" json:"network"`
  23. Addr string `yaml:"addr" json:"addr"`
  24. Username string `yaml:"username" json:"username"`
  25. Password string `yaml:"password" json:"password"`
  26. DB int `yaml:"db" json:"db"`
  27. PoolSize int `yaml:"pool_size" json:"pool_size"`
  28. Tls *Tls `yaml:"tls" json:"tls"`
  29. MaxRetries int `yaml:"max_retries" json:"max_retries"`
  30. }
  31. type Tls struct {
  32. Cert string `yaml:"cert" json:"cert"`
  33. Key string `yaml:"key" json:"key"`
  34. Ca string `yaml:"ca" json:"ca"`
  35. }
  36. func (e RedisConnectOptions) GetRedisOptions() (*redis.Options, error) {
  37. r := &redis.Options{
  38. Network: e.Network,
  39. Addr: e.Addr,
  40. Username: e.Username,
  41. Password: e.Password,
  42. DB: e.DB,
  43. MaxRetries: e.MaxRetries,
  44. PoolSize: e.PoolSize,
  45. }
  46. var err error
  47. r.TLSConfig, err = getTLS(e.Tls)
  48. return r, err
  49. }
  50. func getTLS(c *Tls) (*tls.Config, error) {
  51. if c != nil && c.Cert != "" {
  52. // 从证书相关文件中读取和解析信息,得到证书公钥、密钥对
  53. cert, err := tls.LoadX509KeyPair(c.Cert, c.Key)
  54. if err != nil {
  55. fmt.Printf("tls.LoadX509KeyPair err: %v\n", err)
  56. return nil, err
  57. }
  58. // 创建一个新的、空的 CertPool,并尝试解析 PEM 编码的证书,解析成功会将其加到 CertPool 中
  59. certPool := x509.NewCertPool()
  60. ca, err := ioutil.ReadFile(c.Ca)
  61. if err != nil {
  62. fmt.Printf("ioutil.ReadFile err: %v\n", err)
  63. return nil, err
  64. }
  65. if ok := certPool.AppendCertsFromPEM(ca); !ok {
  66. fmt.Println("certPool.AppendCertsFromPEM err")
  67. return nil, err
  68. }
  69. return &tls.Config{
  70. // 设置证书链,允许包含一个或多个
  71. Certificates: []tls.Certificate{cert},
  72. // 要求必须校验客户端的证书
  73. ClientAuth: tls.RequireAndVerifyClientCert,
  74. // 设置根证书的集合,校验方式使用 ClientAuth 中设定的模式
  75. ClientCAs: certPool,
  76. }, nil
  77. }
  78. return nil, nil
  79. }