Giter Site home page Giter Site logo

golangweekly's Introduction

golangweekly's People

Contributors

cxjava avatar davidleitw avatar polaris1119 avatar tangtj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

golangweekly's Issues

[自荐] 开源项目 Golang 实现的与 iOS设备 进行通信的跨平台工具库

项目地址

Go Module 版本: https://github.com/electricbubble/gidevice
CLI 版本: https://github.com/electricbubble/gidevice-cli

项目说明

使用 Golang 实现的的与 iOS设备 进行通信的跨平台工具库

所有功能无需越狱
macOS 可直接使用
Windows 需要先安装 iTunes 或者 usbmuxd
Linux 或其他需先安装 usbmuxd

已实现功能:

  • 设备列表查询
  • 开发者镜像挂载
  • App启/停/卸载/安装
  • 端口转发
  • 截图
  • XCTest
  • Syslog
  • CrashReport
  • 沙盒文件访问
  • 定位修改/恢复
  • Pair

部分 CLI 版本使用示例

Devices

$ gidevice list

DeveloperDiskImage

$ gidevice mount -l
# gidevice mount -l -u=39xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7
$ gidevice mount -d=/path/.../DeviceSupport/14.4/
$ gidevice mount /path/.../DeviceSupport/14.4/DeveloperDiskImage.dmg /path/.../DeviceSupport/14.4/DeveloperDiskImage.dmg.signature

Forward

# Default port local=8100 remote=8100
$ gidevice forward
$ gidevice forward -l=9100 -r=9100 -u=39xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7

部分 Go Module 版本使用示例

Devices

package main

import (
	giDevice "github.com/electricbubble/gidevice"
	"log"
)

func main() {
	usbmux, err := giDevice.NewUsbmux()
	if err != nil {
		log.Fatalln(err)
	}

	devices, err := usbmux.Devices()
	if err != nil {
		log.Fatal(err)
	}

	for _, dev := range devices {
		log.Println(dev.Properties().SerialNumber, dev.Properties().ProductID, dev.Properties().DeviceID)
	}
}

DeveloperDiskImage

package main

import (
	"encoding/base64"
	giDevice "github.com/electricbubble/gidevice"
	"log"
)

func main() {
	usbmux, err := giDevice.NewUsbmux()
	if err != nil {
		log.Fatal(err)
	}

	devices, err := usbmux.Devices()
	if err != nil {
		log.Fatal(err)
	}

	if len(devices) == 0 {
		log.Fatal("No Device")
	}

	d := devices[0]

	imageSignatures, err := d.Images()
	if err != nil {
		log.Fatalln(err)
	}

	for i, imgSign := range imageSignatures {
		log.Printf("[%d] %s\n", i+1, base64.StdEncoding.EncodeToString(imgSign))
	}

	dmgPath := "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/14.4/DeveloperDiskImage.dmg"
	signaturePath := "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/14.4/DeveloperDiskImage.dmg.signature"

	err = d.MountDeveloperDiskImage(dmgPath, signaturePath)
	if err != nil {
		log.Fatalln(err)
	}
}

App

package main

import (
	giDevice "github.com/electricbubble/gidevice"
	"log"
	"path/filepath"
)

func main() {
	usbmux, err := giDevice.NewUsbmux()
	if err != nil {
		log.Fatalln(err)
	}

	devices, err := usbmux.Devices()
	if err != nil {
		log.Fatalln(err)
	}

	if len(devices) == 0 {
		log.Fatalln("No Device")
	}

	d := devices[0]

	bundleID := "com.apple.Preferences"
	pid, err := d.AppLaunch(bundleID)
	if err != nil {
		log.Fatalln(err)
	}

	err = d.AppKill(pid)
	if err != nil {
		log.Fatalln(err)
	}

	runningProcesses, err := d.AppRunningProcesses()
	if err != nil {
		log.Fatalln(err)
	}

	for _, process := range runningProcesses {
		if process.IsApplication {
			log.Printf("%4d\t%-24s\t%-36s\t%s\n", process.Pid, process.Name, filepath.Base(process.RealAppName), process.StartDate)
		}
	}
}

Screenshot

package main

import (
	giDevice "github.com/electricbubble/gidevice"
	"image"
	"image/jpeg"
	"image/png"
	"log"
	"os"
)

