微服务-数据聚合

微服务-数据聚合,第1张

微服务的难点:

例:

前端请求数据后,根据数据再分别请求其他服务。

例如:

缺点:

在服务中调用其他服务将数据补全,然后返回到前端

例如:

缺点:

在前后端中间增加BFF数据聚合服务。

AggregationParam

配合Aggregation的属性上使用

例如:

需求侧:

提供侧:

wy-aggregation-service

实现使用的是Egg框架(nodejs)。node 对于IO有好性能。同时,由于js是弱类型语言,更容易对json数据处理。

用户服务

CRM服务

订单服务

>

owt 整体基于微服务的架构思想,每个服务节点可以单独部署,多点部署

每个运行的节点都会发送 RPC join 注册,并记录在注册中心。其他节点会发送 RPC schedule 到 ClusterManager 查询可用节点。

ClusterManager 本身使用选举机制来实现高可用,ClusterManger 本身也集成了资源调度的功能,其他节点使用指定的策略来进行调度。

OWT 并没有使用配置中心,每个节点都是用 TOML 文件来进行配置。

(refs: >

曾经沧海难为水,除却巫山不是云。

本次 *** 作配置如下:

为了创建新页面,请单击页面右上角的“ 新建页面” 按钮;

创建新页面时,将出现以下对话框提示:

Wikijs根据您要编写的内容类型或只是用户首选项提供了各种编辑器。开发人员通常会使用Markdown编辑器,而非技术用户则更喜欢Visual Editor。

有关编辑器及其使用方法的完整列表,请参阅“ 编辑器” 部分。

选择编辑器后,系统会提示您“页面数据”对话框:

输入页面的 标题 描述 标签

最后,单击“ 确定” 关闭对话框并开始编写!

注:您以后可以通过单击 页面 右上角的“ 页面” 按钮返回到“页面元数据”对话框。

直到您单击“ 创建” 按钮(位于页面右上角),才会 创建 页面。它会被保存并呈现,之后您将自动重定向到最终结果。只需单击编辑按钮即可返回编辑!

Wikijs没有传统意义上的文件夹结构。您无需创建文件夹即可创建新页面。而是直接在您选择的路径上创建页面。

例如,为了在创建一个页面/universe/planets/earth,你并不需要创建的文件夹universe,并planets在首位。他们会自动推断出来。

该系统允许更大的灵活性和更少的页面之间依赖性。但是,这并不意味着您不能使用传统的文件夹系统。创建和移动页面时,文件夹结构仍然可用。唯一的区别是您不必管理文件夹,它们是从页面路径自动推断出来的。

每页顶部显示的面包屑栏是根据路径自动生成的。

标签是对页面进行分类并轻松查找相关内容的好方法。与使用复杂的文件夹系统对内容进行分类相比,它们是一种更精简的选择。标签是贴在页面上的简单标签。

可以将多个标签添加到页面。

例如,对于一个关于城市页面 Montreal ,你可以添加标签cities,canada,north-america。这些标签随后可用于快速查找页面。通过按canada和进行浏览cities,因为页面上同时存在这两个标签,所以 Montreal 页面将出现在结果中。

您可以随时在页面上添加或删除更多标签。

使用 按标签浏览 链接(位于搜索栏旁边或在导航菜单中)可查看Wiki中所有可用标签的列表。

选择一个或多个标签以查看与所选内容匹配的页面列表。

手动输入文章地址即可生效地址。

一个组包含多个用户,一组权限和一个页面规则列表。

定义了用户可以看到的内容以及他可以做什么。这可以通过使用2个概念来实现: 全局权限 页面规则

一个 全局权限 给予用户执行一个非常具体的行动的权利。例如,全局权限read:pages允许用户查看页面,而全局权限write:assets允许用户上载图像和文件。这些全局权限充当主开关,以 允许或拒绝 Wiki上的特定 *** 作。

列1:我想让用户看不到主页:点击系统阅读组,关掉这个开关。

列2:我想让登录的用户看不到主页:在用户组内组,关掉阅读权限即可。

虽然 global 的权限是很大的一个限制用户只能执行一组特定的动作,但它缺乏的控制,其中应用这些权限。例如,您可能希望用户能够查看下方的页面,/cities但不能查看下方的页面/secret。这是 页面规则 起作用的地方。

让我们使用以下示例: 我们希望XYZ 组的用户能够查看页面和查看路径完全位于的资产/cities/montreal 。

该页面规则将定义为:

如果将所有概念结合在一起,该小组将:

规则以什么顺序应用?

规则按照路径特异性的顺序应用。更精确的路径将始终覆盖定义不明确的路径。

例如,/geography/countries将覆盖/geography。

当两个规则具有相同的特异性时,优先级从最低到最高给出如下:

有2个预定义且无法删除的系统组:其他规则组可以自己创建,也可以从外部身份验证系统预授权用户。

您必须在系统上安装Git 274或更高版本才能启用此模块!

当提示您保存生成的文件时,按 Ente键 。(默认在C:\Users\Joessh)

将密码短语留空,然后按两次 Enter键 。受密码保护的密钥不起作用。

取次花丛懒回顾,半缘修道半缘君

前端

前端开发人员专注业务的页面呈现,非常注重用户体验度,也是与各种角色打交道最多的。

比如:

一般前端工作包括六个部分:

后端

如果前后端职责划分很清楚的话,后端更多开发工作在于业务接口设计、业务逻辑处理以及数据的持久化存储,并提供详细的接口设计文档给前端开发人员使用。

一般后端工作包括五个部分:

1、与产品经理对接需求

2、业务 API 接口开发:根据根据需求文档进行业务接口开发

4、接口对接:与前端开发人员接口对接

5、前后端联调测试:包括页面展示以及接口数据

6、bug修复

前端开发技术栈

h5 、 css 、 nodejs / vue / angular / react 、 webpack 、 hbuilder / vscode 等

后端开发技术栈

SpringCloud / Springboot 、 SpringMVC 、 ORM 框架、数据库、缓存框架( Redis , Codis , Memcached 等),大数据框架( Hadoop / Spark / hive / Hbase / Storm / ES / Kafka )等等

技术选型

最好选择成熟稳定,易上手、开发效率高的技术,因为实际项目开发时间是有限的,开发人员没有多少精力放在学习和深度研究技术上。

数据格式

后端开发提供接口设计文档,详细写明每个接口的请求地址、请求参数、响应参数等等;一般采用 REST 风格以 JSON 格式提供数据。

接口设计

一个接口设计的好坏,直接影响到前后端的一些沟通协调问题。

依笔者的经验来看,如果后端接口不稳定,会导致前端开发人员反复修改页面数据呈现。常常出现后端开发说这是前端问题,前端开发说是后端问题,来回扯皮,沟通效率低下。

接口容量问题

一个接口的业务容量大小,往往代表前后端工作量的大小。

如果一个接口的业务容量太小,前端需要分阶段处理的事情就多,尤其是对多个接口 Ajax 异步处理;

如果一个接口的业务容量太大,那么业务耦合性高,万一需求变更,后端程序改动大,不利于程序的扩展。

一、前后端分离的思想要转变

不能老是按照传统WEB( js/h5/css/ 后端代码放在一个工程)开发思维去看待前后端分离

二、沟通成本问题

以前传统 WEB 开发,开发人员从需求到设计到开发基本上是一个人。

而前后端分离后,前端只负责页面呈现,后端更注重业务逻辑处理以及数据的持久化,双发都有自己的侧重点,工作量上有私心。

三、组织结构问题

康威定律

第一定律: Communication dictates design (组织沟通方式会通过系统设计表达出来)

第二定律: There is never enough time to do something right, but there is always enough time to do it over (时间再多一件事情也不可能做得美,但总有时间做完一件事情)

第三定律 : There is a homomorphism from the linear graph of a system to the linear graph of its design organization (线型系统和线型组织架构间有潜在的异质同态特性)

第四定律: The structures of large systems tend to disintegrate during development, qualitatively more so than with small systems (大的系统组织总是比小系统更倾向于分解)

康威定律说明以下几点

四、部署及监控运维

前后端分离后,拆分的服务会带来线上部署以及如何监控运维的复杂性。

总体来说,前后分离所带来的好处还是更明显的。一个成熟的前后端分离的团队,文档化约定,前后端职责分离、接口约定都是做得比较好的

微服务¹架构的目标是帮助工程团队更快,更安全,更高质量地交付产品。解耦服务允许团队快速迭代,对系统的其余部分影响最小。

在Medium,我们的技术堆栈始于2012年的单片Nodejs应用程序。我们已经构建了几个卫星服务,但我们还没有制定一个系统地采用微服务架构的策略。随着系统变得越来越复杂并且团队不断发展,我们在2018年初转向了微服务架构。在这篇文章中,我们希望分享我们有效地做到这一点并避免微服务综合症的经验。

首先,让我们花一点时间来思考微服务架构是什么,不是什么。 “微服务”是那些过载和混乱的软件工程趋势之一。这就是我们在Medium认为它是什么:

该定义包括三个微服务设计原则:

Three Principles of Modeling Microservices

当我们对微服务进行建模时,我们应该遵守所有三个设计原则。这是实现微服务架构全部潜力的唯一途径。错过任何一个都会成为反模式。

没有一个目的,每个微服务最终会做太多事情,成长为多个“单片”服务。我们不会从微服务架构中获得全部好处,我们也会支付运营成本。

如果没有松散耦合,对一个服务的更改会影响其他服务,因此我们无法快速安全地发布更改,这是微服务架构的核心优势。更重要的是,紧密耦合引起的问题可能是灾难性的,例如数据不一致甚至数据丢失。

如果没有高凝聚力,我们将最终得到一个分布式单片系统 - 一组混乱的服务,必须同时进行更改和部署才能构建单一功能。由于多个服务协调的复杂性和成本(有时跨多个团队),分布式单片系统通常比集中式单片系统差得多。

与此同时,了解 微服务不是什么 很重要:

在Medium,我们总是在做出重大产品或工程决策时会问“为什么现在?”这个问题。 “为什么?”是一个显而易见的问题,但它假设我们拥有无限的人,时间和资源,这是一个危险的假设。当你想到“为什么现在?”时,你突然有了更多的限制 - 对当前工作的影响,机会成本,分心的开销等等。这个问题有助于我们更好地优先考虑。

我们现在需要采用微服务的原因是我们的Nodejs单片应用程序已经成为多个方面的瓶颈。

首先,最紧迫和最重要的瓶颈是其性能。

某些计算量很大且I / O很重的任务不适合Nodejs我们一直在逐步改进整体应用程序,但事实证明它是无效的。它的低劣性能使我们无法提供更好的产品而不会使已经非常慢的应用程序变慢。

其次,整体应用程序的一个重要且有点紧迫的瓶颈是它会减慢产品开发速度。

由于所有工程师都在单个应用程序中构建功能,因此它们通常紧密耦合。我们无法灵活地改变系统的一部分,因为它也可能影响其他部分。我们也害怕做出重大改变,因为影响太大,有时难以预测。整个应用程序作为一个整体进行部署,因此如果由于一次错误提交导致部署停滞,那么所有其他更改(即使它们完全正常工作)也无法完成。相比之下,微服务架构允许团队更快地发货,学习和迭代。他们可以专注于他们正在构建的功能,这些功能与复杂系统的其余部分分离。更改可以更快地进入生产。他们可以灵活地安全地尝试重大变革。

在我们新的微服务架构中,更改会在一小时内完成生产,工程师不必担心它会如何影响系统的其他部分。该团队还 探索 了在开发中安全使用生产数据的方法²多年来一直是白日梦。随着我们的工程团队的发展,所有这些都非常重要。

第三,单一应用程序使得难以为特定任务扩展系统或隔离不同类型任务的资源问题。

使用单一的单一应用程序,我们必须扩展和缩小整个系统,以满足更多资源需求的任务,即使这意味着系统过度配置用于其他更简单的任务。为了缓解这些问题,我们对不同类型的请求进行分片,以分离Nodejs进程。它们在一定程度上起作用,但不会扩展,因为这些微单一版本的单片服务是紧密耦合的。

最后但同样重要的是,一个重要且即将成为紧迫的瓶颈是它阻止我们尝试新技术。微服务架构的一个主要优点是每个服务都可以使用不同的技术堆栈构建,并与不同的技术集成。这使我们能够选择最适合工作的工具,更重要的是,我们可以快速安全地完成工作。

采用微服务架构并非易事。它可能会出错,实际上会损害工程生产力。在本节中,我们将分享七个在采用早期阶段帮助我们的策略:

有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。这是错误的做法。我们永远不应该为了建立新的服务而建立新的服务。每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。

产品价值应以我们可以为用户提供的利益为代表。与在单片Nodejs应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。工程价值应该使工程团队更好,更快。

如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。如果十年内Medium仍然有一个支持某些表面的单片Nodejs应用程序,那就完全没了问题。从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。

建立具有明确价值的新服务

有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。这是错误的做法。我们永远不应该为了建立新的服务而建立新的服务。每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。

产品价值应以我们可以为用户提供的利益为代表。与在单片Nodejs应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。工程价值应该使工程团队更好,更快。

如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。如果十年内Medium仍然有一个支持某些表面的单片Nodejs应用程序,那就完全没了问题。从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。

单片持久存储被认为是有害的

建模微服务的很大一部分是对其持久数据存储(例如,数据库)进行建模。跨服务共享持久数据存储通常似乎是将微服务集成在一起的最简单方法,然而,它实际上是有害的,我们应该不惜一切代价避免它。这就是原因。

首先,持久数据存储是关于实现细节的。 跨服务共享数据存储会将一个服务的实现细节暴露给整个系统。如果该服务更改了数据的格式,或者添加了缓存层,或者切换到不同类型的数据库,则还必须相应地更改许多其他服务。 这违反了松散耦合的原则。

其次,持久数据存储不是服务行为,即如何修改,解释和使用数据 。如果我们跨服务共享数据存储,则意味着其他服务也必须复制服务行为。 这违反了高内聚的原则 - 给定域中的行为泄露给多个服务。如果我们修改一个行为,我们将不得不一起修改所有这些服务。

在微服务架构中,只有一个服务应该负责特定类型的数据。所有其他服务应该通过负责服务的API请求数据,或者保留数据的 只读非规范(可能具体化)副本

这可能听起来很抽象,所以这是一个具体的例子。假设我们正在构建一个新的推荐服务,它需要来自规范帖子表的一些数据,目前在AWS DynamoDB中。我们可以通过两种方式之一为新推荐服务提供发布数据。

在单片存储模型中,推荐服务可以直接访问单片应用程序所执行的相同持久存储。这是一个坏主意,因为:

缓存可能很棘手。 如果推荐服务与单一应用程序共享相同的缓存,我们也必须在推荐服务中复制缓存实现细节;如果推荐服务使用自己的缓存,当单片应用更新帖子数据时,我们将不知道何时使其缓存无效。

如果单片应用程序决定更改为使用RDS而不是DynamoDB来存储帖子数据,我们将不得不重新实现推荐服务中的逻辑以及访问帖子数据的所有其他服务。

单片应用程序具有解释帖子数据的复杂逻辑 ,例如,如何确定帖子是否应该对给定用户不可见。我们必须在推荐服务中重新实现这些逻辑。一旦整体应用程序更改或添加新逻辑,我们也需要在任何地方进行相同的更改。

即使推荐服务是自己的数据访问模式的错误选项,推荐服务仍然停留在DynamoDB上。

在解耦存储模型中,推荐服务不能直接访问发布数据,也不能直接访问任何其他新服务。发布数据的实​​现细节仅保留在一个服务中。有不同的方法来实现这一目标。

Option A 理想情况下,应该有一个拥有帖子数据的Post服务,其他服务只能通过Post服务的API访问邮政数据。但是,为所有核心数据模型构建新服务可能是一项昂贵的前期投资。

当人员配置有限时,还有一些更实用的方法。根据数据访问模式,它们实际上可能是更好的方式。

选项B 中,单一应用程序可让推荐服务知道何时更新相关的帖子数据。通常,这不必立即发生,因此我们可以将其卸载到排队系统。

选项C 中,ETL管道生成推荐服务的发布数据的只读副本,以及可能对推荐有用的其他数据。在这两个选项中,推荐服务完全拥有其数据,因此它可以灵活地缓存数据或使用最适合的数据库技术。

解耦“建立服务”和“运行服务”

如果构建微服务很难,那么运行服务往往更难。 当运行服务与构建每个服务相结合时,它会减慢工程团队的速度,团队必须不断重新发明这样做。我们希望让每项服务都专注于自己的工作而不用担心如何运行服务的复杂问题,包括网络,通信协议,部署,可观察性等。服务管理应该与每个服务的实现完全分离。

由于最近在 容器化,容器编排,服务网格,应用程序性能监 控等方面的技术进步,“运行服务”的解耦变得比以往更容易实现。

网络。 网络(例如,服务发现,路由,负载平衡,流量路由等)是运行服务的关键部分。传统方法是为每种平台/语言提供库。它工作但不理想,因为应用程序仍然需要非常繁琐的工作来集成和维护库。通常,应用程序仍然需要单独实现某些逻辑。现代解决方案是在Service Mesh中运行服务。在Medium,我们使用 Istio和Envoy作为边车代理 。构建服务的应用工程师根本不需要担心网络问题。

通信协议 。无论您选择哪种技术堆栈或语言来构建微服务,从一个高效,类型化,跨平台且需要最少开发开销的成熟RPC解决方案开始是非常重要的。支持向后兼容性的RPC解决方案也使部署服务更加安全,即使它们之间存在依赖关系。在Medium,我们选择了gRPC。

一种常见的替代方案是基于>

最基本的就是开发网页啦,html写网页,js实现网页交互效果,除此之外,也可以开发桌面GUI程序,下面我简单介绍一下如何使用html+js开发出一个简单的桌面程序:

1这里为了更好的说明问题,我新建了一个html文件,就是一个简单的登录页面,源码如下,非常简单,就是两个输入框和一个登录按钮:

浏览器运行的效果如下:

2接着就可以将这个html网页打包为桌面应该程序,这里需要用到nodejs的Electron功能,下面我具体介绍一下主要步骤及截图:

首先,需要安装本地node环境,这个直接到官网上下载就行,如下,选择适合自己平台的版本即可:

安装完成后,需要下载一下electron和electron-packager这2个包,后面的打包需要借助这2个包,命令“npminstallelectronelectron-packager”,如下:

接着新建一个文件夹,将刚才的html文件拖拽进去,同时新建一个packagejson文件和一个mainjs文件,如下:

packagejson文件配置如下,主要指明应用名称、版本号及打包配置文件:

mainjs文件配置如下,这里需要指明打包程序的入口文件,网上也有详细配置过程:

最后就是在打包程序了,命令“electron-packagerAPP--win--outAppDir--arch=x64--electron-version=3010--overwrite”,打包的过程非常快,这里主要需要指明打包的应用名称、输出目录、版本号、位数等:

接着就可以在输出目录AppDir中找到打包好的应用程序APPexe,直接双击就能打开,截图如下,和浏览器效果差不多:

至此,我们就完成了利用html+js来开发一个简单的桌面GUI程序。总的来说,整个过程不难,就是步骤有些繁琐,只要你熟悉一下上面的配置过程,多 *** 作几遍,很快就能掌握的,当然,你也可以使用html+js开发移动应用,像HBuilder等,网上也有相关教程和资料,介绍的非常详细,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言。

目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种,本文恩主要给大家介绍了关于利用pm2部署多个nodejs项目的配置教程,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

相信大家应该都知道,一般在实际项目部署中,我们服务器在启动的时候需要自动启动node服务。以前是通过liunx自带的命令启动。但是随着后台微服务越来越多。每次发布新程序。修改脚本太麻烦了。于是换成PM2来做。下面话不多说了,来一起看看详细的实现过程吧。

配置方法如下:

1首先安装pm2npm install -g pm2

2生成配置文件pm2 ecosystem

生成完成会有一个ecosystemconfigjs的文件,

3修改配置文件

编辑ecosystemconfigjs

以上就是关于微服务-数据聚合全部的内容,包括:微服务-数据聚合、微服务乾坤框架、【速成】OWT 架构关键技术 - (1)微服务架构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10128125.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存