热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用gRPC构建实际的微服务

【51CTO.com快译】早期的微服务实现利用了代表性状态传输(REST)架构作为事实上的通信技术。

【51CTO.com快译】早期的微服务实现利用了代表性状态传输(REST)架构作为事实上的通信技术。然而,充分利用REST的服务常常适用于面向外部的服务,这些服务直接暴露给消费者。由于它们基于传统的基于文本的消息传递(JSON、XML和CVS over HTTP等)――针对人类进行了优化,因此这些不是内部服务间通信的理想选择。

相反,使用一种基于文本的消息传递协议,我们可以利用针对服务间通信进行优化的二进制协议。云原生计算基金会的gRPC(一种高性能的开源通用远程过程调用框架)是服务间通信的理想选择,因为它使用协议缓冲区(protocol buffer)作为服务间通信的二进制数据交换格式。

我们使用不同的技术和编程语言构建多个微服务时,有一种标准的方法来定义服务接口和底层的消息交换格式很重要。gRPC提供了一种简洁而强大的方法,可以使用协议缓冲区指定服务合约。因此,gRPC可能是最适合构建内部微服务间通信的解决方案。

我们在本文中将更深入地介绍为什么gRPC是构建微服务间通信的一种出色选择。

gRPC的基础知识

有了gRPC,客户可以对不同机器上的服务器应用程序直接调用方法,好像该机器就是本地对象。gRPC立足于传统的远程过程调用(RPC)技术的基础,但是实施在现代技术堆栈(比如HTTP2和协议缓冲区等)上,确保最大的互操作性。

gRPC本身支持这种功能:使用gRPC接口定义语言(IDL)来定义服务合约。因此,作为服务定义的一部分,你可以指定可以远程调用的方法以及参数和返回类型的数据结构。

图1表明了gRPC的使用,在线零售应用程序作为库存和产品搜索服务的一部分。 Inventory服务的合约使用gRPC IDL来定义,该IDL在inventory.proto文件中已有指定。因此,Inventory服务的开发人员应先使用该服务来定义所有业务功能,然后利用proto文件生成服务端框架代码。与之相仿,可以使用同样的proto文件生成客户端代码(存根,stub)。

使用gRPC构建实际的微服务

图1