func main() {
	usbmux, err := giDevice.NewUsbmux()
	if err != nil {
		log.Fatalln(err)
	}

	devices, err := usbmux.Devices()
	if err != nil {
		log.Fatalln(err)
	}

	if len(devices) == 0 {
		log.Fatalln("No Device")
	}

	d := devices[0]

	raw, err := d.Screenshot()
	if err != nil {
		log.Fatalln(err)
	}

	img, format, err := image.Decode(raw)
	if err != nil {
		log.Fatalln(err)
	}
	userHomeDir, _ := os.UserHomeDir()
	file, err := os.Create(userHomeDir + "/Desktop/s1." + format)
	if err != nil {
		log.Fatalln(err)
	}
	defer func() { _ = file.Close() }()
	switch format {
	case "png":
		err = png.Encode(file, img)
	case "jpeg":
		err = jpeg.Encode(file, img, nil)
	}
	if err != nil {
		log.Fatalln(err)
	}
	log.Println(file.Name())
}

SimulateLocation

package main

import (
	giDevice "github.com/electricbubble/gidevice"
	"log"
)

func main() {
	usbmux, err := giDevice.NewUsbmux()
	if err != nil {
		log.Fatalln(err)
	}

	devices, err := usbmux.Devices()
	if err != nil {
		log.Fatalln(err)
	}

	if len(devices) == 0 {
		log.Fatalln("No Device")
	}

	d := devices[0]

	// https://api.map.baidu.com/lbsapi/getpoint/index.html
	if err = d.SimulateLocationUpdate(116.024067, 40.362639, giDevice.CoordinateSystemBD09); err != nil {
		log.Fatalln(err)
	}

	// https://developer.amap.com/tools/picker
	// https://lbs.qq.com/tool/getpoint/index.html
	// if err = d.SimulateLocationUpdate(120.116979, 30.252876, giDevice.CoordinateSystemGCJ02); err != nil {
	// 	log.Fatalln(err)
	// }

	// if err = d.SimulateLocationUpdate(121.499763, 31.239580,giDevice.CoordinateSystemWGS84); err != nil {
	// if err = d.SimulateLocationUpdate(121.499763, 31.239580); err != nil {
	// 	log.Fatalln(err)
	// }

	// err = d.SimulateLocationRecover()
	// if err != nil {
	// 	log.Fatalln(err)
	// }
}

go语言系统测试覆盖率收集利器goc

项目地址: https://github.com/qiniu/goc

在goc以前,业界在做覆盖率收集时,都是采用一种很tricky的方式来做,有种种不优雅的地方。而goc能够让被测程序在运行时就可以收集系统测试覆盖率,当属比较优雅。且此种方式,也为go语言的精准测试方向,展现了无限可能。

笔者写了偏较为详细的介绍文章:https://mp.weixin.qq.com/s/NUApZZnQALkzvZtHFE_8Zw

欢迎收录。

[自荐] 开源项目 electricbubble/gwda 使用 Golang 来控制 iOS 设备

项目说明

Golang 实现 appium/WebDriverAgent 的客户端库,
使得 Gopher 也可以编写代码来控制 iOS iPadOS 设备的各种操作。

类似 tebeka/selenium 控制浏览器的操作行为

项目地址

https://github.com/electricbubble/gwda

部分操作函数展示

package main

import (
	"github.com/electricbubble/gwda"
	"log"
)

func main() {
	// var urlPrefix = "http://localhost:8100"
	// 该函数或许还需要 `iproxy 8100 8100` 先进行设备端口转发
	// driver, _ := gwda.NewDriver(nil, urlPrefix)

	// 通过 USB 直连设备
	driver, _ := gwda.NewUSBDriver(nil)

	x, y := 50, 256

	driver.Tap(x, y)

	driver.DoubleTap(x, y)

	driver.TouchAndHold(x, y)

	fromX, fromY, toX, toY := 50, 256, 100, 256

	driver.Drag(fromX, fromY, toX, toY)

	driver.Swipe(fromX, fromY, toX, toY)

	// 需要 3D Touch 硬件支持
	// driver.ForceTouch(x, y, 0.8)

	var bundleId = "com.apple.Preferences"

	driver.AppLaunchUnattached(bundleId)

	driver.AppDeactivate(2)

	driver.AppTerminate(bundleId)

	driver.AppActivate(bundleId)

	// 重置当前 App 的 相机📷 权限
	// driver.AppAuthReset(gwda.ProtectedResourceCamera)

	driver.SendKeys("hello")

	driver.SiriActivate("What's the weather like today")

	deviceInfo, _ := driver.DeviceInfo()
	log.Println(deviceInfo.Name)

	batteryInfo, _ := driver.BatteryInfo()
	log.Println(batteryInfo.State)

	windowSize, _ := driver.WindowSize()
	log.Println(windowSize)

	// driver.Homescreen()

	driver.PressButton(gwda.DeviceButtonHome)
	driver.PressButton(gwda.DeviceButtonVolumeUp)
	driver.PressButton(gwda.DeviceButtonVolumeDown)
}

