TLTR:无论服务器或技术的位置如何,通过Auth和用户信息的服务进行通信的好方法是什么
我正在尝试了解微服务,我对如何访问用户信息和控制多种服务访问方式有点不清楚.如果我接近这个完全错误,请告诉我.
例如,我有一个用于Blog CRUD操作的基本服务和一个用于上传和存储图像和视频的服务.我还没有对授权或用户做过任何事情(除了我在我的模型中最终存在UserIds(例如在我的博客模型ObjectID中为作者,评论者等).
我希望保持尽可能分开(为了学习目的而更多),而目前我正在Node.js中构建它,我希望能够交换进出不同的技术,如Nginx,一个java / go / python服务或不同的存储(目前是mongo,但希望能够切换到sql作为选项)
我目前如何构建这些结构是我有两个服务构建为Express.js应用程序,目前我使用node-http-proxy代理快递服务(这只是为了保存现在设置Nginx但我不想要依赖于Nginx).
我应该如何处理:
>经过身份验证的用户或某些路由(例如,在创建新帖子或更新/删除时)和Not获取帖子时读取(最终我也希望合并角色)
>填充用户信息,例如从存储在博客作者中的用户ID并用用户信息替换它(在单个应用程序中我可以使用mongoose populate
主要目的是我希望将Auth和Users保留在可以在任何其他服务中调用的单独服务中,并存储在另一个数据库中,例如,如果它们位于不同的物理服务器上.
有人向我建议我可以使用HTTP / S做到这一点,但有更好的方法来做到这一点,任何人都可以指向任何实现示例,Node.js将是更好但不是必要的
这可能需要一些服务注册表,但我有点失去了如何实现它
For us service orientation means encapsulating the data with the
business logic that operates on the data,with the only access through
a published service interface. No direct database access is allowed
from outside the service,and there’s no data sharing among the
services.— Werner Vogels,Amazon CTO
参考http://martinfowler.com/microservices/
什么是身份验证层或服务以及一个服务器如何确认身份验证?一种基于客户端的持久性是HTTP cookie,它严格地挂钩到域名,因此如果没有明确的身份验证步骤,在多个域之间重用相同的cookie并不容易.
如果您能够传递某个密钥或标头,http_request可以提供不引人注目的身份验证,那么从1.5.4版本开始,该模块就成为了内置的Nginx核心:http://nginx.org/en/docs/http/ngx_http_auth_request_module.html
location /upload {
auth_request /auth;
...
}
location = /auth {
internal;
proxy_pass http://auth_service.localhost;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
可通过http://auth_service.localhost访问的端点(选择您自己的URL)是独立的,并且拥有自己的数据库并且只做一件事 – 对用户进行身份验证.机制可以依赖于某个密钥或头部甚至IP地址.要抑制后续请求,您可以缓存响应.
SOA很难,但我建议彻底阅读:https://www.nginx.com/blog/introduction-to-microservices/