由于gRPC与编程语言无关,你可以使用异构语言来构建服务和客户端。在这个例子中,我们使用Ballerina(ballerina.io)生成了Inventory服务代码,使用 Java 生成了客户端代码。你可以使用GitHub上的这个源代码(https://github.com/kasun04/grpc-microservices)来试试该示例。

库存(inventory.proto)的服务合约如下所示:

syntax = "proto3"; 
package grpc_service; 
import "google/protobuf/wrappers.proto"; 
service InventoryService { 
   rpc getItemByName(google.protobuf.StringValue) returns (Items); 
   rpc getItemByID(google.protobuf.StringValue) returns (Item); 
   rpc addItem(Item) returns (google.protobuf.BoolValue); 
} 
message Items { 
   string itemDesc = 1; 
   repeated Item items = 2; 
} 
message Item { 
    string id = 1; 
    string name = 2; 
    string description = 3; 
}  

服务合约易于理解,可以在客户端和服务之间共享。如果服务合约有任何变化,服务代码和客户端代码都要重新生成。

比如说,以下代码片段显示了为Ballerina生成的gRPC服务的代码。 对于我们在gRPC服务定义中的每个操作,都会生成相应的Ballerina代码。(Ballerina提供了开箱即用的功能,使用“ballerina grpc –input inventory.proto –output service-skeleton –mode service”或“ballerina grpc –input inventory.proto –output bal-client –mode client”,生成服务代码或客户端代码)。

import ballerina/grpc; 
import ballerina/io; 
endpoint grpc:Listener listener { 
   host:"localhost", 
   port:9000 
}; 
@grpc:ServiceConfig 
service InventoryService bind listener { 
   getItemByName(endpoint caller, string value) { 
       // Implementation goes here. 
       // You should return a Items 
   } 
   getItemByID(endpoint caller, string value) { 
       // Creating a dummy inventory item 
       Item requested_item; 
       requested_item.id = value; 
       requested_item.name = "Sample Item " + value ; 
       requested_item.description = "Sample Item Desc for " + value; 
       _ = caller->send(requested_item); 
       _ = caller->complete(); 
   } 
   addItem(endpoint caller, Item value) { 
       // Implementation goes here. 
       // You should return a boolean 
   } 
}  

至于客户端,再次用Inventory服务的gRPC服务定义来生成产品搜索服务,这是一个Java(Spring Boot)服务。你可以使用maven插件为Spring Boot/Java服务生成客户端存根(客户端代码嵌入在Spring Boot服务中)。调用生成的客户端存根的客户端代码如下所示:

package mfe.ch03.grpc; 
import com.google.protobuf.StringValue; 
import io.grpc.ManagedChannel; 
import io.grpc.ManagedChannelBuilder; 
public class InventoryClient { 
   public static void main(String[] args) { 
       ManagedChannel channel = ManagedChannelBuilder.forAddress("127.0.0.1", 9000) 
               .usePlaintext() 
               .build(); 
       InventoryServiceGrpc.InventoryServiceBlockingStub stub 
               = InventoryServiceGrpc.newBlockingStub(channel); 
       Inventory.Item item = stub.getItemByID( 
StringValue.newBuilder().setValue("123").build()); 
       System.out.println("Response : " + item.getDescription()); 
   } 
}  

底层的通信

客户端调用服务时,客户端gRPC库使用协议缓冲区,并编组(marshal)远程过程调用,该调用随后通过HTTP2来发送。在服务器端,请求解组(un-marshalled),使用协议缓冲区执行相应的过程调用。响应遵循从服务器到客户端的类似的执行流程。

使用gRPC开发服务和客户端的主要优点是,你的服务代码或客户端代码不需要为解析JSON或类似的基于文本的消息格式(在代码内或隐含在Jackson等底层库中,对服务代码而言隐藏起来)操心。二进制格式解组、转换成对象。此外,我们要处理多个微服务并确保和维护互操作性时,对通过IDL定义服务接口给予一流支持是强大的功能。

用gRPC构建微服务的实例

基于微服务的应用程序由多个服务组成,并使用众多编程语言构建。基于业务使用场景,你可以选择最合适的技术来构建服务。gRPC在这种多语言架构中起到非常重要的作用。如图2所示,产品搜索服务与另外多个服务进行通信,这些服务是使用gRPC作为通信协议构建的。因此,我们可以为每个服务定义服务合约:库存、电子品类和服装品类等。现在,如果你想要打造一种多语言架构,可以使用不同的实现技术来生成服务框架。

图2显示了用Ballerina lang编写的库存服务、用Golang编写的电子服务和用Vert.x(Java)编写的服装服务。客户端还可以为这每个服务合约生成存根。

使用gRPC构建实际的微服务

图2

仔细研究图2中的微服务通信风格,可以看出gRPC用于所有内部通信,而面向外部的通信可以基于REST或GraphQL。我们将REST用于面向外部的通信时,大多数外部客户端可以将服务用作API(利用Open API等API定义技术),因为大多数外部客户端知道如何与充分利用REST的HTTP服务进行通信。此外,我们可以使用GraphQL之类的技术,让消费者可以根据特定的客户需求来查询服务,这是无法用gRPC提供便利的。

因此作为一般实践,我们可以将gRPC用于内部微服务之间的所有同步通信。其他同步消息传递技术(比如充分利用REST的服务和GraphQL)更适合面向外部的服务。

作者简介:WSO2架构团队负责该公司集成平台的开发工作,Kasun Indrasiri是该团队的重要成员。之前,他作为产品主管参与开发了WSO2企业服务总线(ESB)。他撰有《WSO2 ESB入门》一书,并与人合著了《企业级微服务》。他是Apache软件基金会的当选成员,还是Apache Synapse开源ESB项目的项目管理委员会成员和提交者。

原文标题:Build Real-World Microservices with gRPC,作者:Kasun Indrasiri

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

【责任编辑:庞桂玉 TEL:(010)68476606】


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 本文深入探讨了Spring Cloud Eureka在企业级应用中的高级使用场景及优化策略。首先,介绍了Eureka的安全配置,确保服务注册与发现过程的安全性。接着,分析了Eureka的健康检查机制,提高系统的稳定性和可靠性。随后,详细讨论了Eureka的各项参数调优技巧,以提升性能和响应速度。最后,阐述了如何实现Eureka的高可用性部署,保障服务的连续性和可用性。通过这些内容,开发者可以更好地理解和运用Eureka,提升微服务架构的整体效能。 ... [详细]
  • 了解_Istio是啥?一文带你彻底了解!
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Istio是啥?一文带你彻底了解!相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
  • 微服务之总体架构篇
    一、单体架构存在的问题缺点:1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;2、部署项目麻烦:庞大之后项目部署效率 ... [详细]
  • 本文详细介绍了 Java 中 org.w3c.dom.Node 类的 isEqualNode() 方法的功能、参数及返回值,并通过多个实际代码示例来展示其具体应用。此方法用于检测两个节点是否相等,而不仅仅是判断它们是否为同一个对象。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 深入探索Node.js新框架:Nest.js第六篇
    在本文中,我们将深入探讨Node.js的新框架Nest.js,并通过一个完整的示例来展示其强大功能。我们将使用多个装饰器创建一个基本控制器,该控制器提供了多种方法来访问和操作内部数据,涵盖了常见的CRUD操作。此外,我们还将详细介绍Nest.js的核心概念和最佳实践,帮助读者更好地理解和应用这一现代框架。 ... [详细]
  • restful是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的restfulapi,其实restful和thrift,grpc类似,就是一种协议,但是这种协议有点特殊的就是 ... [详细]
  • 5分钟学会 gRPC
    5分钟学会gRPC-介绍我猜测大部分长期使用Java的开发者应该较少会接触gRPC,毕竟在Java圈子里大部分使用的还是DubboSpringClound这两类服务框架。我也是 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • 本文深入解析了Spring Cloud路由网关Zuul的核心功能及其典型应用场景。通过对方志朋老师教材的学习和实践,详细探讨了Zuul在微服务架构中的重要作用,包括请求路由、过滤器链管理以及服务动态扩展等关键特性。同时,结合实际案例,展示了Zuul在高并发和复杂业务场景下的应用优势,为读者提供了全面的技术参考。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
author-avatar
白猫警员123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有