传统的微服务架构需要考虑服务的部署、扩展、监控等问题,这些都需要投入大量的人力物力资源。而近年来 Serverless 架构的兴起,解决了很多传统微服务架构的问题,而且也为微服务提供了新的思路。本文将会详细介绍 Serverless 与微服务结合的实现方式,包括技术原理、深度分析以及代码示例。
什么是 Serverless
Serverless 架构并不是没有服务器,而是指在应用程序的开发上,开发者无需考虑服务器的部署、管理和扩展,通过云服务提供商提供的 FaaS(Function as a Service)服务,开发者只需要关注业务逻辑的实现即可。Serverless 的特点是于需要时构建和运行服务,极大地减少了服务无用的消耗和浪费,提高了服务的效率。Serverless服务的运行模式,就是按需执行,弹性扩展,自动管理。
Serverless 和微服务的结合
优势
Serverless 和微服务结合可以发挥各自的优势。如 Serverless 可以做到无缝扩展,优化资源利用;微服务可以实现服务的拆分、实例化、管理等方面的优势。两者结合可以极大地提高系统的可用性、弹性、健壮性。Serverless 同时解决了传统微服务架构中的一些问题,比如对于无人访问的服务,Serverless 可以做到完全不消耗资源。
实现方式
- Serverless 构建微服务
对于一些轻量级的功能实现,云厂商已经为开发者构建了一些功能和服务,如图片处理、认证、文件存储等。开发者可以通过这些 Serverless 的服务直接实现自己的业务逻辑,而不需要自己构建服务。这种方式通常可适用于服务内部的逻辑,不需要与其他系统交互的情况。
示例代码:
serverless.yml
// javascriptcn.com 代码示例 service: my-service provider: name: aws runtime: nodejs12.x functions: thumbnail: handler: handlers/thumbnail.handler events: - s3: ${self:custom.bucket} plugins: - serverless-s3-deploy custom: bucket: ${opt:bucket, 'my-bucket'}
thumbnail.js
// javascriptcn.com 代码示例 const AWS = require('aws-sdk'); const imagemagick = require('imagemagick'); const bucket = process.env.bucket; exports.handler = function(event, context) { const s3 = new AWS.S3({ apiVersion: '2006-03-01' }); const srcBucket = event.Records[0].s3.bucket.name; const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); const dstKey = `thumbnail/${srcKey}`; // Download the image from S3 into a buffer. ... };
- Serverless 作为微服务网关
Serverless 也可以做为微服务网关使用,可以实现服务的负载均衡、请求的统一入口、请求的路由、熔断等功能。开发者可以使用 Serverless 框架开发一个微服务网关,通过路由功能将请求转发到不同的微服务上,可以实现微服务的组合,搭建出更完善的业务逻辑。
示例代码:
serverless.yml
// javascriptcn.com 代码示例 service: my-gateway provider: name: aws runtime: nodejs12.x functions: api: handler: handlers/api.handler events: - http: '{method} {proxy+}' plugins: - serverless-http
api.js
const serverless = require('serverless-http'); const express = require('express'); const app = express(); app.get('/serviceA', function(req, res) { }); app.get('/serviceB', function(req, res) { }); module.exports.handler = serverless(app);
总结
本文中我们介绍了 Serverless 和微服务结合的实现方式,讨论了两者的优势和结合方式。对大部分开发者来说,Serverless 是一个新的尝试,需要在实践中逐步体会其中的优势和局限,实现 Serverless 和微服务的结合或许是一个不错的进一步探索方向。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65435cf47d4982a6ebd13689