什么是微服务微服务是一种应用程序架构,它将每个应用程序功能放在它自己的服务中,与其他服务隔离。这些服务松散耦合且可独立部署。这种架构作为解决遗留单一Web应用程序开发方法的解决方案而出现。在单体软件中,一切都作为一个单元构建,所有业务逻辑都组合到一个广泛的应用程序中。这种方法使更新代码库的过程变得复杂,因为它会影响整个系统,即使是最小的代码更改也需要构建和部署整个软件的新版本。再者,即使你只想扩展应用程序的某个特定功能,也需要扩展整个应用程序才能实现。微服务解决了单体系统所面临的这些挑战,单体系统将应用程序从单体分成几个小部分。什么时候应该使用微服务?本质上,微服务架构解决了大型复杂应用的快速开发问题。对于“哪个更好?”这个问题没有普遍的答案。答案取决于具体情况,因为每种情况都有其优点和缺点。以下是微服务架构的一些优点和缺点,您可能已经知道:优点语言不可知:微服务不限于特定的编程语言,每个微服务都可以用不同的语言编写,以支持所选的通信协议。可扩展性:由于微服务及其职责可以在开发人员之间分担,因此如果项目中涉及大型团队,应用程序将变得更易于维护。无限迭代:微服务的迭代变得更容易,因为开发人员不依赖于其他组件。单元测试:由于微服务是专注于特定功能的独立应用程序,因此开发人员可以轻松编写测试脚本来验证该特定功能。缺点是难以作为一个整体来管理:JuliusCaesar的名言“divideetimpera”(拉丁语)即使在这里也适用于大规模,但要小心,因为太多的活动部件可能变得难以管理。难以追溯:如果架构变得过于复杂,微服务之间的通信通道就会很多,发生错误后很难追溯和确定故障点。需要大量专业知识:构建和部署微服务需要非常高的规划和协调软技能。具有挑战性的测试:测试是一把双刃剑,因为整个微服务更难测试。集成和端到端测试也可能具有挑战性。审核日志:可能更难获取和调查。在架构方面,SaaS微服务非常适合,因为微服务是SaaS应用程序的不错选择。这类应用既然要用户付费,就需要提供高可用的服务,所以将软件打碎成小块可以加快恢复速度。同时,SaaS应用的开发主要由其社区驱动,因此也会受到很多变化的影响,而通过微服务和解耦,开发者可以获得单体架构无法提供的灵活性。单体应用程序可能难以水平扩展,因为您必须复制整个应用程序,如果它依赖于单个数据库,这会变得更加困难。另一方面,微服务可以在每个服务的基础上进行扩展、复制或负载平衡。例如,如果你需要发送更多的电子邮件,你只需要扩展负责电子邮件功能的微服务。今天你有10个用户,明天你有1000个;SaaS应用程序可以在短时间内保持大规模增长,这就是为什么必须将它们构建为以最经济的方式轻松扩展的原因。这也导致更少的资源消耗,从而降低账单。因此,可以肯定地说,微服务是SaaS企业架构的下一阶段。弄清楚您是否需要微服务的最好方法是问自己:我对单体应用程序有疑问吗?如果是这样,也许您应该考虑转向微服务。如果没有,坚持下去——没有必要花时间解决不存在的问题。微服务通信如何工作?由于服务彼此独立,因此需要谨慎选择与微服务的通信。通信协议使用不当会导致应用程序的性能下降。您必须根据应用程序的特定需求选择通信协议。有两种通信方式可供选择:同步通信和异步通信,它们是请求-响应和基于事件的模式的基础。在第一种情况下,同步,客户端发送请求并等待响应。这种方法的一个缺点是它是一种阻塞模式。但是,如果你有一个有很多读取操作的应用程序,那就不一定了,因为你的应用程序更倾向于从外部读取和接收信息。在这种情况下,使用同步方法可能是一个不错的选择,尤其是涉及到实时数据时。我们的另一种选择是异步通信,这是一种非阻塞模式。如果你想要一个有弹性的微服务,那么异步通信是比同步通信更好的选择。在这种情况下,客户端发送请求,收到请求的确认,然后忘记它。这种方法最适合不能丢失数据记录的写入密集型应用程序。以下是一些涉及微服务通信的解决方案,您可以从中选择:基于HTTP的REST基于HTTP/2的RESTWebSocketTCP套接字UDP数据包仔细考虑最适合您需求的通信协议,因为这将使您的应用程序响应更快、更高效率。为什么NodeJS用于微服务?构建微服务时有很多顶级编程语言可供选择。NodeJS就是其中之一。那么,为什么NodeJS是最佳选择呢?SingleThreaded&Asynchronous:NodeJS使用事件循环来执行代码,允许执行异步代码,从而使服务器能够使用非阻塞机制进行响应。事件驱动:NodeJS使用事件驱动架构,它建立在软件开发的通用模式之上,称为发布-订阅或观察者模式,可以构建强大的应用程序,尤其是实时应用程序。快速且高度可扩展:运行环境基于最强大的JavaScript引擎之一的V8JavaScriptEngine构建,因此代码执行速度快,使服务器能够同时处理多达10,000个并发请求。易于开发:创建多个微服务会导致代码重复。Node.js微服务框架易于创建,因为它抽象了大部分底层系统。因此,使用这种编程语言创建微服务就像编写几行代码一样简单。实现微服务架构我们首先创建一个用于用户管理的微服务,它将使用TCP数据包进行通信,并负责对用户进行CRUD操作。我们将使用PacketSender对其进行测试,PacketSender是一种用于发送支持TCP的网络数据包的免费工具。进一步定义了微服务的架构和范围。因此,从表示的角度来看,通过HTTP实现微服务与实现NodeJSAPI没有什么不同。同时,使用RESToverHTTP很容易,但是从这个协议切换到其他协议时会出现一些问题。这就是为什么在本文中我们将使用TCP数据包的异步模式与微服务进行通信的原因。我们将使用NestJS作为应用程序的框架。它不是NodeJS微服务框架,而是构建服务器端应用程序的框架。但是,由于内置了几个微服务功能,它使工作变得更容易。第1步:微服务设置使用Node.js构建微服务相当容易,尤其是使用NestJS框架时。首先,使用CLI创建一个新的NestJS应用程序,使用以下命令:npx@nestjs/clinewuser-microservice此命令将创建并初始化一个新项目。要开始构建微服务,您需要安装以下包:npmi--save@nestjs/microservices最后,要启动并运行微服务,我们需要使用以下内容更新main.ts文件:import{INestMicroservice}来自“@nestjs/common”;从“@nestjs/core”导入{NestFactory};从“@nestjs/microservices”导入{Transport};从“./app.module”导入{AppModule};异步函数bootstrap(){constmicroservicesOptions:any={transport:Transport.TCP,options:{host:'127.0.0.1',port:8875,},};constapp:INestMicroservice=awaitNestFactory.createMicroservice(AppModule,microservicesOptions,);app.listen(()=>console.log('微服务正在监听'));}bootstrap();NestJS支持传输层的几个内置实现,称为传输器。上面的代码将创建一个微服务,它通过TCP传输层绑定到本地计算机的端口8875进行通信。第二步:微服务监听消息我们可以使用消息模式或者事件模式与微服务进行通信。消息模式的工作方式类似于请求-响应方式,适用于服务之间交换消息,而事件模式用于只想发布事件而不等待响应的情况。在我们的例子中,我们只实现了根据给定输入创建用户的功能,并将获得创建的用户。因此,我们将在app.controller.ts文件中注册一个名为create_user的消息模式。@Controller()exportclassAppController{constructor(privatereadonlyappService:AppService){}@MessagePattern('create_user')asynccreateUser(@Payload()payload:CreateUserDto){constuser=awaitthis.appService.createUser(payload);返回用户;我们抽象出创建新用户的逻辑,因为它可以根据需求和使用的数据库以各种方式实现,我们将只关注与微服务相关的主题。我们用来创建新用户的有效载荷具有以下格式:import{IsString,IsEmail}from'class-validator';导出类CreateUserDto{@IsEmail()电子邮件:字符串;@IsString()password:string;}带有电子邮件和密码的简单对象的字符串第3步:测试微服务为了测试这个微服务,我们将使用PacketSender向应用程序发送TCP数据包。为此,将地址和端口设置为127.0.0.1:8875,然后从右侧的下拉菜单中选择TCP。要对我们的信息进行编码,请使用ASCII字段并使用以下值完成它:122#{"pattern":"create_user","data":{"email":"d@gmail.com","password":"12345678"},"id":"ce51ebd3-32b1-4ae6-b7ef-e018126c4cc4"}pattern:就是我们要找的信息,create_user。data:是我们要发送的JSON对象,一个带有邮箱和密码的对象。值122表示消息的长度,从第一个大括号到最后一个大括号(包括两者)。PacketSenderConfiguration如果我们点击Send按钮,我们会看到这样的日志:LogActivity第二个是我们发送给微服务的,第一个是我们收到的。里面的response是我们微服务返回的对象,也就是创建的用户。第4步:API网关现在我们有了微服务并进行了快速测试以查看它是否接受请求并返回响应,是时候创建一个API网关并将其连接到微服务了。为此,我们将使用上述相同步骤创建一个新的NestJS应用程序,然后使用以下内容更新app.module.ts文件。从'@nestjs/common'导入{Module};从'./app.controller'导入{AppController};从'./app.service'导入{AppService};从“./config/config.service";@Module({imports:[],controllers:[AppController],providers:[{provide:'USER_MICROSERVICE',useFactory:(configService:ConfigService)=>{constoptions={transport:Transport.TCP,options:{host:configService.get('USERS_MICROSERVICE_HOST'),port:Number(configService.get('USERS_MICROSERVICE_PORT')),},};returnClientProxyFactory.create(optionsasClientOptions);},inject:[ConfigService],},AppService,],})exportclassAppModule{}我们将使用.env文件来存储任何与配置相关的值。这些文件将在配置服务的帮助下读取。可以在主机127.0.0.1:8875和端口8875上找到微服务。使用上面的代码,我们使用ClientProxy注入一个新对象,表示与我们的用户微服务的连接。这个NestJS类提供了几个用于与远程微服务交换信息的内置工具。为了使用这个链接对象,我们可以像这样在AppController或AppService中注入它:@Controller()exportclassAppController{constructor(@Inject('USER_MICROSERVICE')privatereadonlyclient:ClientProxy,privatereadonlyappService:AppService){}@Post('create-user')asynccreateUser(@Body()payload:CreateUserDto){returnthis.client.send('create_user',payload).toPromise();现在,每次API在路由中创建-当用户收到POST请求时,API网关会将请求连同有效负载转发给微服务,然后将微服务的响应返回给用户.
