在 trpc-go
中,定时服务通常用于执行周期性的任务,比如定时数据同步、定时清理、定时发送通知等。trpc-go
是一个基于 Go 语言的高性能 RPC 框架,它本身并没有直接提供定时任务的功能,但你可以通过结合 Go 的定时器(如 time.Ticker
或 time.Timer
)来实现定时服务。
package timer
import (
"context"
)
type TimerService interface {
StartTimer(ctx context.Context, req *StartTimerRequest) (*StartTimerResponse, error)
}
type StartTimerRequest struct {
Interval int64 // 定时器间隔时间,单位:秒
}
type StartTimerResponse struct {
Message string
}
package timer
import (
"context"
"log"
"time"
"trpc.group/trpc-go/trpc-go"
)
type timerService struct{}
func (s *timerService) StartTimer(ctx context.Context, req *StartTimerRequest) (*StartTimerResponse, error) {
interval := time.Duration(req.Interval) * time.Second
ticker := time.NewTicker(interval)
defer ticker.Stop()
go func() {
for {
select {
case <-ticker.C:
// 定时任务逻辑
log.Println("定时任务执行中...")
// 这里可以调用其他 RPC 方法或执行其他业务逻辑
case <-ctx.Done():
log.Println("定时任务已停止")
return
}
}
}()
return &StartTimerResponse{Message: "定时任务已启动"}, nil
}
func NewTimerService() TimerService {
return &timerService{}
}
package main
import (
"log"
"trpc.group/trpc-go/trpc-go"
"trpc.group/trpc-go/trpc-go/server"
"your_project/timer"
)
func main() {
// 创建 RPC 服务
svr := trpc.NewServer()
// 注册 TimerService
timer.RegisterTimerService(svr, timer.NewTimerService())
// 启动 RPC 服务
if err := svr.Serve(); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
package main
import (
"context"
"log"
"time"
"trpc.group/trpc-go/trpc-go"
"your_project/timer"
)
func main() {
// 创建 RPC 客户端
client := timer.NewTimerServiceClientProxy()
// 调用 StartTimer 方法,设置定时器间隔为 5 秒
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
defer cancel()
resp, err := client.StartTimer(ctx, &timer.StartTimerRequest{Interval: 5})
if err != nil {
log.Fatalf("failed to start timer: %v", err)
}
log.Println(resp.Message)
}
package main
import (
"context"
"log"
"time"
"trpc.group/trpc-go/trpc-go"
"your_project/timer"
)
func main() {
// 创建 RPC 客户端
client := timer.NewTimerServiceClientProxy()
// 调用 StartTimer 方法,设置定时器间隔为 5 秒
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
defer cancel()
resp, err := client.StartTimer(ctx, &timer.StartTimerRequest{Interval: 5})
if err != nil {
log.Fatalf("failed to start timer: %v", err)
}
log.Println(resp.Message)
}