首页 > 解决方案 > 另一个 Rest/gRPC 服务可以调用 gRPC 服务吗?

问题描述

我是 GRPC 的新手,并试图在 C# 中实现 GRPC 服务。我想知道,是否有任何其他 REST/GPRC 服务可以调用我的服务(尽管我认为这绝对是可能的)。如果是这样,是否只共享服务客户端工作,就像在普通的 REST 服务中一样?

提前致谢!

标签: restgrpc

解决方案


是的,您绝对可以让多个服务调用您的 gRPC 服务,无论调用服务是否处于休息状态。

我有一个调用收银员 gRPC 服务的订单输入 gRPC 服务,因此我必须将一个收银客户端(“存根”)注入到我的订单输入服务中:

class OrderEntryServiceImpl @Inject constructor(private val kafkaProducer: KafkaProducer<String, ByteArray>,
                                            private val cashierStub: CashierGrpcKt.CashierCoroutineStub)

如果 order-entry 服务是一个 rest 服务,我会以同样的方式注入 cashierStub。

然后,我的订单输入服务使用收银员服务来锁定客户的资金:

override suspend fun submitOrder(request: OrderEntry.SubmitOrderRequest):
        SubmitOrderResponse {

    val responseBuilder = SubmitOrderResponse.newBuilder()
    val order = request.order
    if (!isOrderValid(order)) {
        return responseBuilder.setOrderSubmissionStatus(FAILURE_INVALID_ORDER).build()
    }
    when (order.orderType) {
        BUY, SELL -> {
            /**for new orders (not 'cancels' or 'modifies'), we need to post margin and generate
            an order id.**/
            val orderId = UUID.randomUUID().toString()
            val marginAmount = order.qtyOnMarket *
                    SATOSHIS_PER_CONTRACT * MAX_PRICE_OF_BINARY_OPTION
            val lockFundsResult = cashierStub.lockFunds(CashierRequest.newBuilder()
                    .setUserId("")
                    .setRelatedEntityId(orderId)
                    .setReason(TransactionReason.POST_MARGIN)
                    .setAmount(marginAmount).build())
...

您可能遇到的一个差异与您的测试方式有关 - 如果您的服务 A 使用 B 的客户端调用服务 B,通常在测试服务 A 时,您将模拟服务 B 的客户端以返回适用于被测场景的响应。但是,如果服务 B 是 gRPC,您永远不会模拟客户端“存根”——而是模拟服务 B 本身的基本实现,并使用“真实”存根来调用它,可能通过 gRPC 的 inProcess 通道构建器来调用它,该构建器可用于创建用于测试的嵌入式服务器和通道。(至少在 gRPC 的 JVM 风格上是这样——不确定是否可以在 c# 中模拟存根)


推荐阅读