[自荐]Go Stream,类似 Java8 的流,.Net 的 Linq

库地址:https://github.com/youthlin/stream
gitee 镜像:https://gitee.com/youthlin/stream
博客介绍:https://youthlin.com/?p=1755
示例:

func ExampleStream_Filter() {
	stream.Of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).
		Filter(func(e types.T) bool {
			return e.(int)%3 == 0
		}).
		ForEach(func(e types.T) {
			fmt.Println(e)
		})
	// Output:
	// 0
	// 3
	// 6
	// 9
}
func ExampleStream_Map() {
	stream.IntRange(0, 5).
		Map(func(t types.T) types.R {
			return fmt.Sprintf("<%d>", t.(int))
		}).
		ForEach(func(t types.T) {
			fmt.Printf("%v", t)
		})
	// Output:
	// <0><1><2><3><4>
}
func TestToMap(t *testing.T) {
	m := stream.IntRange(0, 10).ReduceWith(make(map[int]int), func(acc types.R, t types.T) types.R {
		acc.(map[int]int)[t.(int)] = t.(int) * 10
		return acc
	})
	t.Log(m)
	// Output:
	// map[0:0 1:10 2:20 3:30 4:40 5:50 6:60 7:70 8:80 9:90]
}

[软件更新资讯] Excelize 2.4.0 发布,新增 152 项公式函数支持

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。

Go Excelize v2.4.0

2021年4月19日,社区正式发布了 2.4.0 版本,该版本包含了多项新增功能、错误修复和兼容性提升优化:https://xuri.me/excelize/zh-hans/releases/v2.4.0.html

开源项目 gev :一个轻量、比 net 库更快的基于 Reactor 模式的非阻塞 TCP 网络库

https://github.com/Allenxuxu/gev

gev 是一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库,支持自定义协议,轻松快速搭建高性能服务器。

特点

  • 基于 epoll 和 kqueue 实现的高性能事件循环
  • 支持多核多线程
  • 动态扩容 Ring Buffer 实现的读写缓冲区
  • 异步读写
  • SO_REUSEPORT 端口重用支持
  • 支持 WebSocket
  • 支持定时任务,延时任务
  • 支持自定义协议

一个完全用go实现的私有云iaas平台

https://nanos.cloud/
https://github.com/project-nano
全项目3万多行代码,纯Go开发,不到Openstack的三百分之一。平台部署仅需要三个二进制执行文件即可,最大的模块仅9MB,无需第三方软件或者依赖库,模块升级时直接替换
从Web管理门户、主机监控、镜像克隆到故障切换,自带功能完备,无需安装额外组件。从网络发现、组网到设备选择,全流程自动配置,几乎不需要人工干预。
可靠:Nano使用All or Nothing的事务模式管理所有处理任务,即要么任务彻底成功,要么失败回撤,释放所有资源并且还原状态,彻底避免出现资源泄露或者状态不一致。同时Nano没有使用缓慢而且易出错的数据库存储状态,集群实时检测所有节点状态,同时在内存中自动同步实例数据,确保所有状态和操作及时且有效。
易扩展:Nano所有功能都由REST API接口调用,同时实现了应用与资源服务的分离,用户可以便捷地集成到现有系统,或者直接开发自己应用。基于goroutine的业务逻辑抽象,可以让用户快速扩展业务功能,而无需了解复杂的后台消息驱动机制。

[自荐] 开源项目 go-mysql-transfer 使用Golang实现的MySQL Binlog 增量实时同步工具

简介:
go-mysql-transfer是一款MySQL数据库实时增量同步工具。能够监听MySQL二进制日志(Binlog)的变动,将变更内容形成指定格式的消息,实时发送到接收端。从而在数据库和接收端之间形成一个高性能、低延迟的增量数据同步更新管道。

特性:
1、简单,不依赖其它组件,一键部署

2、集成多种接收端,如:Redis、MongoDB、Elasticsearch、RocketMQ、Kafka、RabbitMQ、HTTP API等,无需编写客户端,开箱即用

3、内置丰富的数据解析、消息生成规则、模板语法

4、支持Lua脚本扩展,可处理复杂逻辑

5、集成Prometheus客户端,支持监控告警

6、集成Web Admin监控页面

7、支持高可用集群部署

8、数据同步失败重试

