专栏首页首席架构师智库【微服务架构 】微服务简介,第3部分:服务注册表

【微服务架构 】微服务简介,第3部分:服务注册表

在微服务系列的这篇文章中,我们将讨论服务注册表。在第2部分中,我们讨论了API网关,其中我们提到服务已在数据库中注册。网关根据该数据库中包含的信息调度请求。下面我们将探讨如何填充数据库以及服务,客户端和网关与之交互的方式。

服务注册表

服务注册表是一个数据库,其中包含有关如何将请求分派给微服务实例的信息。注册表和其他组件之间的交互可以分为两组,每组有两个子组:

微服务和注册表之间的交互(注册)

  • 自注册
  • 第三方注册

客户端与注册表之间的交互(发现)

  • 客户端发现
  • 服务器端发现

注册

大多数基于微服务的架构都在不断发展。随着开发团队分离,改进,弃用和完成工作,服务会上下波动。每当服务端点发生更改时,注册表都需要了解更改。这就是注册的全部内容:谁发布或更新有关如何联系每项服务的信息。

自注册迫使微服务自己与注册表进行交互。当服务上升时,它会通知注册表。服务中断时会发生同样的事情。无论注册表需要哪些其他数据,都必须由服务本身提供。如果你一直关注这个系列,你就会知道微服务都是关于处理一个问题,所以自我注册可能看起来像一个反模式。但是,对于简单的体系结构,自注册可能是正确的选择。

第三方注册通常在行业中使用。 在这种情况下,有一个管理所有其他服务的进程或服务。 此过程以某种方式轮询或检查哪些微服务实例正在运行,并自动更新服务注册表。 可以以每服务配置文件(或策略)的形式提供附加数据,注册过程使用该文件来更新数据库。 在使用Apache ZooKeeper或Netflix Eureka等工具以及其他服务管理器的架构中,第三方注册很常见。

第三方注册还提供其他好处。例如,当服务出现故障时会发生什么?可以将第三方注册服务配置为为失败的服务提供安全回退。其他案例可能会实施其他政策。例如,服务注册表进程可能会收到高负载情况的通知,并通过请求实例化新的微服务进程或VM来自动添加新端点。可以想象,这些可能性对于大型架构至关重要。

发现

可以想象,从客户的角度来看,发现是注册的对应物。当客户想要访问服务时,它必须找出服务所在的位置(以及执行请求的其他相关信息)。

客户端发现强制客户端在执行实际请求之前查询发现服务。正如自我注册所发生的那样,这要求客户处理除主要目标之外的其他问题。发现服务可能位于API网关后面,也可能不位于API网关后面。如果它不在网关后面,则可能需要为发现服务重新实现平衡,身份验证和其他横切关注点。此外,每个客户端都需要知道要联系发现服务的固定端点(或端点)。这些都是缺点。一个很大的优点是不必在网关系统中编写必要的逻辑。选择发现方法时,请仔细研究。

服务器端发现使API网关处理发现请求的正确端点(或端点)。 这通常用于更大的架构。 由于所有请求都直接发送到网关,所以与之相关的所有好处都适用(参见第2部分)。 网关还可以实现发现缓存,以便许多请求可以具有较低的延迟。 高速缓存失效背后的逻辑特定于实现。

“服务器端发现使API网关能够处理发现请求的正确端点。”

服务器端发现

示例:注册表服务

在第2部分中,我们研究了一个简单的API网关实现。在该示例中,我们通过查询到服务数据库来实现动态调度请求。换句话说,我们实现了服务器端发现。对于此示例,我们将通过处理注册方面来扩展我们的微服务架构。我们将以两种方式这样做:

  1. 通过提供一个简单的注册库,任何开发团队都可以将其集成到他们的微服务中以执行自我注册。
  2. 通过提供在启动或关闭期间注册服务的示例systemd单元(使用systemd作为服务管理器的第三方注册)。

为什么要系统?它已成为大多数Linux安装中的事实上的服务管理器。管理服务还有其他选择,但都需要安装和配置。为简单起见,我们选择了大多数发行版中预装的那个,这是systemd。

注册库

我们之前发布的微服务示例是为node.js开发的,所以我们的库也适用于它。这是我们库的主要逻辑:

module.exports.register = function(service, callback) {
if(!validateService(service)) {
callback(new Error("Invalid service"));
}
findExisting(service.name, function(err, found) { if(found) {
callback(new Error("Existing service")); return;
} var dbService = new Service({ name: service.name, url: service.url, endpoints: service.endpoints, authorizedRoles: service.authorizedRoles
});
dbService.save(function(err) {
callback(err);
});
});
}module.exports.unregister = function(name, callback) {
findExisting(name, function(err, found) { if(!found) {
callback(new Error("Service not found")); return;
}
found.remove(function(err) {
callback(err);
});
});
}

执行自注册的微服务需要在启动或关闭期间调用这些功能(包括异常关闭)。 我们已通过以下方式将此库集成到现有的微服务示例中(将SELF_REGISTRY变量设置为任何值以启用此功能)。 启动代码:

// Standalone server setup
var port = process.env.PORT || 3001;
http.createServer(app).listen(port, function (err) { if (err) {
logger.error(err);
} else {
logger.info('Listening on http://localhost:' + port); if(process.env.SELF_REGISTRY) {
registry.register({
name: serviceName,
url: '/tickets',
endpoints: [ {
type: 'http',
url: 'http://127.0.0.1:' + port + '/tickets'
} ],
authorizedRoles: ['tickets-query']
}, function(err) { if(err) {
logger.error(err);
process.exit();
}
});
}
}
});

和关机代码:

function exitHandler() { if(process.env.SELF_REGISTRY) {
registry.unregister(serviceName, function(err) { if(err) {
logger.error(err);
}
process.exit();
});
} else {
process.exit();
}
}
process.on('exit', exitHandler);
process.on('SIGINT', exitHandler);
process.on('SIGTERM', exitHandler);
process.on('uncaughtException', exitHandler);

使用systemd进行第三方注册

我们的网关示例从Mongo数据库中读取服务信息。 Mongo提供了一个命令行界面,我们可以在启动或关闭期间使用它来注册服务。 这是一个示例systemd单元(如果您使用此帖子中的示例微服务,请记住禁用SELF_REGISTRY环境变量):

[Unit]
Description=Sample tickets query microservice#Uncomment the following line when not running systemd in user mode#After=network.target[Service]#Uncomment the following line to run the service as a specific user#User=sebaEnvironment="MONGO_URL=mongodb://127.0.0.1:27018/test"ExecStart=/usr/bin/node /home/seba/Projects/Ingadv/Auth0/blog-code/microservices/server.js
ExecStartPost=/usr/bin/mongo --eval 'db.services.insert({"name": "Tickets Query Service", "url": "/tickets", "endpoints": [{"type": "http", "url": "http://127.0.0.1:3001/tickets"}], "authorizedRoles": ["tickets-query"] });' 127.0.0.1:27017/test
ExecStopPost=/usr/bin/mongo --eval 'db.services.remove({"name": "Tickets Query Service"});' 127.0.0.1:27017/test
[Install]
WantedBy=default.target

注册由ExecStartPost和ExecStopPost指令通过调用命令行Mongo客户端(包含在所有标准MongoDB安装中)来处理。

获取代码https://github.com/auth0/blog-microservices-part3。

另外:使用Auth0作为您的微服务

由于JWT的神奇之处,Auth0和微服务齐头并进。 看看这个:

var express = require('express');var app = express();var jwt = require('express-jwt');var jwtCheck = jwt({
secret: new Buffer('your-auth0-client-secret', 'base64'),
audience: 'your-auth0-client-id'});
app.use('/api/path-you-want-to-protect', jwtCheck);// (...)

您可以通过Auth0仪表板获取客户端ID和客户端密钥。 创建一个新帐户并开始黑客攻击!

结论

服务注册表是基于微服务的体系结构的重要组成部分。 有不同的处理注册和发现的方法,适合不同的架构复杂性。 在承诺之前考虑上述每种替代方案的优缺点。 在第4部分中,我们将详细研究服务依赖性以及如何有效地管理它们。

本文分享自微信公众号 - 首席架构师智库(jiagoushipro),作者:南极真君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 21个经典数据科学面试题及答案(上)

    本文翻译自kdnuggets网站热文 21 Must-Know Data Science Interview Questions and Answers 本篇...

    首席架构师智库
  • 「微服务架构」Google和eBay在构建微服务生态系统方面的深刻教训

    当你看到来自谷歌,Twitter,eBay和亚马逊的大规模系统时,他们的架构已演变成类似的东西:一组多语言微服务。

    首席架构师智库
  • 「微服务架构」Saga 模式 如何使用微服务实现业务事务-第二部分

    在上一篇文章中,我们看到了实现分布式事务的一些挑战,以及如何使用Event / Choreography方法实现Saga的模式。在本文中,我们将讨论如何通过使用...

    首席架构师智库
  • 服务网关 Service Gateway

    微服务架构把网站从一个单体结构拆分为多个独立服务的集合 单体结构,各个模块都在一起 ? 微服务结构,各服务模块独立部署 ? 带来了很多好处,例如,提高了系...

    dys
  • 京东技术沙龙系列之二 | 深度解析京东微服务组件平台

    京东技术
  • 聊聊微服务架构及分布式解决方案

    事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性:

    lyb-geek
  • 微服务就真的适合你吗

    其实微服务已经不算很火的概念了,它已经成为了面试的主角。很多同学私下问胖哥要一些微服务的资料,大部分都是为了面试。有时候想想这很悲哀。今天就讲几个我知道的案例,...

    码农小胖哥
  • 『互联网架构』软件架构-zuul微服务网关(上)(100)

    1. 客户端会多次请求不同微服务,增加客户端的复杂性。2. 存在跨域请求,在一定场景下处理相对复杂。(有的公司服务比较微服务都是通过内部的域名的方式,分类的微服...

    IT故事会
  • 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享

    根据保险行业发展趋势,目前保险交易已经呈现高频化、碎片化、场景化等特点,对系统的处理能力、容量、业务连续性、需求相应速度、运维响应速度提出了更高的要求。业务模式...

    yuanyi928
  • NAT模型如何同时兼顾性能、速度?蒸馏很有潜力!

    近年来,基于深度神经网络的机器翻译取得了飞速发展。目前大多数NMT模型都使用了编码器-解码器框架来实现,编码器将源语句的表示送入到解码器来生成目标句子;解码器通...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券