获得徽章 0
概览
Kitex 架构设计、框架特点、框架性能。
CloudWeGo-Kitex
Kitex[kaɪt’eks] 字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选择。

架构设计
image

框架特点
高性能

使用自研的高性能网络库 Netpoll,性能相较 go net 具有显著优势。

扩展性

提供了较多的扩展接口以及默认扩展实现,使用者也可以根据需要自行定制扩展,具体见下面的框架扩展。

多消息协议

RPC 消息协议默认支持 Thrift、Kitex Protobuf、gRPC。Thrift 支持 Buffered 和 Framed 二进制协议;Kitex Protobuf 是 Kitex 自定义的 Protobuf 消息协议,协议格式类似 Thrift;gRPC 是对 gRPC 消息协议的支持,可以与 gRPC 互通。除此之外,使用者也可以扩展自己的消息协议。

多传输协议

传输协议封装消息协议进行 RPC 互通,传输协议可以额外透传元信息,用于服务治理,Kitex 支持的传输协议有 TTHeader、HTTP2。TTHeader 可以和 Thrift、Kitex Protobuf 结合使用;HTTP2 目前主要是结合 gRPC 协议使用,后续也会支持 Thrift。

多种消息类型

支持 PingPong、Oneway、双向 Streaming。其中 Oneway 目前只对 Thrift 协议支持,双向 Streaming 只对 gRPC 支持,后续会考虑支持 Thrift 的双向 Streaming。

服务治理

支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。

代码生成

Kitex 内置代码生成工具,可支持生成 Thrift、Protobuf 以及脚手架代码。
展开
评论
**范例 Dockerfile:**
本文皆以此Dockerfile做范例

```
FROM golang:latest
WORKDIR /project_name
COPY . .
RUN go mod download
RUN go build -o main .
EXPOSE 3000
CMD ["./main"]
```

**第一行:**
指定基底image
这里指定的是golang官方的最新image

```
FROM golang:latest
```

**第二行:**
指定项目文件夹
也就是整个项目的根目录

```
WORKDIR /project_name
```

**第三行:**
将项目内所有程式码复制到docker根目录

```
COPY . .
```

**第四行**
RUN用于执行指令
这里按照go.mod
安裝项目所需套件

```
RUN go mod download
```

**第五行**
RUN用于执行指令
将项目编译成可记性文件

```
RUN go build -o main .
```

**第六行**
指定项目对外port号
记得要和项目內所指定的port号一样

```
EXPOSE 3000
```

**第七行**
执行已编译好的2进制文件

```
CMD ["./main"]
```

## [](hackmd.io "Build-amp-Run-Container")Build & Run Container

**Build:**
用上面所写的Dockerfile
build一个叫做user_name/project_name的image

```
docker build -t user_name/project_name .
```

**Run:**
按照刚刚bulid好的image
run一个container
并且将port号绑定本机的port号

```
docker run --rm -d -p 3000:3000 user_name/project_name
```
展开
评论
Go 语言最适合的地方
没有一种语言适合所有工作,但有些语言比其他语言适合更多的工作。
Go 在开发以下应用程序类型方面表现最出色。
一、云原生开发
Go 的并发性和网络功能以及高度的可移植性使其非常适合构建云原生应用程序。事实上,Go 被用来构建云原生计算的几个基石,包括Docker、Kubernetes和Istio。
二、分布式网络服务
网络应用程序的生存和消亡取决于并发性,而 Go 的原生并发特性(主要是goroutine 和 通道)非常适合此类工作。因此,许多 Go 项目都是用于网络、分布式功能和云服务: API、 Web 服务器、 Web 应用程序的最小框架等。
三、实用程序和独立工具
Go 程序编译为具有最少外部依赖的二进制文件。这使得它们非常适合创建实用程序和其他工具,因为它们启动速度快并且可以轻松打包以进行重新分发。一个例子是 名为 Teleport 的访问服务器(用于 SSH 等)。通过从源代码编译或下载预构建的二进制文件,Teleport 可以快速轻松地部署在服务器上。
展开
评论
一、Monorepo 介绍
Monorepo 是一种项目代码管理方式,指单个仓库中管理多个项目,有助于简化代码共享、版本控制、构建和部署等方面的复杂性,并提供更好的可重用性和协作性。Monorepo 提倡了开放、透明、共享的组织文化,这种方法已经被很多大型公司广泛使用,如 Google、Facebook 和 Microsoft 等。

二、Monorepo 演进
阶段一:单仓库巨石应用, 一个 Git 仓库维护着项目代码,随着迭代业务复杂度的提升,项目代码会变得越来越多,越来越复杂,大量代码构建效率也会降低,最终导致了单体巨石应用,这种代码管理方式称之为 Monolith。

阶段二:多仓库多模块应用,于是将项目拆解成多个业务模块,并在多个 Git 仓库管理,模块解耦,降低了巨石应用的复杂度,每个模块都可以独立编码、测试、发版,代码管理变得简化,构建效率也得以提升,这种代码管理方式称之为 MultiRepo。

阶段三:单仓库多模块应用,随着业务复杂度的提升,模块仓库越来越多,MultiRepo这种方式虽然从业务上解耦了,但增加了项目工程管理的难度,随着模块仓库达到一定数量级,会有几个问题:跨仓库代码难共享;分散在单仓库的模块依赖管理复杂(底层模块升级后,其他上层依赖需要及时更新,否则有问题);增加了构建耗时。于是将多个项目集成到一个仓库下,共享工程配置,同时又快捷地共享模块代码,成为趋势,这种代码管理方式称之为 MonoRepo。
展开
评论
golang 中的调度器的变化及其作用
调度器,scheduler
调度器就像是一个管理者,负责安排事项,负责调度不同人在指定时间在某个岗位上完成自己的价值交付
正如 linux 调度器一样,将就绪的进程调度成执行状态,或者将执行状态的进程,打断,变成阻塞状态,再变成就绪状态
比如说一个经典的单进程 和 多进程 / 多线程的操作系统,
我们可以看到在单进程系统中,只需要无脑的将进程串行排列好, CPU 会串行去执行任务,如果遇到进程 1 阻塞的情况,其他进程也没有办法被 cpu 执行,那么进程 2 ,进程 3 ,进程 4 就都要等待前面的进程完成执行完毕,才能到自己执行
可以看出单进程对于 CPU 的使用过于任性,浪费 CPU 的资源,演进到多进程 / 多线程操作系统的时候,就出现了调度器
上图中我们可以对比看到,在多进程 / 多线程的操作系统中,cpu 的时间片被分割的更加的小,对于 cpu 资源的利用率是大大的增加了,因为 cpu 可以在进程 1 阻塞的时候,切换去执行进程 2
例如,当进程 1 执行过程中,发生了阻塞,那么调度器就会就会将 cpu 切换到进程 2 中进行执行,同理,进程 2 阻塞的时候, cpu 就会被切换到进程 3 进行执行,当然,这就看是哪个进程先抢到 cpu 资源了
可以看到,调度器在这里的作用就是最大限度的利用上 CPU 的资源,管理进程在 CPU 上按照一定的的顺序执行任务,就好比一个优秀的管家可以合理安排好不同的员工在指定的时间上专注的处理某项事务
那么 golang 的调度器是不是也是和 linux 中的调度器有着想通之处呢?
来看看调度器在 golang 中的具体作用是干啥的
在 golang 中,调度器的实现简单来看实际上是由协程和线程按照一定的逻辑来组合起来的,其实也是扮演着一个协调和调度的作用,调度的对象是协程和线程,协程是需要被调度到线程中来运行的,这个动作就是调度器干的
通常用 G 来表示协程
用 M 来表示线程
展开
评论
Esbuild 是什么:
ESbuild 是一个类似webpack构建工具。它的构建速度是 webpack 的几十倍。




