另一个Rest / gRPC服务可以调用gRPC服务吗?

时间:2020-08-24 09:00:03

标签: rest grpc

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

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,无论调用服务是否处于静止状态,您都可以肯定有多个服务调用您的gRPC服务。

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

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

如果订单输入服务是一种休息服务,我将以相同的方式注入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通道生成器来进行的,该生成器可用于创建嵌入式服务器和测试通道。 (至少在JVM风格的gRPC上是这样-不确定是否可以在c#中模拟存根)