Я использую сервер grpc
, прослушивающий localhost:6000
, предоставляющий 2 grpc
службы: RegisterSubscriberServiceServer
и RegisterDropperServiceServer
.Поскольку обе эти службы доступны с номера localhost:6000
, я хотел бы набрать этот адрес только из заглушки.
Сервер выглядит так:
func main() {
grpcServer := grpc.NewServer()
pb.RegisterSubscriberServiceServer(grpcServer, &subscriberServer{})
pb.RegisterDropperServiceServer(grpcServer, &dropperServer{})
l, err := net.Listen("tcp", ":6000")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
log.Println("Listening on tcp://localhost:6000")
grpcServer.Serve(l)
}
Зачем мне нужнонабирать разные сокеты для каждой grpc
службы?
type DropperRPC struct {
conn *grpc.ClientConn
client pb.DropperServiceClient
chunkSize int
}
type SubscriberRPC struct {
conn *grpc.ClientConn
client pb.SubscriberServiceClient
chunkSize int
}
func NewSubscriber() (c SubscriberRPC, err error) {
c.conn, err = grpc.Dial("localhost:6000", grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
c.client = pb.NewSubscriberServiceClient(c.conn)
return
}
func NewDropper() (c DropperRPC, err error) {
c.conn, err = grpc.Dial("localhost:6000", grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
c.client = pb.NewDropperServiceClient(c.conn)
return
}
И поскольку код в основном дублируется для размещения каждой службы, я не могу просто использовать Interface
для уменьшения кода?
func main() {
c1, err := NewSubscriber()
if err != nil {
log.Fatal(err)
}
c2, err := NewDropper()
if err != nil {
log.Fatal(err)
}
cc1 := &c1
cc2 := &c2
}
А затем используйте этот Interface
для реализации клиентских функций grpc
для каждой службы вместо создания struct
для каждой службы.Я нашел cmux , но должен быть способ сделать это без использования внешних библиотек.