Service Weaver:Google开源基于分布式应用程序开发的框架,重新定义微服务边界

大家好,我是萧楚河,公众号:golang面试经典讲解,感谢关注,一起学习一起成长。

一、前言

今年6月,一群谷歌员工(由谷歌软件工程师Michael Whittaker领导)发表了一篇名为“Towards Modern Development of Cloud Applications”的论文。

正如Whittaker等人所指出的,从架构上讲,微服务本身设置就有问题,它是一个没有边界的结构它们将逻辑边界(如何编写代码)与物理边界(如何部署代码)混为一谈。这就是问题的开始。

因此,谷歌的工程师们提出了一种堪称“微服务2.0”的方法。将应用程序构建为逻辑整体,但将其交给自动化运行时,后者可以根据应用程序所需的内容和可用的内容来决定在哪里运行工作负载。

基于新提出的结构,他们能够将系统的延迟降低15倍,成本降低9倍。

“从有组织的模块化代码开始,我们就可以将部署架构作为实现细节,”Google开发人员倡导者Kelsey Hightower在10月份对这项工作表示了下一步计划。

鉴于以上实践,诞生了Service Weaver。

1.1 什么是Service Weaver

ServiceWeaver是一个用于编写、部署和管理分布式应用程序的编程框架。您可以在机器上本地运行、测试和调试Service Weaver应用程序,然后使用单个命令将该应用程序部署到云中。

Service Weaver应用程序由许多组件组成。组件被呈现为常规Go接口,组件之间通过调用这些接口定义的方法来相互交互。这使得编写Service Weaver应用程序变得容易。你不需要编写任何联网或序列化代码,你只要写Go。Service Weaver还提供用于日志记录、度量、跟踪、路由、测试等的库。

1.2 什么是模块单体应用?

对于不熟悉的人来说,模块化单体应用是一种体系结构,其中整个应用程序都写成一个单独的应用程序,在一个单一的代码库中。模块化方面意味着单体应用被分成单独的组件,并且在不同组件之间有干净明确的接口。

这里是一个例子:
在这里插入图片描述

在这个单体应用中,有三个组件:订单、支付和运输。每个组件实现单体应用的一个特定部分,关键在于每个组件的大部分都是私有的,并且组件之间的任何通信都是通过明确定义的接口进行的。

这使得每个组件的内部可以进行更改和更新,而不会影响任何其他组件,假设接口未更改或破坏。

当多个团队在单体应用上工作时,这确实有助于在团队之间设定明确的边界,并使每个组件独立于其他任何组件发展,同时在组件之间显示明确的依赖关系。

每当你的单体应用被部署时,它都被部署为一个单一的应用程序,每个单体应用的实例都运行一个单一的进程。例如,如果你要部署到AWS,每个单体应用的实例都将作为一个进程运行在EC2实例上。

二、Service Weaver工作原理

2.1 与模块化单体应用区别

Service Weaver和传统的模块化单体应用之间的区别在于部署方式。使用Service Weaver构建的应用程序在部署时,不是将所有组件运行在同一台机器上的一个大进程。

在这里插入图片描述
相反,每个组件都作为一个独立的微服务进行部署。这非常巧妙,因为您既可以获得将所有代码放在单个代码库中并进行方便的本地开发的好处,又可以获得运行分布式架构的好处,其中您可以根据需要缩放每个组件,例如内存,CPU和实例数量等。

2.2 如何工作的?

ServiceWeaver的核心抽象是组件。组件就像一个参与者,ServiceWeaver应用程序是作为一组组件来实现的。具体地说,组件用一个常规Go接口表示,组件通过调用这些接口定义的方法来相互交互。

2.2.1 单组件

在本节中,我们将定义一个简单的hello组件,它只打印一个字符串并返回。首先,运行go mod init hello来创建一个go模块。

mkdir hello/
cd hello/
go mod init hello然后,创建一个名为main.go的文件,其中包含以下内容:

package main

import (
“context”
“fmt”
“log”

"github.com/ServiceWeaver/weaver"

)

func main() {
if err := weaver.Run(context.Background(), serve); err != nil {
log.Fatal(err)
}
}

// app is the main component of the application. weaver.Run creates
// it and passes it to serve.
type app struct{
weaver.Implements[weaver.Main]
}

// serve is called by weaver.Run and contains the body of the application.
func serve(context.Context, *app) error {
fmt.Println(“Hello”)
return nil
}

在构建和运行应用程序之前,我们需要运行ServiceWeaver的代码生成器,称为weavergenerate。weavergenerate编写一个weaver_gen.go文件,其中包含ServiceWeaver运行时所需的代码。我们将详细说明weaver generate到底做了什么,以及为什么我们稍后需要运行它。最后,运行应用程序!

$ go mod tidy
$ weaver generate .
$ go run .
Hello

2.2.2 多组件

在ServiceWeaver应用程序中,任何组件都可以调用任何其他组件。为了演示这一点,我们引入了第二个Reverser组件。创建一个文件Reverser.go。转到以下内容:

