redis
安装
go get github.com/hertz-contrib/registry/redis
服务注册
Option
Redis 拓展在服务注册部分中提供了 option 配置。
WithExpireTime
Redis 扩展提供了 WithExpireTime
配置存储服务信息的 Key 的过期时间(秒为单位)。默认为 60 秒。
注意:过期时间必须大于刷新间隔。
函数签名:
func WithExpireTime(time int) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithExpireTime(10))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
WithRefreshInterval
Redis 扩展提供了 WithRefreshInterval
配置存储服务信息的 Key 的过期时间刷新间隔(秒为单位)。默认为 30 秒。
注意:刷新间隔必须小于过期时间。
函数签名:
func WithRefreshInterval(interval int) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithRereshInterval(5))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
WithPassword
Redis 扩展提供了 WithPassword
配置 redis 的密码,此密码必须匹配服务器配置选项中指定的密码。默认为空。
函数签名:
func WithPassword(password string) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithPassword("123456"))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
WithDB
Redis 扩展提供了 WithDB
配置连接到服务器后要选择的数据库。默认为 0。
函数签名:
func WithDB(db int) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithDB(1))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
WithTLSConfig
Redis 扩展提供了 WithTLSConfig
配置 TLS 的配置项。
函数签名:
func WithTLSConfig(t *tls.Config) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithTLSConfig(&tls.Config{
// ...
}))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
WithDialer
Redis 扩展提供了 WithDialer
配置 Dialer,Dialer 将会创建新的网络连接并优先于 Network 和 Addr 选项。
函数签名:
func WithDialer(dialer func(ctx context.Context, network, addr string) (net.Conn, error)) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithDialer(
// ...
))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
WithReadTimeout
Redis 扩展提供了 WithReadTimeout
配置读取 socket 超时的时间,默认为 3 秒。
函数签名:
func WithReadTimeout(t time.Duration) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithReadTimeout(5*time.Second))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
WithWriteTimeout
Redis 扩展提供了 WithWriteTimeout
配置写入 socket 超时的时间,默认等同于 ReadTimeout
。
函数签名:
func WithWriteTimeout(t time.Duration) Option
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithWriteTimeout(5*time.Second))
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
NewRedisRegistry
NewRedisRegistry
使用 redis 创建一个新的服务注册中心,需要传入目标地址。可自定义客户端配置并传入 NewClient
创建一个新的客户端。
函数签名:
func NewRedisRegistry(addr string, opts ...Option) registry.Registry
示例代码:
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379")
// ...
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
// ...
}
服务发现
Option
Redis 拓展在服务发现部分中提供了 option 配置。
WithPassword
Redis 扩展提供了 WithPassword
配置 redis 的密码,此密码必须匹配服务器配置选项中指定的密码。默认为空。
函数签名:
func WithPassword(password string) Option
示例代码:
func main() {
cli, err := client.NewClient()
// ...
r := redis.NewRedisResolver("127.0.0.1:6379", redis.WithPassword("123456"))
cli.Use(sd.Discovery(r))
// ...
}
WithDB
Redis 扩展提供了 WithDB
配置连接到服务器后要选择的数据库。默认为 0。
函数签名:
func WithDB(db int) Option
示例代码:
func main() {
cli, err := client.NewClient()
// ...
r := redis.NewRedisResolver("127.0.0.1:6379", redis.WithDB(1))
cli.Use(sd.Discovery(r))
// ...
}
WithTLSConfig
Redis 扩展提供了 WithTLSConfig
配置 TLS 的配置项。
函数签名:
func WithTLSConfig(t *tls.Config) Option
示例代码:
func main() {
cli, err := client.NewClient()
// ...
r := redis.NewRedisResolver("127.0.0.1:6379", redis.WithTLSConfig(&tls.Config{
// ...
}))
cli.Use(sd.Discovery(r))
// ...
}
WithDialer
Redis 扩展提供了 WithDialer
配置 Dialer,Dialer 将会创建新的网络连接并优先于 Network 和 Addr 选项。
函数签名:
func WithDialer(dialer func(ctx context.Context, network, addr string) (net.Conn, error)) Option
示例代码:
func main() {
cli, err := client.NewClient()
// ...
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithDialer(
// ...
))
cli.Use(sd.Discovery(r))
// ...
}
WithReadTimeout
Redis 扩展提供了 WithReadTimeout
配置读取 socket 超时的时间,默认为 3 秒。
函数签名:
func WithReadTimeout(t time.Duration) Option
示例代码:
func main() {
cli, err := client.NewClient()
// ...
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithReadTimeout(5*time.Second))
// ...
cli.Use(sd.Discovery(r))
// ...
}
WithWriteTimeout
Redis 扩展提供了 WithWriteTimeout
配置写入 socket 超时的时间,默认等同于 ReadTimeout
。
函数签名:
func WithWriteTimeout(t time.Duration) Option
示例代码:
func main() {
cli, err := client.NewClient()
// ...
r := redis.NewRedisRegistry("127.0.0.1:6379", redis.WithWriteTimeout(5*time.Second))
// ...
cli.Use(sd.Discovery(r))
// ...
}
NewRedisResolver
NewRedisResolver
使用 redis 创建一个新的服务发现中心,需要传入目标地址。可自定义客户端配置并传入 NewClient
创建一个新的客户端。
函数签名:
func NewRedisResolver(addr string, opts ...Option) discovery.Resolver
示例代码:
func main() {
cli, err := client.NewClient()
// ...
r := redis.NewRedisResolver("127.0.0.1:6379")
cli.Use(sd.Discovery(r))
// ...
}
使用示例
服务端
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/app/server/registry"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
"github.com/hertz-contrib/registry/redis"
)
func main() {
r := redis.NewRedisRegistry("127.0.0.1:6379")
addr := "127.0.0.1:8888"
h := server.Default(
server.WithHostPorts(addr),
server.WithRegistry(r, ®istry.Info{
ServiceName: "hertz.test.demo",
Addr: utils.NewNetAddr("tcp", addr),
Weight: 10,
Tags: nil,
}),
)
h.GET("/ping", func(_ context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"ping": "pong"})
})
h.Spin()
}
客户端
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app/client"
"github.com/cloudwego/hertz/pkg/app/middlewares/client/sd"
"github.com/cloudwego/hertz/pkg/common/config"
"github.com/cloudwego/hertz/pkg/common/hlog"
"github.com/hertz-contrib/registry/redis"
)
func main() {
cli, err := client.NewClient()
if err != nil {
panic(err)
}
r := redis.NewRedisResolver("127.0.0.1:6379")
cli.Use(sd.Discovery(r))
for i := 0; i < 10; i++ {
status, body, err := cli.Get(context.Background(), nil, "http://hertz.test.demo/ping", config.WithSD(true))
if err != nil {
hlog.Fatal(err)
}
hlog.Infof("HERTZ: code=%d,body=%s", status, string(body))
}
}
配置
可自定义 redis 客户端以及服务端的配置,参考 go-redis 配置。
完整示例
完整用法示例详见 example 。