为什么这么快 ?
js是单线程串行,esbuild是新开一个进程,然后多线程并行,充分发挥多核优势

go是纯机器码,肯定要比JIT快

不使用 AST,优化了构建流程。(也带来了一些缺点,后面会说)

ESbuild 使用介绍
ESbuild 文档: esbuild - API​

Esbuild 有命令行 ,js 调用, go 调用三种使用方式。这里主要讲利用 js 调用的方式。
展开
评论
一、Pinia是什么?
Pinia 是 Vue 的存储库,它允许跨组件/页面共享状态。实际上,pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia,而没有取名Vuex,所以大家可以直接将pinia比作为Vue3的Vuex。

二、为什么要使用pinia?
pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑减少了我们工作量。

pinia中action支持同步和异步,Vuex不支持

良好的Typescript支持,毕竟我们Vue3都推荐使用TS来编写,这个时候使用pinia就非常合适了

无需再创建各个模块嵌套了,Vuex中如果数据过多,我们通常分模块来进行管理,稍显麻烦,而pinia中每个store都是独立的,互相不影响。

体积非常小,只有1KB左右。

pinia支持插件来扩展自身功能。

支持服务端渲染。
展开
评论
Beego是一个使用Go语言开发的应用Web框架,框架开始于2012年,目的是为大家提供一个高效率的Web应用开发框架,该框架采用模块封装,使用简单,容易学习。对程序员来说,beego掌握起来非常简单,只需要关注业务逻辑实现即可,框架自动为项目需求提供不同的模块功能。

beego可以用来快速开发API、Web、后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado、sinatra、flask这三个框架,但是结合了Go本身的一些特性(interface、struct继承等)而设计的一个框架。

特性

简单化:支持RESTful风格、MVC模型;可以使用bee工具类提高开发效率,比如监控代码修改进行热编译,自动化测试代码以及自动化打包部署等丰富的开发调试功能。
智能化:beego框架封装了路由模块、支持智能路由、智能监控,并可以监控内存消耗,CPU使用以及goroutine的运行状况,方便开发者对线上应用进行监控分析。
模块化:beego根据功能对代码进行了解耦封装,形成了Session、Cache、Log、配置解析、性能监控、上下文操作、ORM等独立的模块,方便开发者进行使用
高性能:beego采用Go原生的http请求,goroutine的并发效率应付大流量的Web应用和API引用。
展开
评论
echo web框架是go语言开发的一种高性能,可扩展,轻量级的web框架。
echo框架真的非常的简单,几行代码就可以启动一个高性能的http服务端。

如果你只是测试返回hello world这种简单逻辑,普通的低配服务器,每秒扛个万八千QPS没什么问题,这个主要跟服务器配置有关,当然实际应用中的业务逻辑不会是hello world那么简单,业务不同,系统设计不同吞吐量肯定不一样。

echo框架默认其实只包含了MVC框架的C部分,就是负责url路由和控制器部分。至于V视图部分和M数据操作部分可以随意使用自己喜欢的工具库来操作。

二、安装
安装echo包

go get github.com/labstack/echo/
三、如何开始一个Http Server。
创建httpserver.go文件,代码如下:

package main

import (
"net/http"
//导入echo包
"github.com/labstack/echo"
)

func main() {
//实例化echo对象。
e := echo.New()

//注册一个Get请求, 路由地址为: /hello 并且绑定一个控制器函数, 这里使用的是闭包函数。
e.GET("/hello", func(c echo.Context) error {
//控制器函数直接返回一个字符串,http响应状态为http.StatusOK,就是200状态。
return c.String(http.StatusOK, "hello echo")
})

//启动http server, 并监听8080端口,冒号(:)前面为空的意思就是绑定网卡所有Ip地址,本机支持的所有ip地址都可以访问。
e.Start(":8080")
}
运行http server

$ go run httpserver.go
通过浏览器访问 http://localhost:8080/hello 浏览器会显示: hello echo

