我是GRPC的新手,并尝试在C#中实现GRPC服务。我想知道,是否有任何其他REST / GPRC服务可以调用我的服务(尽管我认为这绝对应该可行)。如果是这样,将仅共享服务客户端,就像在普通REST服务中一样?
谢谢!
答案 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#中模拟存根)