如果你在你的组织中使用微服务架构 ,他们可以通过zookeeper或者它的等价物来共享configuration。 但是,各种服务应该如何共享一个共同的数据库模式? 常见的常量? 和普通公用事业? 一种方法是将所有的微服务放在同一个代码库中,但这与微服务的解耦是矛盾的。 另一种方法是让每个微服务都是完全独立的,但是这将导致每个微服务必须拥有的独立数据库中的代码重复和数据重复。 还有一种方法是实现没有上下文状态的function微服务,但这通常是不现实的,会推动架构有一个中心枢纽,维护上下文\状态以及来自\的大量stream量。 在微服务之间共享代码和模式将是一个可扩展的,高效的,实用的,希望是美丽的方式?
我们要为我们的gRPC-microservices构build一个Javascript / HTML gui。 由于浏览器端不支持gRPC,所以我们考虑使用web-sockets连接到一个node.js服务器,它通过grpc调用目标服务。 我们很难find一个优雅的解决scheme来做到这一点。 特别是,因为我们使用gRPCstream来推动我们的微服务之间的事件。 看来我们需要第二个RPC系统,只是为了在前端和node.js服务器之间进行通信。 这似乎是大量的开销和额外的代码,必须维护。 有没有人有经验做这样的事情或有一个想法如何可以解决?
对于将单一应用程序拆分为微服务的人来说,您是如何处理拆分数据库的内容的。 我工作的典型应用程序为了性能和简单的原因做了大量的数据库集成。 如果你有两个逻辑上不同的表(如果你愿意的话,有界的上下文),但是你经常在大量的数据上进行聚合处理,那么在整体上你很可能会避开面向对象,而是使用数据库的标准JOINfunction在将聚合视图返回到应用层之前处理数据库上的数据。 你如何certificate将这些数据分解成微服务是必要的,否则你将被要求通过API“连接”数据而不是数据库。 我读过Sam Newman的Microservices一书,在关于分裂Monolith的一章中,他举了一个“打破外键关系”的例子,他承认通过API进行连接会变慢 – 但是他继续说无论如何,你的应用程序是足够快的,这是否比以前慢? 这似乎有点滑稽? 什么是人们的经历? 你使用了什么技术来使API连接可以接受?
我做了一些关于微服务的阅读,而且我有点兴趣。看起来像是一个有趣的概念。 但是我想知道,在单片架构上使用微服务有哪些优缺点,反之亦然。 当微服务适合更好,哪里更好的单片架构。
我试图了解GraphQL最适合在微服务体系结构中使用的地方。 关于只有1个作为API网关的GraphQL模式将请求代理到目标微服务并强制响应,存在一些争议。 微服务仍然会使用REST / Thrift协议来进行通信思想。 另一种方法是每个微服务有多个GraphQL模式。 拥有一个较小的API网关服务器,将请求路由到目标微服务,包含请求的所有信息+ GraphQL查询。 第一种方法 如果将1个GraphQL模式作为API网关,则每当您更改微服务合约input/输出时都会有一个缺点,因此我们必须在API网关端相应地更改GraphQL模式。 第二种方法 如果每个微服务使用多个GraphQL模式,那么在某种意义上说是有道理的,因为GraphQL会强制执行一个模式定义,并且消费者需要尊重微服务给出的input/输出。 问题 你在哪里发现GraphQL适合devise微服务架构? 你将如何devise一个可能的GraphQL实现的API网关?
我刚刚阅读了一篇关于微服务和PaaS架构的文章。 在那篇文章中,大约三分之一的时间,作者指出(在非规范化的疯狂下 ): 重构数据库模式,并将所有事情解除规范化,以便完全分离和分区数据。 也就是说,不要使用服务于多个微服务的基础表。 不应共享跨多个微服务的基础表,也不应共享数据。 相反,如果多个服务需要访问相同的数据,则应该通过服务API(例如发布的REST或消息服务接口)共享。 虽然这在理论上听起来很棒,但实际上却有一些要克服的严重障碍。 其中最大的是,数据库通常紧密耦合,每个表与至less一个其他表有一些外键关系。 因此,将数据库划分成n 个微服务控制的子数据库是不可能的。 所以我问: 给定一个完全由相关表组成的数据库,如何将这个数据库非规范化为更小的片段(表格组),以便片段可以被单独的微服务控制? 例如,给出以下(相当小但是示例性的)数据库: [users] table ============= user_id user_first_name user_last_name user_email [products] table ================ product_id product_name product_description product_unit_price [orders] table ============== order_id order_datetime user_id [products_x_orders] table (for line items in the order) ======================================================= products_x_orders_id product_id order_id quantity_ordered 不要花太多的时间来批评我的devise,我是这样做的。 关键是,对我来说,把这个数据库分成3个微服务是合乎逻辑的: UserService – 用于系统中的用户 应该最终pipe理[users]表; 和 ProductService […]
我很难为微服务体系结构select体面/安全的身份validation策略。 我在这个主题上发现的唯一的SOpost是这样的:微服务架构中的单点login 我的想法是在每个服务(例如身份validation,消息传递,通知,configuration文件等)中为每个用户提供一个唯一的引用(在逻辑上与他的user_id相当),并且可以在login时获得当前用户的id 。 从我的研究中,我发现有两种可能的策略: 1.共享架构 在这个策略中,authentication应用程序是一个服务。 但每个服务必须能够进行转换session_id => user_id所以它必须是死的简单。 这就是为什么我想到Redis,它会存储关键字:value session_id:user_id 。 2.防火墙架构 在这种策略中,会话存储并不重要,因为它只能由validation应用程序处理。 然后user_id可以转发到其他服务。 我想过Rails + Devise(+ Redis或者mem-cached,或者cookie存储等),但是有很多的可能性。 唯一重要的是Service X将永远不需要authentication用户。 这两个解决scheme如何比较: 安全 稳健性 可扩展性 使用方便 或者,也许你会build议我在这里没有提到的另一个解决scheme? 我更喜欢解决scheme#1,但是还没有find太多的默认实现来保证我的方向正确。 我希望我的问题没有结束。 我真的不知道还有什么要问的。 提前致谢
最近我一直在做一些Docker撰写的实验,以部署多个协作的微服务。 我可以看到微服务提供的许多好处,现在有一个很好的工具来pipe理它们,我认为跳进微服务并不难。 但是,我也一直在试验Elixir,而且我非常喜欢自己提供的好处。 鉴于它鼓励将代码打包到多个分离的应用程序中,并支持热码升级,那么如何将docker与elixir(或erlang)混合? 例如,如果我想使用docker,因为它提供dev-prod奇偶校验,那么elixir如何适应呢? 鉴于docker集装箱是不可变的,我失去了进行热码升级的能力,对吧? 蓝色/绿色部署或金丝雀版本呢? 我的意思是,我可以用Elixir写微服务,就像用其他语言写的一样,polyglotism是微服务的好处之一,但是我没有得到使用OTP平台的全部好处,我猜测纯粹的协作erlang应用程序是更好的方式,使用中间队列在用不同(或不是)语言编写的微服务之间进行通信。
比方说,我们有一个用户,电子钱包REST微服务和一个粘合在一起的API网关。 当Bob在我们的网站上注册时,我们的API网关需要通过用户微服务和钱包通过钱包微服务来创build用户。 下面是一些情况可能出错的情况: 用户Bob创build失败:没关系,我们只是将错误消息返回给Bob。 我们正在使用SQL事务,所以没有人在系统中看到Bob。 一切都很好:) 用户Bob已创build,但在创build电子钱包之前,我们的API网关硬件崩溃。 我们现在有一个用户没有钱包(不一致的数据)。 用户Bob已创build,并且在我们创build电子钱包时,HTTP连接将断开。 钱包创build可能已经成功,或者可能没有成功。 有什么解决scheme可以防止这种数据不一致的发生? 是否有模式允许交易跨越多个REST请求? 我已经阅读了关于这个问题上的两阶段提交维基百科页面,但我不知道如何在实践中应用它。 这个primefaces分布式事务:一个RESTfuldevise文件也似乎很有趣,虽然我还没有读过它。 另外,我知道REST可能不适合这个用例。 也许正确的方法来处理这种情况,完全放弃REST,并使用不同的通信协议,如消息队列系统? 还是应该在应用程序代码中执行一致性(例如,通过检测不一致性并修复这些不一致的后台作业,或者通过在“用户”模型上使用“创build”值,“创build”值等)具有“状态”属性?
协调微服务的标准模式是什么? 如果一个微服务只知道自己的域名,但是有一个数据stream需要多个服务以某种方式进行交互,那么该怎么办呢? 比方说,我们有这样的东西: 进销存 装船 为了争论,让我们说一旦订单已经发货,应该创build发票。 在某个地方,某人按下GUI中的一个button,“我完成了,让我们来做这个!” 在一个经典的整体服务体系结构中,我会说有一个ESB处理这个,或者货运服务知道发票服务并且只是调用它。 但是,在这个新颖的微服务世界中,人们如何处理这个问题呢? 我确实认为这可以被认为是高度意见的基础。 但有一个具体的一面,因为微服务不应该这样做。 所以必须有一个“定义应该做什么”,而不是以意见为基础。 射击。