Vue 微前端&微服务解决方案, Genesis 对远程组件进一步的设计和思考

2020-06-19 10:04:40 +08:00
 1340641314

对远程组件进一步的设计和思考

远程组件,是 Genesis 提出的一个概念,它是指通过接口,调用一个另一个服务的组件,它可以是一个按钮、一个模块或者一个页面。

嵌入式调用

除了嵌入图片、视频之类的,在日常开发,嵌入调用最多的还是 iframe
而远程组件,可以让你在服务端、客户端都能无缝的嵌入另外一个服务的页面。
如下图: 它的使用方式是这样子

<template>
    <remote-view :id="1000" @myEvent="onMyEvent" :fetch="fetch" />
</template>
<script>
export default {
    methods: {
        fetch () {
            // 调用其它服务的组件
            const res = await axios.get('/api/ssr-服务名称 /render?url=/demo');
            if (res.status === 200) {
                return res.data;
            }
            return null
        },
        onMyEvent () {
            // 处理远程组件的事件
        }
    }
}
</script>

API 形式调用

假设你有这样的一个弹框
如下图:

这个弹窗只有两种状态,要么取消、要么确定,操作完成。那么它可以设计成类似于下面的 API

const res = await Popup.show(options);
switch (res) {
    case 'cancel':
        // 用户点击[取消]的时候做些什么
        break;
    case 'confirm':
        // 用户点击[确定]的时候做些什么
        break;
}

看到上面,是不是很像我们的接口调用的方式,只不过这次调的不是接口,而是一个 UI 组件。

而远程组件,就可以为我们将这样的 UI 组件,抽象出一个真正类似于接口的组件,所以它的调用可能是下面这样子的

const res = await remote.get('/api/ssr-服务名称 /render?url=/popup');
switch (res) {
    case 'cancel':
        // 用户点击[取消]的时候做些什么
        break;
    case 'confirm':
        // 用户点击[确定]的时候做些什么
        break;
}

微服务

其实 Genesis 最核心的能力在于它可以真正的实现前端版本的微服务架构,独立部署、独立运行、服务和服务之间的调用,通过 API 的形式通信,它将大大的提升了前端的创造力。而微前端的概念,只是它顺便支持的功能而已。

为什么需要它?
随着前端 SPA 应用的发展,项目越来越大,我们需要极其灵活的服务拆分方案,利用分治的思想,将一个大的应用,不断的拆解成一个小的应用,通过接口的形式,可以让我们的应用拆分做得更加的灵活。

最后

Genesis 已经推广了这么多次,但是丝毫没有引起社区的关注,其实我倒是很乐意这个概念、这个设计的思想普及到,能诞生出更多成熟的微服务架构的解决方案。 个人的写作能力有点差,如有疑问,欢迎在 issues 讨论。
如果对本项目感兴趣的话,欢迎 Star 基于 Vue SSR 的微前端、微服务、轻量级的解决方案

传输门

1393 次点击
所在节点    分享创造
25 条回复
1340641314
2020-06-19 18:12:04 +08:00
@Immortal 这个还是要看项目大小,团队规模的。如果一个人的话,维护七八个项目,当然不值当。像我司,不同的项目分属到不同的部门独立维护,侧重点不一样。而且还有个好处就是,如果把所有的页面,都搞成一个服务,如果这个服务挂了,整个网站就挂了。微服务其实还可以规避一下风险,一个服务挂了,其它的服务还是正常的。
Immortal
2020-06-19 18:31:37 +08:00
@1340641314 #21
换个角度想 也多了个风险 某个服务挂了 所有项目的这个组件全挂了
1340641314
2020-06-19 18:39:25 +08:00
@Immortal 你的组件有风险,不会因为你全部写在一个项目,就没有风险了。如果本身有风险,并且只有一个服务,那么就真的整站挂了。
lower
2020-06-19 18:57:13 +08:00
如果涉及到不同模块的 授权认证 该怎么去处理?
1340641314
2020-06-19 19:43:50 +08:00
@lower express 中间件编写授权逻辑就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/682932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX