加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

踩坑实践:如何消除微服务架构中的系统耦合

发布时间:2018-08-19 15:06:29 所属栏目:教程 来源:沈剑
导读:副标题#e# 【资讯】微服务架构实施后,不少通用数据访问会拆分成服务,通用业务也会拆分成服务,站点与服务之间的依赖关系会变得复杂,服务与服务之间的调用关系也会变得复杂。 如果水平拆分/垂直拆分得不合理,系统之间会严重耦合,如何消除微服务架构中的

  另外,我们也需要遵从 SQL、Java 等方面的编程规范。我在负责 DBA 部门的时候,就曾要求:无论什么规范,都必须限定在十条以内,以合适一张 A4 纸单面打印出来。

  踩坑实践:如何消除微服务架构中的系统耦合

  在做了服务化之后,服务层应能够向上游业务提供一些相对比较通用的 RPC 访问,我们籍此可以通过服务层来控制 SQL 的质量。

  这里同样以用户数据的“增、删、查、改”为例,在用户侧访问时,如果你传来用户名/密码,我就回传 UID;如果你传来一个 UID,我就给你一个用户的实例。

  可见,这些接口都是非常有限且通用的。它们对于数据库的访问,都被控制在 Service 上,而非用户层面。所以我总结出来服务化具有如下原则:

  数据库私有

  任何上游不得绕过 Service 去访问底层数据库。业务层只能调用接口,即 SQL 由服务所决定,这一点很重要。

  对上游提供有限且通用的接口

  踩坑实践:如何消除微服务架构中的系统耦合

  许多公司虽然做了服务化,但是服务层仍然有许多个性化的、与业务紧密相关的接口,这就没有达到服务化的目的。

  例如:我们曾经在 user-service 里,有着大量与“搬家”、“货的”、“优配”相关的业务代码,一旦上游出现新的需求,他就提交给服务层去修改。

  这样的话,user-service 实际上实现的是各种个性化的需求,由于这些接口的复用性低,因此不但会导致其代码的混乱,还会造成研发的瓶颈。可见,服务化只应该提供有限的通用接口。

  服务侧要保证无限的性能

  我们通过水平扩展、加缓存、分表等方式去解决各种并发量、吞吐量、和数据量的问题,从而保证了上游侧不必关心各种操作的实现细节。这就是服务维护者对外的一种服务承诺。

  业务一旦出了问题只会影响到自己;如果服务出现了故障,那么就会有深远的影响,甚至会导致用户无法登录。

  可见,诸如用户 Service、订单 Service、支付 Service、商家 Service,都必须具有良好的稳定性。

  我们曾经在“同城”做过的一个实践是:将公司最基础的 Service 放置在架构部,由资深的工程师去做维护。

  数据库拆分真的容易?

  踩坑实践:如何消除微服务架构中的系统耦合

  在最早期,由于 58 速运的数据量较小,我们只用一个库将所有表格包含其中。

  这些表中既有如用户表这样的公共表格,也有一些业务个性化的表格,例如与“搬家”相关的一些用户信息。

  公共表以 UID 为 Key 放置用户公布的属性;个性化表同样以 UID 为 Key,包括“搬家”用户个性化属性。那么,“搬家”的某些业务场景可能会同时提取公共的和个性化的数据。

  由于只有一个库、一个实例,我们通过简单代码直接根据相同的 UID、运用 Join 去操作两张表,便可取出所有需要的数据。即使用到对于 UID 的索引,也不会有多次的交互,或出现性能的问题。

  当然,这些都是基于两张表必须在同一个实例中的前提条件。同理,我们的“货的”、“优配”也是这么各自构建的。

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读