9、支持全量数据初始化

地址:
https://github.com/wj596/go-mysql-transfer

[推荐] cassandra-web

https://github.com/orzhaha/cassandra-web

cassandra-web 是一个以golang&vue.js为基础,以Web-Base方式架构在网站主机上的cassandra的资料库管理工具,让管理者可用Web介面管理cassandra资料库。

此外也支援scylla,也提供Chart可以使用Helm进行部署。

Features

  • Theme Dark
  • Table Row Prev Next Page
  • Table Row Edit
  • Table Row filter
  • Table Row Delete
  • Table Rown Find
  • Table Definition
  • Table Export
  • Table Import
  • CQL Query

[软件更新资讯] Excelize 2.3.2 发布,Go 语言 Excel 文档基础库,2021 年首个更新

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。

Go Excelize v2.3.2

2021年1月4日,社区正式发布了 2.3.2 版本,该版本包含了多项新增功能、错误修复和兼容性提升优化:https://xuri.me/excelize/zh-hans/releases/v2.3.2.html

[自荐]《白帽子安全开发实战》:go语言在信息安全领域的开发实战

内容简介

《白帽子安全开发实战》介绍了常见的渗透测试工具与防御系统的原理、开发过程及使用方法。大部分系统是用Go语言开发的,部分系统是用OpenResty/Lua语言开发的。这两种语言都有简单易学、开发效率高的特点。 全书共10章,分3篇来组织内容。第1篇为安全开发基础,介绍了常见的安全防护体系、安全开发对白帽子和企业安全建设的重要作用,以及Go语言与OpenResty/Lua语言开发环境的配置等;第2篇为渗透测试工具开发,讲解了扫描器、常见的后门、xiu探器等常见的渗透测试工具的原理、开发和防御方法;第3篇为安全防御系统开发,介绍了恶意流量分析系统、Exchange邮箱安全网关、蜜罐与欺骗防御系统、代理蜜罐、Web应用防火墙与零信任安全网关的原理与开发过程。 《白帽子安全开发实战》适合信息安全从业者、安全产品开发人员、系统管理员、网络安全与信息安全爱好者及开源技术爱好者等阅读学习。

[自荐] ARPC

已加入 awesome-go,在 studygolang.com 发过帖子 RPC 的变革 —— ARPC 项目自荐,详情如下:

RPC 的变革 —— ARPC 项目自荐

项目地址: https://github.com/lesismal/arpc

一、ARPC 示例

echo server

package main

import (
	"log"

	"github.com/lesismal/arpc"
)

func onEcho(ctx *arpc.Context) {
	str := ""
	err := ctx.Bind(&str)
	if err != nil {
		log.Printf("/echo error: %v", err)
		return
	}
	ctx.Write(str)
	log.Printf("/echo: %v", str)
}

func main() {
	svr := arpc.NewServer()

	// register handler
	svr.Handler.Handle("/echo", onEcho)

	svr.Run(":8888")
}

echo client

package main

import (
	"context"
	"log"
	"net"
	"time"

	"github.com/lesismal/arpc"
)

func dialer() (net.Conn, error) {
	return net.DialTimeout("tcp", "localhost:8888", time.Second*3)
}

func main() {
	client, err := arpc.NewClient(dialer)
	if err != nil {
		log.Fatalf("NewClient failed: %v", err)
	}
	defer client.Stop()

	request := "hello"
	response := ""
	// err = client.Call("/echo", &request, &response, time.Second*5)
	err = client.CallWith(context.Background(), "/echo", &request, &response)
	if err != nil {
		log.Fatalf("Call /echo failed: %v", err)
	} else {
		log.Printf("Call /echo Response: \"%v\"", response)
	}
}

二、传统主流的 RPC 框架的局限/不爽

1. 网络交互模式单一,无法支持更丰富的场景

传统主流 RPC 的网络交互主要是 [客户端到服务端,请求-应答] 的模式,比较单一。按照这个模式以及顾名思义“远程过程调用”,其实 HTTP 也算是 RPC 的一种,只是由于其短连接和 HTTP 协议的文本编码格式等原因导致性能和资源的浪费,所以很少有直接把 HTTP 称为 RPC

网络通信的本质是数据收发,客户端和服务端都可以随时主动发送消息给对方,比如推送服务IM游戏等;而且一方发送数据给另一方,有时是不需要回复的,比如VOIP电话,其他不要求强一致的消息广播、推送等。

这里把需要应答的通信定义为 Call ,不需要应答的通信定义为 Notify,则网络交互按照发起方、是否需要应答,可以分为以下四种基本模式:

序号 交互方式 是否需要应答 交互流程
1 Call 需要 客户端发起请求,服务端应答
2 Call 需要 服务端发起请求,客户端应答
3 Notify 不需要 客户端向服务端发出通知/推送
4 Notify 不需要 客户端向服务端发出通知/推送

如此看来,传统主流 RPC 就像是个大内男公务员,因为它只支持了第一种基本模式,只覆盖了25%——甚至说它的网络通讯模式有点不完整,都算是一种褒奖,因为25%的模式支持那是相当不完整。

而只支持请求-应答的模式也限制了很多业务场景,其他更广泛的业务场景比如推送服务IM游戏,我们还需要自定义各种协议。

2. Server端函数调用的写法,函数返回即是调用结束,不够灵活

传统主流 RPC 服务端的写法通常是一个函数,函数返回后框架层把返回值打包发送给客户端作为应答,不支持在该函数中进行异步响应,尤其是golang的 RPC ,有的框架为了代码简单,没有写协程,发送数据时直接写到 Conn ,高并发写时竞争比较明显会增加时延;有的框架默认采用读协程收到数据 one-by-one 的方式处理,存在线头阻塞的问题,有的框架采用每个消息新开一个go协程处理,高并发时协程数量可能暴增、比较浪费,不支持按单个 Method/Router 定制同步或者异步处理,也不支持在 Method/Router handler 内由业务层自主选择同步处理、新开go协程异步或者协程池等异步等方式的处理。

三、关于 ARPC

1. 高性能

想说 ARPC 比其他流行的 golang RPC 性能都好,但是自吹最强好像没有说服力,感谢 rpcx 有做一些主流 RPC 框架的性能对比,老仓库 已经废弃并且那时 ARPC 还没有出生,有兴趣的同学可以到 新仓库 跑下代码进行对比,测试时请注意排除其他程序的干扰。

目前最为主流的 gRPC 因为官方综合考量使用了 HTTP2 ,详情参考 gRPC的动机和设计原则,注定了不能很高性能。而很多 RPC 的业务场景,是基于内部服务集群, HTTP2 的加密流程等显得有些性能浪费。而 ARPC 更注重性能和灵活性,通信协议部分交由业务层决定,通常建议使用 TCP 作为基础通信协议,如有需要,业务层也可以使用 TLSWebsocket 或者 KCP 等 。

2. 网络交互模式全面

上面在 不爽 的部分提到了传统主流 RPC 的不完整, ARPC 当然要有比较全面的支持:

序号 交互方式 是否需要应答 交互流程 传统主流RPC ARPC
1 Call 需要 客户端发起请求,服务端应答
2 Call 需要 服务端发起请求,客户端应答
3 Notify 不需要 客户端向服务端发出通知/推送
4 Notify 不需要 客户端向服务端发出通知/推送

3. 丰富的业务场景支持

由于网络交互模式相对全面,ARPC 可以用于处理多种常规业务场景而不受类似 HTTP 短链接、单向请求-应答方式的限制。比如:

1)推送服务

2)游戏服务

3)聊天服务

4)其他需要长连接、双向、广播等灵活交互方式的业务

4. 写法简单

示例所示, Handler 不采用函数返回即调用结束的形式,写法简单、更像 HTTP Handler 。由于也不强制使用编解码器,甚至不必生成结构化消息或者服务如 Protobuf 的 Message、Service 等,这样也带来一些额外的好处,比如热点的结构化数据,业务层可以在数据更新时序列化一次并缓存起来,有需要时直接发送序列化之后的数据给需求方,避免每次发送给每个连接都需要进行一次序列化的浪费,在高在线量的广播类业务中这点尤为明显。

其他一些 RPC 框架喜欢注册对象的方式,由框架层通过反射去解析符合 Handler 格式的方法进行隐式注册,由于早年被C++的各种语言标准、机制等背后动作玩弄得辛苦,golang项目中希望框架层和业务层都尽量不让用户增加没有必要的心智负担(比如通过对象隐式注册的方式:没有带来性能提升,没有架构设计模块设计的解耦或者其他优化), ARPC 的设计遵循简单、透明的原则,所以像 HTTP 一样进行显式注册,如果有的同行喜欢玩弄语法糖技巧或者被语法糖技巧玩弄,可以自行定制。

5. 更灵活的同步异步

支持单个 Method/Router Handler 级别设置同步或者异步处理,也支持Handler 内由业务层自主控制同步或异步回包、从而针对性定制快/慢接口的协程数量控制与线头阻塞问题处理。

