谷歌发布编写分布式应用的框架Service Weaver
一个新的框架,在本地以模块化单体的形式运行,一旦部署,则为分布式微服务架构
转载请注明来源:https://janrs.com/2023/03/%e8%b0%b7%e6%ad%8c%e5%8f%91%e5%b8%83%e7%bc%96%e5%86%99%e5%88%86%e5%b8%83%e5%bc%8f%e5%ba%94%e7%94%a8%e7%9a%84%e6%a1%86%e6%9e%b6service-weaver/
感觉就像永远,总是在什么是更好的之间来来回回:单体还是微服务?
取决于你问谁,以及他们的经验,你每次都会得到不同的答案。但在大多数情况下,这往往取决于许多因素,如公司的规模,你需要服务的流量有多大,以及提供的产品。
在现实中,两种方法都有优点和缺点。但是,如果你能拥有两个世界的最好的东西呢?这就是谷歌新的开源框架旨在为你提供的东西,让我们仔细看看吧
什么是Service Weaver?
Service Weaver是一个框架,目前处于早期开发阶段,由Google编写。它是开源的,这意味着任何人都可以使用和贡献。该框架目前只适用于Go,但如果成功的话,该方法可以复制到任何语言。
它是一个构建分布式应用的框架,其特点是它在本地作为一个模块化的单体运行,但一旦部署,则作为一个分布式的微服务架构运行。
什么是Modular Monolith?
对于不熟悉的人来说,模块化单片机是一种架构,整个架构被写成一个单一的应用程序,在一个单一的存储库中。模块化意味着单体被分离成独立的组件,不同的组件之间有干净和清晰的接口。
这里有一个例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpHRlWQu-1678154099854)(https://janrs.com/wp-content/uploads/2023/03/wervice_weaver.webp “Service Weaver”)]
在这个单体中,有三个组件:订单、支付和运输。每个组件都实现了单体的一个特定部分,关键是每个组件的大部分都是私有的,组件之间的任何通信都是通过一个明确定义的接口。
这允许每个组件的内部被改变和更新而不影响任何其他组件,前提是接口没有被改变或破坏。
当你有多个团队在一个单体上工作时,这确实有助于在团队之间设置明确的界限,并使每个组件独立于任何其他组件而发展,组件之间显示明确的依赖关系。
无论何时你的单片机被部署,它都是作为一个单一的应用程序部署的,你的单片机的每个实例都运行一个单一的进程。例如,如果你要部署到AWS,你的单片机的每个实例将作为EC2实例上的一个进程运行。
Service Weaver与典型的模块化单体有什么不同?
现在我们了解了什么是模块化单体,我们可以看看Service Weaver是如何不是一个构建标准模块化单体的框架。
当开发你的应用程序时,它实际上看起来与上面的例子完全一样。当使用Service Weaver构建一个应用程序时,你在一个单一的资源库中构建组件。如上所述,每个组件都定义了一个清晰的接口,以实现不同组件之间的通信。
Service Weaver与传统的模块化单体的区别在于它的部署。当使用Service Weaver构建的应用程序被部署时,它不是作为一个大的进程被部署,所有的组件都在同一台机器上运行。
相反,每个组件都被单独部署,作为一个微服务。这是相当聪明的,因为你得到了将所有代码放在一个仓库里的好处,便于本地开发,同时也得到了运行分布式架构的好处,你可以在内存、CPU和实例数量等方面根据需要扩展每个组件,仅举几个例子。
很不错,对吧?让我们来看看Service Weaver是如何实现这一目标的吧!
Service Weaver是如何工作的?
正如一开始提到的,Service Weaver完全是用Go编写的,至少目前是这样。在构建你的应用程序时,每个组件必须被定义为一个接口。你可以认为这就像为一个特定的组件定义公共API,列出其他组件可以使用的方法。例如,一个可以反转字符串的组件,可能看起来像这样:
type Reverser interface {Reverse(context.Context, string) (string, error)
}#
任何其他想要反转字符串的组件都可以调用这个Reverser组件,而字符串如何被反转的内部信息是私有的,包含在Reverser组件中。
然后,你可以像通常那样,通过在需要时在组件之间进行方法调用来构建你的组件。你可以完全在本地进行构建和测试,Service Weaver会处理组件之间的交互,将它们视为本地方法调用。
到目前为止,与其他框架或单体没有任何变化。
然而,一旦部署并作为独立的微服务运行,组件之间的调用就不能再本地进行。相反,Service Weaver会在组件之间进行远程程序调用(RPC)。
在不深入了解的情况下,它使用协议缓冲区来序列化和反序列化组件之间传递的数据。不过你不需要担心这个问题,因为所有这些都发生在幕后。你不需要担心在微服务之间进行网络调用,也不需要担心调用是发生在本地还是远程。
就你的代码而言,你按照你的习惯来写,框架将为你处理是在本地还是远程进行调用。在上面的Reverser例子中,你的代码只是调用Reverse,你的代码不需要关心这个调用是在本地还是远程进行的。
用Service Weaver构筑微服务
我总是发现图表有助于理解,这里是谷歌对不同部分如何结合的解释。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w1UTh7lk-1678154099854)(https://janrs.com/wp-content/uploads/2023/03/wervice_weaver01.webp “Service Weaver”)]
我们还没有触及的一件事是该框架的多功能性。传统的微服务的一个缺点是,你经常会出现非常健谈的界面。毕竟,没有人能够看到未来,看到一个架构可能随着时间的推移而演变。
然后,你要么忍受增加的延迟和更高的网络调用失败机会,要么花时间把这两个微服务结合起来。
有了Service Weaver,这个问题就得到了解决。如果你看一下上图,你会发现有4个模块被定义。当作为微服务部署时,你会发现A和B是住在一起的,而C和D是它们自己的微服务。
通过Service Weaver,你可以自由定义哪些组件被部署在哪里。你可以选择让多个组件在单个微服务中一起运行,或者将所有组件部署为独立的微服务。如果你的应用发展到两个组件变得非常健谈,并作为独立的微服务运行,你可以轻松地将它们结合起来,不需要改变代码,只需在Service Weaver中快速改变配置。
云部署选项
你可能想知道你可以将Service Weaver应用程序部署到哪里。由于它是由谷歌编写的,你可能会认为唯一的部署选择是谷歌的云,而且它当然与GCP整合得很好。
然而,它确实支持任何云,如AWS或Azure。它使用TOML文件来定义配置,我一直认为这很容易使用。下面是谷歌的另一张图,解释在不同环境下工作的情况。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ca9RZSds-1678154099855)(https://janrs.com/wp-content/uploads/2023/03/wervice_weaver02.webp “Service Weaver”)]
这表明你是如何建立你的应用程序及其组件的,然后有一系列如何运行该应用程序的选项。你可以用go run在本地运行它。,或者用weaver gke deploy部署到云端。
目前,部署似乎是在Kubernetes上,但未来是否会有其他的部署选择,还有待观察。我认为在引擎盖下,他们正在大量利用Kubernetes来实现组件之间的通信。
开始使用Service Weaver
这就是我对Service Weaver的初步介绍,如果你很想试试,Service Weaver有自己的网站,你可以在这里找到。
它包括从框架的架构、安装,以及当然,从hello world的例子开始的一切。
在我看来,这是一个迷人的方法,在决定单体和微服务之间的时候,它解决了很多问题。它是否能实现这一目标还有待观察,但我很高兴看到Service Weaver的发展。
转载请注明来源:https://janrs.com/2023/03/%e8%b0%b7%e6%ad%8c%e5%8f%91%e5%b8%83%e7%bc%96%e5%86%99%e5%88%86%e5%b8%83%e5%bc%8f%e5%ba%94%e7%94%a8%e7%9a%84%e6%a1%86%e6%9e%b6service-weaver/
相关文章:
谷歌发布编写分布式应用的框架Service Weaver
一个新的框架,在本地以模块化单体的形式运行,一旦部署,则为分布式微服务架构 转载请注明来源:https://janrs.com/2023/03/%e8%b0%b7%e6%ad%8c%e5%8f%91%e5%b8%83%e7%bc%96%e5%86%99%e5%88%86%e5%b8%83%e5%bc%8f%e5%ba%94%e7%94%a8…...

详解FPGA:人工智能时代的驱动引擎观后感
详解FPGA:人工智能时代的驱动引擎观后感 本书大目录 第一章 延续摩尔定律 第二章 拥抱大数据的洪流 第三章 FPGA在人工智能时代的独特优势 第四章 更简单也更复杂——FPGA开发的新方法 第五章 站在巨人肩上——FPGA发展新趋势 文章目录详解FPGA:人工智能…...
Rest/Restful接口
Rest Rest的全称是Representational State Transfer 。Rest是一种架构风格。Rest有很多原则和限制: 客户端-服务端架构模式无状态可缓存统一接口分层系统按需缓存 Rest对我们开发人员来说基本上就是资源,我们一般通过URI表示我们请求的一个资源。例如:…...

【vue init】三.项目引入axios、申明全局变量、设置跨域
教程目录 一:《【vue init】使用vue init搭建vue项目》 二:《【vue init】项目使用vue-router,引入ant-design-vue的UI框架,引入less》 三:《【vue init】项目引入axios、申明全局变量、设置跨域》 根据前文《【vue init】项目使…...
搭建nextcloud私有云盘
要搭建Nextcloud,需要在服务器上安装和配置Nginx、PHP和SQLite3。下面是一些基本步骤: 安装Nginx 可以使用包管理器进行安装。例如,在Ubuntu上可以运行以下命令: sudo apt update sudo apt install nginx配置Nginxwget -P /home/u…...

05 | 如何安全、快速地接入OAuth 2.0?
05 | 如何安全、快速地接入OAuth 2.0? 构建第三方软件应用 第一点,注册信息 小兔软件的研发人员提前登录到京东商家开放平台进行手动注册,以便后续使用这些注册的相关信息来请求访问令牌。兔软件需要先拥有自己的 app_id 和 app_serect 等信…...

nest.js学习笔记(一)
nest.js学习笔记(一)一、安装nest.js前置条件运行项目目录介绍二、nest.js cli 常用命令三、RESTful 风格设计1.接口url2.RESTful 版本控制四、获取前端传过来的参数1.获取Get请求参数2.获取Post请求参数3.动态路由4.获取Header信息5.自定义状态码nest.j…...

win下载配置CIC Flowmeter环境并提取流量特征
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、下载CIC Flowmeter二、安装java、maven、gradle和IDEA1.java 1.82.maven3.gradle4.IDEA三、CICFlowMeter-master使用四、流量特征1.含义2.获取前言 配了一整…...
【LeetCode刷题-Java/Python】二分查找
二分查找704.二分查找题目实现总结35.搜索插入位置题目实现34. 在排序数组中查找元素的第一个和最后一个位置题目实现69.x的平方根题目实现367. 有效的完全平方数题目实现704.二分查找 题目 题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一…...

Linux 6.2 已正式发布
Linus Torvalds 发布了稳定的 Linux 6.2 内核,这是 2023 年的第一个主要内核版本。硬件方面,Linux 6.2 提升了 Intel Arc 显卡 (DG2/Alchemist) 的稳定性,真正做到开箱即用。英特尔的 On Demand 驱动程序现在状态良好,适用于第 4 …...
Kubernetes 101,第一部分,基础知识
已经有一段时间了,我想花点时间坐下来写写关于Kubernetes 的文章。时机已到。 简而言之,Kubernetes是一个用于自动化和管理容器化应用程序的开源系统。Kubernetes 就是关于容器的。 ❗如果你对什么...

企业级信息系统开发学习笔记1.7 基于XML配置方式使用Spring MVC
文章目录零、本节学习目标一、Spring MVC概述1、MVC架构2、Spring MVC3、使用Spring MVC的两种方式二、基于XML配置与注解的方式使用Spring MVC(一)创建Spring项目【SpringMVCDemo01】(二)在pom文件里添加相关依赖(三&…...
java反射,动态代理
1. 反射 1.1 反射的概述: 专业的解释(了解一下): 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意属性和方法…...

React(六):Redux的使用、react-redux简化代码、redux模块化、RTK的使用
React(六)一、Redux测试项目搭建1.创建store仓库2.创建reducer函数(纯函数)3.constants.js保存action名字4.修改store中的数据5.动态生成action二、React中如何使用redux1.安装redux2.创建store3.组件中订阅store4.派发action修改…...

静态库和动态库的打包与使用
静态库和动态库 静态库和动态库的打包 生成可执行程序时链接使用 运行可执行程序时加载使用 提前声明,笔者示例的文件有mian.c/child.c/child.h。OK,我们先了解一下,库文件是什么?它其实就是打包了一堆实现常用功能的代码文件. ⭐…...

h264编码之SPS解析
一、概念 SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。 二、定义 H.264标准协议中规定的SPS格式位于文档的7.3.2.1.1,如下图所示: 1、profile_idc 根据《T-REC-H.264-2…...

使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法
使用enrichKEGG做通路富集分析时,一直报错:显示No gene can be mapped....k <- enrichKEGG(gene gene, organism "hsa", pvalueCutoff 1, qvalueCutoff 1)但是之前用同样的基因做分析是能够成功地富集到通路,即便是网上的数据…...

框架——MyBatis的入门案例
框架概述1.1什么是框架框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交与的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义…...

hadoop兼容性验证
前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构,主要解决海量数据的存储和海量数据的分析计算问题,广义上来说,Hadoop通常是指一个更广泛的概念–hadoop生态圈 Hadoop优缺点: 优点: 1、高可靠性&#x…...

运维提质增效,有哪些办法可以做
凡是代码,难免有 bug。 开发者们的日常,除了用一行行代码搭产品外,便是找出代码里的虫,俗称 debug。 随着移动互联网的快速发展,App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦的…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...