rest - 另一个 Rest/gRPC 服务可以调用 gRPC 服务吗?
问题描述
我是 GRPC 的新手,并试图在 C# 中实现 GRPC 服务。我想知道,是否有任何其他 REST/GPRC 服务可以调用我的服务(尽管我认为这绝对是可能的)。如果是这样,是否只共享服务客户端工作,就像在普通的 REST 服务中一样?
提前致谢!
解决方案
是的,您绝对可以让多个服务调用您的 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# 中模拟存根)
推荐阅读
- python-3.x - 使用 Selenium Python 再次重新选择一组随机复选框的方法是什么?
- python - 如何用最频繁的值替换熊猫列的值
- cordova - 在设备上运行我的应用程序时出现 Ionic/Cordova 错误
- sql - 如何加入表格并将数字邮政编码值替换为文本邮政编码值
- python-3.x - 在 wxPython 位图中显示 matplotlib 图
- office-addins - 我在哪里可以找到 o365 2016 msi 版本?
- reactjs - 反应:拨打 tcp 127.0.0.1:3000:连接:连接被拒绝
- iis - 如何在 IIS 中配置本地服务器以托管多个网站
- sql - 在 SQL 中识别多个数据库之间的关系
- dask - 是否有相当于 maxtasksperchild 的 dask?