6. 最少依赖

目前如果只使用 ARPC 默认参数,则只使用了golang标准库,不需要依赖其他第三方package。

7. 易扩展

1)网络协议支持:由用户自主决定,服务端实现net.Listener、客户端实现net.Conn即可做为 ARPC 的网络载体,arpc/examples/protocols 已经提供了 KCPQUICTLSUnixSocketUTPWebsocket 等示例,欢迎参考。

2)非结构化的消息体编解码支持:可以直接用 string 、 *string 、 []byte 、 *[]byte 、 error 、 *error 等作为消息体参数。

3)结构化的消息体编解码支持:为了最少依赖, ARPC 默认使用了 encoding/json 作为结构化消息体的编解码器,性能不够强,但是业务层可以很方便地设置使用 json-iter 、 Protobuf 等作为结构化消息地编解码器。

4)消息体编解码中间件支持: ARPC 提供了消息体编解码中间件机制, arpc/extension/middleware/coder 子包实现了 GzipTracer 作为默认示例,有需要的用户可以参考实现自行定制,使用示例在 arpc/examples/middleware/coder

5)Method/Router 的中间件支持: ARPC 提供了类似流行的 golang HTTP 框架的中间件,方便业务层自行扩展, arpc/extension/middleware/router 子包实现了 LoggerRecoverGraceful 作为默认示例,有需要的用户可以参考并实现自行定制,使用示例在 arpc/examples/middleware/router

6)Web JS Client 支持: ARPC 提供了 JS Client 及示例:API示例聊天示例。有了 JS Client , 不需要类似其他 RPC 框架那样部署 HTTP 转换 RPC 的网关,前端可以直接通过 WebsocketARPC 服务进行交互,而且因为 ARPC 已经包括了消息的编解码、Method/Router Handler,比 melody 等只封装了收发数据的基础 websocket 框架更方便。

其他扩展不一一列举了,欢迎有兴趣的同学查看代码或者 New issue 。

8. 更多示例

arpc/examples提供了较为丰富的示例,如 通知广播优雅退出服务注册与发现连接池kcp/quic/tls/websocket等协议支持发布订阅JS Web Chat 等,请见 arpc/examples

9. 其他

个人精力有限,并且 golang 是世界上第二好的编程语言,所以暂时不考虑对其他语言的支持,欢迎 pr、issue 。

【自荐】Beerus: go开发的web解决方案

Beerus是一个用 Go 开发的 web 解决方案,包含一个 web 框架,一个数据库操作框架,一个正在规划中的RPC框架,目前 web 框架和数据库操作框架已经发布了第一个版本。

主要特性如下

  • 路由 可以用形参接收请求参数
  • 可以自动对请求参数进行验证
  • 路由 可以直接返回error给客户端
  • 可以在JSON模式和 非JSON模式之间切换

  • 单表的增删改查 不需要写sql
  • 支持连接池管理,事务管理,支持多数据源
  • 自带分页插件,支持默认countSql 和自定义countSql

官网以及github

https://beeruscc.com
https://github.com/yuyenews

websocket消息推送服务

https://github.com/fanpei0121/balloons-websocket

用于构建实时应用程序的基础架构和API,balloons提供了最好的基础架构和API,以大规模地提供实时体验。向最终用户提供快速稳定的实时消息。让我们处理实时消息传递的复杂性,以便您可以专注于代码。

balloons的实时API向开发人员公开了整个balloons基础架构,从而可以轻松地以任何规模提供实时功能。无需建立和运营基础架构,而将精力集中在交付真正重要的功能上。

Simple API = happy developer :)

[推荐] email-verifier, 一个高性能、多维度检查的 email 地址校验库

Bounce Email 一直是 emails campaigns 的一个痛点问题,结合近期刚发生的 Gmail 不可用 的 case, 在发送 email 前对收件人地址的检查,可以很好地过滤出这部分无效地址,从而提高邮件送达率。email-verifier 主要解决有效地址的校验问题,同时还提供多个维度的 email 检查, 包括 disposable domain 和 free provider。

email-verifier trumail check-if-email-exists freemail
Features 〰️ 〰️ 〰️ 〰️
Disposable email address validation ✅, but not available in free lib
Disposable address autoupdate 🤔
Free email provider check ✅, but not available in free lib
Role account validation
Syntax validation
Email reachability
DNS records validation
Email deliverability
Mailbox disabled
Full inbox
Host exists
Catch-all
Gravatar 🔜 ✅, but not available in free lib
Typo check 🔜 ✅, but not available in free lib
Honeyport dection 🔜
Bounce email check 🔜
Tech 〰️ 〰️ 〰️ 〰️
Provide API 🔜
Free API 🔜
Language Go Go Rust JavaScript
Active maintain
High Performance