echo web框架的代码非常简洁,就几行代码一个http server的主要的初始化工作就搞定了,只要添加自己的业务代码就行。
展开
评论
Go框架的DIY实践

架构设计:
在设计框架的架构前,我们需要先考虑以下几个问题:
a) 框架提供哪些服务以及提供的服务如何组合。
b) 框架采用什么协议实现。
c) 框架的具体架构应该是什么样的。
例如,我们可以选用RESTful API作为协议,然后采用以中间件为核心的架构。我们可以将核心代码都封装在一个 core 模块里,并在 core 模块中提供一些基本的服务。然后,我们可以在中间件的服务上,封装出一些更为复杂的服务。
实现路由:
路由是任何Web框架的核心功能。对于一个自己实现的框架而言,实现路由是一个不可或缺的过程。最常见的方式是,为每个接口添加一个路由,并使用map来存储路由与处理函数的映射关系。
中间件的设计与实现:
框架的中间件负责拦截请求并对请求进行处理。我们需要实现一个中间件处理链,当我们接到一个请求时,按照开发者在代码中定义好的中间件链顺序执行这些中间件,最终返回请求的处理结果。
数据的校验与绑定:
数据校验是保证后端接口数据合法性的基本要求。在我们自己实现的框架中,我们可以通过结构体的tag来定义某个域的取值范围,例如长度、正则表达式等等。在请求到达接口以后,实现我们提供的校验方法,进行数据的校验。
异常处理:
在进行大型项目开发时,异常处理是必不可少的。在框架的实现中我们可以定义统一访问异常,从而保证代码的整洁性。
展开
评论
package.json 是什么
我们在项目的根目录下都会看见有package.json,这个文件究竟有什么用呢?它包含关于项目的使用人可读元数据,比如项目名称和说明,以及功能元数据,比如程序包的版本号和程序所需的依赖项列表。

有什么用?
package.json 是配置和描述如何与程序交互和运行的中心。 npm CLI (和yarn )用它来识别你的项目,并了解怎样去处理项目的依赖关系。package.json 文件可以用npm启动项目,运行脚本、安装依赖项、发布到NPM注册表以及许多其他有用的任务。
展开
评论
为什么要用 Hooks
使用 Hooks 有 2 大原因:

简化逻辑复用;
让复杂组件更易理解。
1. 简化逻辑复用
在 Hooks 出现之前,React 必须借用高阶组件、render props 等复杂的设计模式才能实现逻辑的复用,但是高阶组件会产生冗余的组件节点,让调试更加复杂。

Hooks 让我们可以在无需修改组件结构的情况下复用状态逻辑,下文会详细介绍自定义 Hooks 的用法。

2. 让复杂组件更易理解
在 class 组件中,同一个业务逻辑的代码分散在组件的不同生命周期函数中,而 Hooks 能够让针对同一个业务逻辑的代码聚合在一块,让业务逻辑清晰地隔离开,让代码更加容易理解和维护。
展开
评论
在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、
浮点型和复数类型) 、布尔类型、字符串类型等。
所谓字面常量(literal) ,是指程序中硬编码的常量,如:
-12
3.14159265358979323846 // 浮点类型的常量
3.2+12i // 复数类型的常量
true // 布尔类型的常量
"foo" // 字符串常量
在其他语言中,常量通常有特定的类型,比如12在C语言中会认为是一个int类型的常量。
如果要指定一个值为12的long类型常量,需要写成-12l,这有点违反人们的直观感觉。Go语言
的字面常量更接近我们自然语言中的常量概念,它是无类型的。只要这个常量在相应类型的值域
范围内,就可以作为该类型的常量,比如上面的常量-12,它可以赋值给int、uint、int32、
int64、float32、float64、complex64、complex128等类型的变量。
展开
评论
下一页
个人成就
文章被点赞 3
文章被阅读 688
掘力值 55
收藏集
0
关注标签
0
加入于