我正在运行一台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
}
而且由于代码基本上是重复的,以适应每种服务,所以我不能只使用an 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,但是必须有一种无需使用外部库即可执行此操作的方法。
为什么每个grpc服务都需要拨不同的套接字?
你不知道 您可以创建一个grpc.ClientConn
并将其传递给多个pb.New*Client()
功能,它们将共享相同的连接。
func main() {
cc, err := grpc.Dial("localhost:6000", grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
c1 := pb.NewSubscriberServiceClient(cc)
c2 := pb.NewDropperServiceClient(cc)
}
然后使用此接口为每个服务实现客户端grpc函数,而不是为每个服务创建新的结构
pb.go
文件中生成的代码完成了执行RPC所需的一切。除非您有特殊的逻辑要在每次执行呼叫时自动发生,否则您不必实现任何客户端功能。
如果这两个服务具有唯一的方法名称,则可以将它们放在相同的结构中,这样就不必为了小幅方便而分别使用它们:
type SubscriberDropper struct {
pb.SubscriberServiceClient
pb.DropperServiceClient
}
func main() {
// ... as above ...
sd := &SubscriberDropper{c1, c2}
}
问题内容: 我开始按照Android所没有使用的教程进行操作,并得到以下信息: 我想这可以归结为几个问题: 我没有创建自己的信任库,但是在网上搜索教程和其他内容时,不确定如何创建信任库。有没有一种方法可以创建或修改信任库以在其中存储所需的证书?(如果有任何不同,我使用的是自签名证书) 如何使SSL握手顺利进行?现在,我得到的错误是: 老实说,我真的不明白这意味着什么。 我需要在Android设备上
我可以看到这两个IP,我试图连接使用tcp套接字,绑定他们与tcp端口8080。然而,它表明它没有连接。 我认为这不是使用tcp套接字连接它们的方式。是否有任何方法使一个pod服务器和其他pod客户端和conncet使用tcp套接字。 编辑: Client.C
我有一个Spring Boot 5应用程序,我也在一台IBM MQ服务器上运行它。 现在我们希望它连接到三个或更多 MQ 服务器。我现在的目的是将 XY 连接信息添加到环境中,然后我得到 XY MQConnectionFactory bean 和处理所需的所有其他 bean。 目前这是我所拥有的: 但这是相当静态的。有没有一种优雅的方式来做到这一点? 我偶然发现了集成流。这可能是一个有效的解决方案
我是Grpc电话的新手。 目前,我正在使用Grpc。核心创建“通道”的新实例。请参阅下面的代码。 现在,我想在创建通道时添加一个连接超时。Grpc.Core有可能吗? 我知道可以在使用“Grpc.Net.Client.”时添加选项,但是,它只适用于. Net Core 2.1和我的项目不针对该框架。https://docs.microsoft.com/en-us/aspnet/core/grpc/
我对Kubernetes和Istio有点陌生。我正在尝试创建一个服务并通过HTTPS访问它。 通过HTTP看起来一切都很好 我使用了cert-manager和let's Encrypt来生成证书 证书已成功生成 我使用以下命令生成了机密 这些是我的网关、虚拟服务、集群颁发者和证书的配置文件。 网关 证书 当我运行时,我可以看到tls.crt和tls.key内容。 有什么想法为什么我不能达到我可以通
问题内容: 我正在尝试调整我的简单套接字服务器,使其可以通过多线程具有多个TCP连接,但是我似乎无法使其正常工作。到目前为止,我的代码如下,我不太确定从这里可以去哪里: 谁能为我提供一些有关如何执行此操作的指示,以及为什么我当前的实现无法正常工作?我在这里浏览了Java教程http://download.oracle.com/javase/tutorial/networking/sockets/e