package mainimport ("context""github.com/ServiceWeaver/weaver"
)// Reverser component.
type Reverser interface {Reverse(context.Context, string) (string, error)
}// Implementation of the Reverser component.
type reverser struct{weaver.Implements[Reverser]
}func (r *reverser) Reverse(_ context.Context, s string) (string, error) {runes := []rune(s)n := len(runes)for i := 0; i < n/2; i++ {runes[i], runes[n-i-1] = runes[n-i-1], runes[i]}return string(runes), nil
}

Reverser组件由Reverse接口表示,该接口具有反转字符串的Reverse方法。reverser结构是我们对reverser组件的实现(如weaver.Implements[Reverser]所示它包含的字段)。

接下来,在main.go中编辑应用程序组件以使用reverser组件:


package mainimport ("context""fmt""log""github.com/ServiceWeaver/weaver"
)func main() {if err := weaver.Run(context.Background(), serve); err != nil {log.Fatal(err)}
}type app struct{weaver.Implements[weaver.Main]reverser weaver.Ref[Reverser]hello    weaver.Listener
}func serve(ctx context.Context, app *app) error {// Call the Reverse method.// The hello listener will listen on a random port chosen by the operating// system. This behavior can be changed in the config file.fmt.Printf("hello listener available on %v\n", app.hello)// Serve the /hello endpoint.http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {name := r.URL.Query().Get("name")if name == "" {name = "World"}reversed, err := app.reverser.Get().Reverse(ctx, name)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}fmt.Fprintf(w, "Hello, %s!\n", reversed)})return http.Serve(app.hello, nil)
}

应用程序结构有一个类型为weaver.Ref[Reverser]的新字段,提供对反向器组件的访问权限。

2.2.3 多进程执行

我们已经了解了如何通过go run在单个流程中运行Service Weaver应用程序。现在,我们将在多个进程中运行我们的应用程序,在作为RPC执行的组件之间进行方法调用。首先,创建一个名为weaver.toml的TOML配置文件,其中包含以下内容:

[serviceweaver]
binary = "./hello"[multi]
listeners.hello = {address = "localhost:12345"}

此配置文件指定ServiceWeaver应用程序的二进制文件,以及hello侦听器的固定地址。接下来,使用weaver multi-deploy构建并运行应用程序:

go build                        # build the ./hello binary
weaver multi deploy weaver.toml # deploy the application

2.3 微服务如何组合?

我发现图表有助于理解的一个例子,这是Google解释了这些不同部分如何组合在一起的图表:

在这里插入图片描述
我们还没有谈到 Service Weaver 框架的多功能性。传统微服务的一个缺点是,你经常会遇到接口过于频繁的问题。毕竟,没有人能预见架构的演变方向。

然后,你不得不忍受增加的延迟和更高的网络调用失败率,或者花时间将这两个微服务合并起来。

使用 Service Weaver,这个问题得到了解决。如果你查看上面的图表,你会发现有四个模块被定义了。当部署为微服务时,你会注意到 A 和 B 住在一起,C 和 D 是他们自己的微服务。

使用 Service Weaver,你可以自由地定义组件在哪里部署。你可以选择让多个组件一起运行在单个微服务中,或者将所有组件都部署为单独的微服务。如果你的应用程序演变到两个组件变得过于频繁,并且作为单独的微服务运行,你可以轻松地将它们合并,而不需要改变代码,并在 Service Weaver 中快速更改配置。

三、Service Weaver使用

这里基于我的理解对Service Weaver的初步介绍,鉴于很多人可能希望自己实践一下,可以通过如下地址进入官方网站进行学习:https://serviceweaver.dev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsl(ubuntu)创建用户

我们打卡ubuntu窗口&#xff0c;如果没有创建用户&#xff0c;那么默认是root用户 用户的增删改查 查 查询所有的用户列表 cat /etc/passwd | cut -d: -f1cat /etc/passwd: 这个命令用于显示 /etc/passwd 文件的内容。/etc/passwd 文件包含了系统上所有用户的基本信息。每一…

SpringBoot 中实现订单30分钟自动取消的策略

简介 在电商和其他涉及到在线支付的应用中&#xff0c;通常需要实现一个功能&#xff1a;如果用户在生成订单后的一定时间内未完成支付&#xff0c;系统将自动取消该订单。 本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案&#xff0c;并提供实例…

Odoo | Module | 统计系统周期使用人数/当前在线人数

文内材料 GITHUB地址 前言介绍 Odoo作为开源ERP系统的No.01,近年愈发的得到国内很多公司的关注。 虽然它的定位是中小型企业的ERP管理系统&#xff0c;但是在几年的Odoo开发实施过程中&#xff0c;有不足50人的小型企业&#xff0c;也有上万人的中大型企业。功能快速落地和…

ipyvizzu:一款可以绘制超级惊艳的可视化动图的 Python 工具包

今天我给大家介绍一款可视化模块&#xff0c;使用它可以绘制出十分惊艳的动图效果&#xff0c;那么当然第一步我们首先是要安装一下该模块&#xff0c;通过pip命令行来安装 pip install ipyvizzu牛刀小试 我们首先来简单地使用该模块来绘制一张动图&#xff0c;用Pandas导入数…

2024年阿里云服务器优惠活动大全,实时更新

阿里云服务器优惠活动大全包括&#xff1a;云服务器新人特惠、云小站、阿里云免费中心、学生主机优惠、云服务器精选特惠、阿里云领券中心等&#xff0c;活动上阿里云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;…

【大数据进阶第三阶段之Hive学习笔记】Hive安装

目录 1、环境准备 2、下载安装 3、配置环境变量 4、配置文件 4.1、配置hive-env.sh ​编辑4.2、配置hive-site.xml 5、上传配置jar 6、启动 1、环境准备 安装hadoop 以及 zookeeper、mysql 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 《z…

二刷Laravel 教程(用户模型)总结Ⅲ

一、数据库迁移 当我们运行迁移时&#xff0c;up 方法会被调用&#xff1b;&#xff08;创建表&#xff09; 当我们回滚迁移时&#xff0c;down 方法会被调用。&#xff08;删除表&#xff09; public function up() { //create 方法会接收两个参数&#xff1a;一个是数据…

C++string类的介绍及常用函数用法总结

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE&#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&a…

更改ERPNEXT源

更改ERPNEXT源 一&#xff0c; 更改源 针对已经安装了erpnext的&#xff0c;需要更改源的情况&#xff1a; 1, 更改为官方默认源, 进入frapp-bench的目录&#xff0c; 然后执行: bench remote-reset-url frappe //重设frappe的源为官方github地址。 bench remote-reset-url…

如何配置 VS Code 实现 git 密码免输入

目录 问题描述尝试过的失败方法问题分析最终采用的解决方案&#xff1a;利用 ssh key 提供密码免输入功能安装 git windows 命令工具在windows本地生成 ssh key将公钥安装到 git 服务器第一种方法第二种方法调试方法 参考资料: 问题描述 在 Windows 上&#xff0c;使用 Visual…

AI股票崩盘预测模型(企业建模_论文科研)ML model for stock crash prediction

对齐颗粒度&#xff0c;打通股票崩盘底层逻辑&#xff0c;形成一套组合拳&#xff0c;形成信用评级机制良性生态圈&#xff0c;重振股市信心&#xff01;--中国股市新展望&#xff01;By Toby&#xff01;2024.1.3 综合介绍 股票崩盘&#xff0c;是指证券市场上由于某种原因&a…

玩机技巧|拿到新电脑or电脑重装系统后该如何设置

1、关闭权限申请 你是否碰到过&#xff0c;在打开一个应用时&#xff0c;电脑总会询问”你要允许此应用对你的设备进行更改吗&#xff1f;"&#xff0c;这个或许很烦&#xff0c;下面我们就讲这个关闭&#xff0c;告别不断地请求。&#xff08;此处你点击是&#xff0c;便…

ssm基于JSP的明水县苹果网吧计费管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本明水县苹果网吧计费管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大…

包含所有字符的最短字符串

由题还是很容易想到可以用一个哈希表来统计字符串中每个字符出现的次数。首先扫描字符串t&#xff0c;每扫到一个&#xff0c;哈希表中对应值加1。然后扫描字符串s&#xff0c;每扫描一个就检查哈希表中是否包含该字符&#xff0c;没有则忽略不计。如果存在&#xff0c;对应的值…

【数据结构】八大排序之快速排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.快速排序简介及思路 二.快速排序代码实现的三种方式 &#x1f4cc;左右交换法 &#x1f4cc;挖坑填坑法 &#x1f4cc;前后指针法 三.快速排序的时间复杂度分析…

ssm基于HTML5的交流论坛的设计与实现+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

【Java EE初阶九】多线程进阶一(锁策略)

前言 锁的策略&#xff1a;加锁过程中&#xff0c;即处理冲突的过程中&#xff0c;需要涉及到的一些不同的处理方式&#xff08;此处锁策略并不是java独有的&#xff09;&#xff0c;本篇内容主要是讲解一下关于锁的相关知识点&#xff1b; 1. 关于锁的分组 1.1 第一组&#x…

动态内存管理:malloc free

//——————1.动态内存管理&#xff08;内存空间&#xff09; 共四个函数&#xff1a;malloc free calloc realloc 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] { 0 };//在栈空间上开…

一、Qt介绍

一、Qt介绍 1、介绍 Qt是一套程序开发库&#xff0c;但是与MFC&#xff08;依赖于Windows API&#xff09;不同&#xff0c;Qt是跨平台开发库。 Qt获取&#xff1a;[Qt下载地址](https://download.qt.io/archive/qt/)2、Qt安装 QtMinGWSourcesQt ChartsQt Data Visualizatio…

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形)

如何在Android Glide中结合使用CenterCrop和自定义圆角变换&#xff08;图片部分圆角矩形&#xff09; 在Android开发中&#xff0c;使用Glide加载图片时&#xff0c;我们经常需要对图片进行特定的处理&#xff0c;比如裁剪和圆角变换&#xff0c;特别是一些设计稿&#xff0c;…