谷歌发布编写分布式应用的框架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 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦的…...
c++基础——结构体
结构体结构体(struct),可以看做是一系列称为成员元素的组合体。可以看做是自定义的数据类型。定义结构体struct abc {int x;int y; } e[array_length];const abc a; abc b, B[array_length], tmp; abc *c;上例中定义了一个名为 abc 的结构体&…...
applicationContext相关加载
spring refresh 概述 refresh是一个方法,spring中所有的ApplicationContext容器都需要通过refresh方法初始化; 处理步骤 其中refresh方法包含12个主要的处理步骤: 1、第1个步骤做前置准备 2、第2~6步骤创建BeanFactory(Appl…...
数据同步工具Sqoop
大数据Hadoop之——数据同步工具SqoopSqoop基本原理及常用方法 1 概述 Apache Sqoop(SQL-to-Hadoop)项目旨在协助RDBMS(Relational Database Management System:关系型数据库管理系统)与Hadoop之间进行高效的大数据交…...
Kafka 版本
kafka-2.11-2.1.1 : Kafka 1.0.0 后,Kafka 版本命名规则从 4 位到 3 位Kafka版本号是 2.1.1前 2 : 大版本号 (MajorVersion)中 1 : 小版本号或次版本号 (Minor Version)后 1 : 修订版本号 (Patch) Kafka 0.7 最早开源版本 : 只提供最基础的消息队列功…...
ElasticSearch 在Java中的各种实现
ES JavaAPI的相关体系: 词条查询 所谓词条查询,也就是ES不会对查询条件进行分词处理,只有当词条和查询字符串完全匹配时,才会被查询到。 等值查询-term 等值查询,即筛选出一个字段等于特定值的所有记录。 【SQL】 s…...
SpringBoot整合Knife4j
文章目录前言一、Knife4j是什么?二、使用步骤1.导入依赖2.编写配置文件3.编写controller和实体类4.测试总结前言 接上篇整合Swagger链接奉上http://t.csdn.cn/9mXSu 一、Knife4j是什么? 官方文档:https://doc.xiaominfo.com/ knife4j可以理解…...
MyISAM和InnoDB存储引擎的区别
目录前言存储引擎区别事务外键表单的存储数据查询效率数据更新效率如何选择前言 MyISAM和InnoDB是使用MySQL最常用的两种存储引擎,在5.5版本之前默认采用MyISAM存储引擎,从5.5开始采用InnoDB存储引擎。 存储引擎 存储引擎是:数据库管理系统…...
SpringMVC自定义处理多种日期格式的格式转换器
package cn.itcast.utils;import org.springframework.core.convert.converter.Converter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;/*** 把字符串转换日期*/public class StringToDateConverter implements Converter<String…...
NYUv2生成边界GT(1)
看了cityscape和NYUv2生成边界GT的代码后,因为自己使用的是NYUv2数据集,所以需要对自己的数据集进行处理。CASENet生成边界GT所使用的代码是MATLAB,所以又重新看了一下MATLAB的代码,并进行修改,生成了自己的边界代码。…...
Spring基本概念与使用
文章目录一、Spring概念1.容器2.IoC3.DI4.Ioc与DI的关系二、Spring创建与使用1.Maven2.添加Spring框架支持注:国内的Maven源配置3.简单实例(1)创建一个Bean对象。(2)将Bean对象存储到Spring当中(3ÿ…...
模板网站建设公司/免费奖励自己的网站
8.4.6 用编程方式添加DataTable行 在为DataTable定义了架构之后,也就是设置好了需要的列名以后,就可以可通过将DataRow对象添加到表的Rows集合中来将数据行添加到表中。与添加DataColumn类似,同样可以通过使用DataRow构造函数,或…...
城乡建设局官网/seo广州工作好吗
一、图灵奖简介 图灵奖(A.M. Turing Award,又译“杜林奖”),由美国计算机协会(ACM)于1966年设立,又叫“A.M. 图灵奖”,专门奖励那些对计算机事业作出重要贡献的个人。其名称取自计算…...
1号网站建设 高端网站建设/四川网站seo
题目链接:http://poj.org/problem?id2955 题意:求相互匹配的括号个数。 一道简单的区间dp,按常规的套路来写就可以了。 #include <iostream> #include <cstring> #include <string> using namespace std; int dp[110][110…...
福田蒙派克6座/广州seo网络优化公司
服务器数据恢复故障描述: 这次要为大家介绍的数据恢复案例是一台存储因硬盘出现故障导致的数据丢失。这台存储设备为某常见品牌的DS5300型号存储,存储连接扩展柜。存储的最底层是十几块硬盘组成的几组raid5磁盘阵列。管理员有一天发现了存储的多组raid阵…...
阿里巴巴国际站特点/百度文库个人登录入口
OAuth 2.0 是什么?OAuth 2.0是在2006年底创建的下一代OAuth协议。OAuth 2.0为客户端开发者开发Web应用,桌面端应用程序,移动应用及客厅设备提供特定的授权流程。该规范是IETF OAuth WG工作组下基于OAuth WRAP协议制定的。2. OAuth 2.0 能做什…...
珠海市网站建设的公司/制作网站代码
距离2018年高考还有不到一个月的时间了,很多人在准备最后冲刺的同时,也在关心高考成绩。2018各地区高考成绩排名查询,高考各高中成绩喜报榜单尚未公布,下面是往年各地区高考成绩排名查询,高考各高中成绩喜报榜单,想要了解同学可以…...