[自荐] 开源项目 iouring-go 基于 linux 新特性 iouring 的异步 IO 框架

项目描述

基于 Linux 5.1 新增的异步接口 io_uring ,结合 golang 的异步机制实现的易用的异步 IO 框架

项目地址

https://github.com/Iceber/iouring-go

文章自荐

Go 与异步 IO - io_uring 的思考
【译】高性能异步 IO —— io_uring (Effecient IO with io_uring)

微信公众号文章地址

Go 与异步 IO - io_uring 的思考
【译】高性能异步 IO —— io_uring (Effecient IO with io_uring)

题目推荐

package main

import (
	"fmt"
	"sync"
)

func main(){
	var m sync.Map
	m.Store("address",map[string]string{"province":"江苏","city":"南京"})
        v,_ := m.Load("address")
	fmt.Println(v["province"]) 
}

A,江苏;B,v["province"]取值错误;C,m.Store存储错误;D,不知道

【开源项目】whatchanged - 优雅的变更日志生成器

whatchanged 是 Golang 编写的变更日志生成器

用于生成 Git 仓库的变更日志的工具,并且提供了在线演示,感受一下魔法。

虽然说开源社区中已有一些工具用于生成变更日志,例如 conventional-changelog,但并不太合心意,没法自定义模版,没法生成两个 commit 之间的日志,使用方法没有那么优雅,并且有运行时依赖(nodejs)。

所以用 Golang 写了一个,使用简单,用法优雅,功能强大,支持生成远程仓库的变更日志。

对于我这种有多个开源项目,并且版本迭代的时候,又需要更新日志,而且还懒得写的人来说,简直是福音。并且配备了 Github Action 的集成,在 Github Action 中生成变更日志,并且发布。后续支持 vscode 扩展。

经过一段时间的迭代,目前已在我多个开源项目中投入使用,效果还不错。

go语言500行后台代码实现一轻量级博客系统

后台代码量极小,使用Golang语言,总共不到五百行的后台代码。
后台使用了Golang+ Gin web框架,整个后台代码就一个main.go文件。
前端使用了流行的markdown-it(MarkDown渲染),highlight.js(语法高亮)和mermaid.js(画流程图、时序图等的js库)组件。
留言评论功能,界面爬取自网络大神阮一峰的个人博客界面样式,改了过来。
演示地址链接:http://121.36.253.86/
oschina收录地址:https://www.oschina.net/p/tinybg
博客说明地址:https://blog.csdn.net/yyz_1987/article/details/106228599
开源地址:
https://gitee.com/yyz116/tinybg
https://github.com/yangyongzhen/tinybg
但功能一点也不弱。
功能:
1.文章的分页展示。

2.支持文章中表格,图片的显示和代码的语法高亮。

3.支持文章的无限制分类。

4.支持站点访问量统计,文章浏览量统计,按时间和按点击量排序展示最新文章,最热文章。

5.文章留言评论,最新评论等功能。

安装教程
直接执行 go run main.go即可。
或者go bulid main.go 后,把可执行文件main跑起来即可。无需建库,建表,安装部署超级简单。
使用说明
发布文章就是在电脑上写好md格式的文件,提交到服务器的posts目录。

[软件更新资讯] Excelize 2.4.1 发布,新增并发安全支持

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。

Go Excelize v2.4.1

2021年8月2日,社区正式发布了 2.4.1 版本,该版本包含了多项新增功能、错误修复和兼容性提升优化:https://xuri.me/excelize/zh-hans/releases/v2.4.1.html

Bigfile 1.0.0 一个支持通过 HTTP API,RPC 调用 以及 FTP 客户端管理文件的系统

github: https://github.com/bigfile/bigfile

中文文档:https://learnku.com/docs/bigfile

基本介绍

Bigfile 是使用 Golang 开发的一个文件传输管理系统,支持通过 HTTP APIRPC 调用以及 FTP 客户端管理文件。它构建于许多优秀的开源项目之上,基于数据库实现了一个虚拟的文件组织系统,在 Bigfile 中您可以看到熟悉的文件夹和文件,这种实现方式也是我们权限控制的基础。在底层,Bigfile 将任何文件切分成 1 MB 的文件块存储, 我们称之为 Chunk ,每个 Chunk 依据 sha256 算法计算 Hash 值相互区分,相同的 Chunk 只会被存储一次。 我们用一张图来展示 Bigfile 的设计架构图:

image

Bigfile 是一个多应用系统,您可以创建多个应用,我们称之为 APP ,每个 APP 都有自己的空间, APP 之间相互隔离,互不干扰,互不侵犯。为了安全起见,我们不希望把应用密钥暴露给任何使用某个应用的人,因此每个 APP 应该创建具有某个权限的 Token 去操作文件。您可以限制 Token 仅仅能访问某个目录,设置失效时间,可用次数,只读访问以及限制使用 IP。我们也提供 HTTPSFTPS 以及带有双端验证功能的 RPC 服务,操作简单,使用方便,您唯一要做的使用我们提供的命令行工具生成证书,并且在启动服务的时候指定证书即可。

下载二进制包

进入 https://github.com/bigfile/bigfile/releases 页面下载对应平台最新的二进制包。

MacOS

在 MacOS 上安装,除了其他选择之外,还可以通过 brew 直接安装:

brew install bigfile/tap/bigfile

snapcraft

也可以通过 snapcraft 安装:

sudo snap install --classic bigfile

deb/rpm:

release page 下载 .dep 或者 .rpm 文件,通过命令 dpkg -i 或者 rpm -i 安装

scoop

在 Windows 除了通过二进制安装,也可以通过 scoop 安装:

$ scoop bucket add bigfile https://github.com/bigfile/bigfile-bucket.git
$ scoop install bigfile

从源码安装

如果您是 Go 语言开发者,可以下载源码直接运行:

go get -u -v github.com/bigfile/bigfile

go run artisan/bigfile.go --version

或者您也可以直接安装在本地,这将在您的 ${GOPATH}/bin 目录下生成一个名为 artisan 的可执行文件,Windows 平台下将会生成 artisan.exe

go install -a -v github.com/bigfile/bigfile/artisan

或者可以直接在源码目录下构建,这会在当前目录下生成一个名为 bigfile 的可执行文件,Windows 平台下将会生成 bigfile.exe

go build artisan/bigfile.go

生成证书

生成证书的入口在 rpc 子命令下,但是可以用在任何你想用的地方:

bigfile rpc:make-cert

image

这条命令过后,会在主机上相应的目录下生成 6 个证书文件。以 ca 为前缀的表示证书机构,只有证书机构才具有资质进行签发证书,我们生成的 ca 证书是自签名证书,自签名证书一般不被系统所信任,不过你可以将它加到系统的可信任证书库中。以 server 为前缀的表示服务器证书,服务器证书可以添加可信任 IP,通过参数 --server-cert-ips 指定。以 client 为前缀的用于客户端,这个主要用在 RPC 服务中实现双端验证。.pem 为后缀的表示经过 PEM 编码的证书文件,.key 为后缀的表示证书密钥。

启动 HTTP Server

bigfile http:start --cert-file server.pem --cert-key server.key

image

启动 RPC Server

bigfile rpc:start --ca-cert ca.pem --server-cert server.pem --server-key server.key

image

启动 FTP Server

bigfile ftp:start --tls-enable --cert-file server.pem --key-file server.key

image

【自荐】业务级访客限流库(非网关级如go.uber.org/ratelimit)

在网站的运营中,经常会遇到需要对用户访问次数做限制的情况,比如非常典型的是对于某些付费访问服务,需要对访问频率做比较精确的限制,比如单个用户(或者每个IP)地址每天只允许访问多少次,然后每小时只允许访问多少次等等,ratelimit就是针对这种情况而设计。

不同于网关级限流(包括go.uber.org/ratelimit漏桶限流以及github.com/juju/ratelimit令牌桶限流),本限流方案为业务级限流,适用于平台运营中,精细化的按单个用户,按IP等限流,为业内rdeis滑动窗口限流方案的纯GO替代方案,并且支持持久化,可定期把历史数据备份到本地磁盘,程序重启也可保留之前的访问记录。

github.com/yudeguang/ratelimit底层用一个大小能自动伸缩的环形队列来存储用户访问数据,拥有较高性能的同时还非常省内存,同时拥有高达1000W次/秒的能力(redis约10W次/秒)。作为对比,与用redis的相关数据结构来实现用户访问控制相比,其用法相对简单。

项目地址:https://github.com/yudeguang/ratelimit

go-featureprocessing

Hi,

I see that you refer one of my projects go-ml-benchmarks. If so, would make sense also to mention go-featureprocessing that is used in one of the benchmarks. Please refer to github.com/nikolaydubina/go-featureprocessing for description and pictures. Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.