每日新闻

每日新闻

GoCN每日新闻资讯
有问必答

有问必答

Go相关的问题,技术相关的问题
文章分享

文章分享

技术文章分享,让知识传播给更多的人
招聘应聘

招聘应聘

为Gopher服务的招聘应聘平台

GoCN每日新闻(2019-12-12)

每日新闻逍姚继凯 回复了问题 • 2 人关注 • 1 个回复 • 4784 次浏览 • 4 天前 • 来自相关话题

GoCN每日新闻(2019-12-11)

回复

每日新闻yulibaozi 发起了问题 • 1 人关注 • 0 个回复 • 5216 次浏览 • 5 天前 • 来自相关话题

百度GOPROXY代理服务

开源程序dolfly 发表了文章 • 1 个评论 • 324 次浏览 • 6 天前 • 来自相关话题

百度GOPROXY代理服务https://goproxy.baidu.com/ ...查看全部

百度GOPROXY代理服务


https://goproxy.baidu.com/

Go基础,gRPC合集,算法合集

文章分享阿伟 发表了文章 • 0 个评论 • 69 次浏览 • 9 小时前 • 来自相关话题

2019文章全集(搜索“GoLang那点事”微信公众号阅读) 框 ...查看全部



2019文章全集(搜索“GoLang那点事”微信公众号阅读)



 框架源码分析

elastic-job-lite入门以及架构原理分析
elastic-job-lite 既然去中心化,为何要选举主节点
elastic-job-lite 数据结构分析
elastic-job-lite使用的一点心得和坑
gRPC的特性和背后设计的原则
gRPC的接口描述语言ProtoBuffer
gRPC之GoLang入门HelloWord
gRPC之流式调用原理HTTP2协议分析
gRPC认证的多种方式实践
gRPC拦截器那点事,希望帮到你
gRPC注册中心,常用的注册中心你懂了吗?AP还是CP
gRPC-Server启动做了哪些事,源码分析
gRPC从源码角度分析客户端和服务端一次交互的全流程
gRPC-Go和Java的一次HelloWorld

算法基础

链表-如何高效删除链表的倒数第N个节点
链表-合并两个有序链表,O(1)空间复杂度可否?
链表-删除排序链表中的重复元素,你能想到几种解法?
链表-如何快速找出一个环形链表入环处,O(1)空间复杂度能否?
链表-如快速将两个链表快速相加得到一个新的链表
链表-快速寻找链表中的下一个更大节点?你怎么做
排序-真的了解快排序了吗
排序-归并排序,一种外排序,递归,非递归,磁盘?
排序-线性排序,如何做到百万级数据秒级排序,时间复杂度O(n)?
排序-1亿数据,1M内存,求TOP10,看看堆排序如何实现


Golang基础

为什么学习Go?只要已经开始,永远都不算晚
Go指针,如此轻松掌握,希望有收获
Go中的Package和Module分析
深入Go的Map使用和实现原理
深入Go数组和切片的使用和原理
Go安装后的目录结构和环境变量介绍
深入Go的错误处理机制(一)使用
深入Go的异常错误处理机制(二)理解
Goroutine和Channel的的使用和一些坑以及案例分析
并发模型的一些概念以及设计探讨
Go语言上下文Context包源码分析和实践


GoCN每日新闻(2019-12-15)

回复

每日新闻lwhile 发起了问题 • 1 人关注 • 0 个回复 • 1710 次浏览 • 1 天前 • 来自相关话题

golang写的即时通讯服务器gim

开源程序Alber 发表了文章 • 0 个评论 • 141 次浏览 • 1 天前 • 来自相关话题

简要介绍gim是一个即时通讯服务器,代码全部使用golang完成。主要功能1.离线消息同步2.多业务接入3.单用户多设备同时在线4.单聊,群聊,以及超大群聊天场景 5.支持服务水平扩展 ...查看全部

简要介绍

gim是一个即时通讯服务器,代码全部使用golang完成。主要功能
1.离线消息同步
2.多业务接入
3.单用户多设备同时在线
4.单聊,群聊,以及超大群聊天场景 5.支持服务水平扩展

使用技术:

数据库:Mysql+Redis
组件:grpc+jsoniter+zap

安装部署

1.首先安装MySQL,Redis
2.创建数据库gim,执行sql/create_table.sql,完成初始化表的创建 3.下载代码到你本地 4.修改conf/conf.go配置文件,使之和你本地配置一致
5.分别切换到app的connect和logic目录下,执行go run main.go,启动连接层服务器和逻辑层服务器
6.切换到test目录下,启动测试脚本
7.使用public/util/aes.go的GetToken获取token
8.使用rpc接口发送消息

业务服务器如何接入

1.首先生成私钥和公钥 2.在app表里根据你的私钥添加一条app记录

3.将app_id和公钥保存到业务服务器

4.将用户通过LogicClientExtServer.AddUser接口添加到IM服务器 

5.通过LogicClientExtServer.RegisterDevice接口初始化设备,获取设备id(device_id)

6.将app_id,user_id,device_id用公钥通过公钥加密,生成token,相应库的代码在public/util/aes.go

7.接下来使用这个token,app就可以和IM服务器交互

项目目录介绍

├─ app # 服务启动入口
│   ├── conn # 连接层启动入口
│   └── logic # 逻辑层启动入口
├─ conf # 配置
├─ conn # 连接层服务代码
├─ ligic # 逻辑层服务代码
├─ public # 连接层和逻辑层公共代码
├─ sql # 数据库建表语句
├─ test # 测试脚本
├─ docs # 项目文档

TCP拆包粘包

遵循TLV的协议格式,一个消息包分为三部分,消息类型(两个字节),消息包内容长度(两个字节),消息内容。
这里为了减少内存分配,拆出来的包的内存复用读缓存区内存。
拆包流程:
1.首先从系统缓存区读取字节流到buffer
2.根据包头的length字段,检查报的value字段的长度是否大于等于length
3.如果大于,返回一个完整包(此包内存复用),重复步骤2
4.如果小于,将buffer的有效字节前移,重复步骤1

服务简介

1.connect
维持与客户端的TCP长连接,心跳,以及TCP拆包粘包,消息编解码 2.logic
消息转发逻辑,设备信息,用户信息,群组信息的操作

离线消息同步

用户的消息维护一个自增的序列号,当客户端TCP连接断开重新建立连接时,首先要做TCP长连接的登录,然后用客户端本地已经同步的最大的序列号做消息同步,这样就可以保证离线消息的不丢失。

单用户多设备支持

当用户发送消息时,除了将消息发送目的用户
在DB中,每个用户只维护一个自己的消息列表,但是用户的每个设备各自维护自己的同步序列号,设备使用自己的同步序列号在消息列表中做消息同步

消息转发逻辑

单聊和普通群组采用写扩散,超级大群使用读扩散。
读扩散和写扩散的选型。
首先解释一下,什么是读扩散,什么是写扩散

读扩散

简介:群组成员发送消息时,也是先建立一个会话,都将这个消息写入这个会话中,同步离线消息时,需要同步这个会话的未同步消息
优点:每个消息只需要写入数据库一次就行,减少数据库访问次数,节省数据库空间
缺点:一个用户有n个群组,客户端每次同步消息时,要上传n个序列号,服务器要对这n个群组分别做消息同步

写扩散

简介:就是每个用户维持一个消息列表,当有其他用户给这个用户发送消息时,给这个用户的消息列表插入一条消息即可
优点:每个用户只需要维护一个序列号和消息列表
缺点:一个群组有多少人,就要插入多少条消息,当群组成员很多时,DB的压力会增大

群组简介

普通群组:

1.支持离线消息同步
2.群组成员越多,DB压力越大

超大群组:

1.DB压力不会随着群组成员的人数的增加而增加
2.不支持离线消息同步

核心流程时序图

长连接登录

eaf3a08af9c64bbd.png

离线消息同步

17ae1726b66ee7da.png

心跳

6ea6acf2cd4b956e.png

消息单发

e000fda2f18e86f3.png

消息群发

cee48420191412c3.png

github

https://github.com/alberliu/gim

GoCN每日新闻(2019-12-14)

回复

每日新闻mahuaibo 发起了问题 • 1 人关注 • 0 个回复 • 2147 次浏览 • 2 天前 • 来自相关话题

GoCN每日新闻(2019-12-13)

回复

每日新闻DennisMao 发起了问题 • 1 人关注 • 0 个回复 • 3366 次浏览 • 3 天前 • 来自相关话题

Go 开发者进阶周刊(Dec 2nd)

进阶周刊astaxie 发表了文章 • 0 个评论 • 1198 次浏览 • 3 天前 • 来自相关话题

语言学习(Golang 编程知识与技巧)ž1. ...查看全部

语言学习(Golang 编程知识与技巧)

ž1. 用图说话:Go语言的协程,系统线程以及CPU管理

ž   ž  

诀窍是不要将整个文件加载到内存中,并在继续移动文件指针时继续处理每个单词。这样,我们就可以用最少的内存资源轻松地处理整个文件。并且在文件的不同部分保留多个指针,每个线程同时读取文件的块。

2.GOMAXPROCS和实时更新

3.Go 标准库 encoding/json 真的慢吗?

关于标准库 encoding/json 性能差的问题在很多地方被讨论过,也有很多第三方库在尝试解决这个问题,比如easyjsonjsoniterffjson。但是标准库 encoding/json 真的慢吗?它一直都这么慢吗?

4.译|并发不是并行

并发性是强大的,但它不是并行性的,但它支持并行性,而且它使并行性变得容易。

5.源码阅读 | 短小精悍的 Once 

ž   

Once 即保证某个动作只执行一次。这很好理解,延迟初始化、单例(懒汉式)就是这种场景。

6.go中defer的一个隐藏功能

你可以使用defer在任何函数开始后和结束前执行配对的代码。

7.Go动态作用域变量 

8.GoAdvent2019:使用标准库中的flag包

在本文中,我们将了解如何使用内置标志包编写命令行应用程序。

9.在Go中使用Socket.IO

Websocket是全双工的基于TCP层的通信协议,为浏览器及网站服务器提供处理流式推送消息的方式。它不同于HTTP协议,但仍依赖HTTP的Upgrade头部进行协议的转换。

10.Golang在runtime中的一些骚东西

11.为什么golang没有volatile 

从 java 转 golang 程序员可能会有一个疑问:为什么 golang 没有 volatile 关键字?这样的话如何保证可见性?

12.[译]Go:垃圾回收器是如何监控你的应用的?

Go的垃圾回收器旨在帮助开发者自动清理应用程序的内存。然而每次跟踪内存并清理都会影响程序运行的性能。Go的垃圾回收器旨在清理内存的同时也关注性能,主要是以下几个指标:

  • 当程序暂停的时的两阶段尽可能减少
  • 一次垃圾回收的周期少于10ms
  • 一次垃圾回收操作不能占用超过25%的CPU

工程实践(Go的项目应用实践)

1.Go 生成数据库架构文档

2.Go语言国际电子表格文档格式标准实践

ž   

3.使用Go解析180亿条JSON行

4.Go 项目结构最佳实践

提出一系列选项,可以从中选择如何在新的世界秩序中构建Go应用程序。

5.Go 性能测试惊奇 

6.使用Go,QUIC和Micro建立全球服务网络

分享具体的技术实现细节


7.Go运行时调度程序处理系统调用的巧妙方法 

ž8.Bazel构建Golang项目

Bazel 是一款谷歌开源的非常优秀的构建系统,速度极快、可伸缩、跨语言并且可扩展。使用 Bazel 构建 golang 项目,除了 Bazel 本身特性外,还需要了解针对 golang 的扩展包 rules_go。另外,可以使用 bazel gazelle 来进行一些自动生成的工作。

9.Go项目的GitlabCI缓存

10.Go程序中嵌入静态资源方案选择 

用Go编写的应用程序很容易部署,因为它们是静态编译的。如果您需要管理运行web应用程序所需的一组文件的位置和权限,那么这种优势就会消失。解决方案是将所有必需的文件编译到应用程序二进制文件本身。这可以在Go中通过使用一个包含文件中字节的字符串表示的字节片来实现。

生态拓展(云原生等 Go 生态体系)

1.Gotty源码分析

GoTTY 是一个简单的基于 Go 语言的命令行工具,它可以将你的终端(TTY)作为 web 程序共享。它会将命令行工具转换为 web 程序。

2.一文详解微服务架构

从单体应用到微服务并不是一蹴而就的,这是一个逐渐演变的过程。本文将以一个网上超市应用为例来说明这一过程。

3.把阿里巴巴的核心系统搬到云上,架构上的挑战与演进是什么?

阿里巴巴核心系统作为全球最大规模、峰值性能要求最高的电商交易系统,在 2018 年之前只通过混合云弹性上云方式,为 双11 节约大量成本。直到 2019 年,阿里巴巴实现了核心交易系统全面上云并经历了 双11 峰值的考验。

开源项目(社区新涌现的开源成果)

1.Slog:Go的最小日志记录库

2.Cap’n Proto:Protobuf作者新开发的多语言通用数据交换格式

3.JetStream:NATS内置持久化方案进入TP阶段 

4.Pion:Go实现不发出信号的情况下连接两个WebRTC服务

5.Fvm:Go 打造 Flutter 多版本管理工具:fvm 

 

彩蛋(活动与招聘)

12.24 Gopher Meetup 上海站活动 报名

  • ž   趣头条——长链接方面的实践
  • ž   讯联数据——Go 语言的抽象编程心得
  • ž   TutorABC——远程协同设计
  • ž   蚂蚁金服&携程——dubbogo的现状与未来

01.04 Gopher Meetup Plus深圳站活动 报名

  • ž   Asta——Go在工业领域的应用实践
  • ž   腾讯——Go性能优化之路
  • ž   广发证券——Go与极限性能实践
  • ž   OPPO——云平台存储系统架构设计与容器化实践
  • ž   平安科技——从面试题目到Golang汇编
  • ž   腾讯——如何向Go官方提交代码
  • ž   华为云——KubeEdge:云原生边缘计算平台的Golang实践

【蚂蚁金服】蚂蚁金服研发效能团队招人啦! 详情

Go 学习、Go 进阶、Go 实用工具类

文章分享hwholiday 发表了文章 • 0 个评论 • 363 次浏览 • 5 天前 • 来自相关话题

## learning_tools [源码地址](https://github.com/hwholiday/learning_tools)

### [all_packaged_library](https://github.com/hwholiday/learning_tools/tree/master/all_packaged_library) 里面封装了一些常用的库,有详细的介绍,持续更新
1: base 里面封装mysql,redis,mgo,minio文件储存库S3协议,雪花算法,退出程序方法,redis全局锁,日志库等(插件形式可单独引用)
2: logtool uber_zap日志库封装,可自动切分日志文件,压缩文件
3: perf ppoof小插件
4: push 集成苹果推送,google推送,华为推送
5: quit 优雅的退出程序

### [kafka](https://github.com/hwholiday/learning_tools/tree/master/kafka) (分布式消息发布订阅系统)
1: main 消息队列

### [NATS_streaming](https://github.com/hwholiday/learning_tools/tree/master/NATS_streaming)(分布式消息发布订阅系统--是由NATS驱动的数据流系统)
1: main 消息队列

### [nsq](https://github.com/hwholiday/learning_tools/tree/master/kafka) (分布式实时消息平台)
1: main 消息队列

### [grpc](https://github.com/hwholiday/learning_tools/tree/master/grpc) (grpc学习)
1: bidirectional_streaming_rpc 双向流grpc
2: server_side_streaming_rpc 服务端流grpc,也可以写成客户端流grpc
3: simple_rpc 简单grpc

### [rpc](https://github.com/hwholiday/learning_tools/tree/master/rpc) (rpc学习)
1: main rpc学习

### [prometheus](https://github.com/hwholiday/learning_tools/tree/master/prometheus) (监控报警系统)
1: server Prometheus监控报警系统

### [jaeger](https://github.com/hwholiday/learning_tools/tree/master/jaeger) (jaeger分布式链路追踪)
1: main jaeger分布式链路追踪

### [service_load_balancing](https://github.com/hwholiday/learning_tools/tree/master/service_load_balancing) (负载均衡)
1: fisher_yates_test 添加fisher-yates算法 负载均衡节点

### [service_registration_discovery](https://github.com/hwholiday/learning_tools/tree/master/service_registration_discovery) (服务注册与发现)
1: etcdv3 通过etcd实现服务注册与发现

### [service_req_hystrix](https://github.com/hwholiday/learning_tools/tree/master/service_req_hystrix) (熔断)
1: hystrix 学习并使用熔断(Hystrix

### [service_req_limit](https://github.com/hwholiday/learning_tools/tree/master/service_req_limit) (限流)
1: main 使用带缓存的channel实现限流
2: uber_ratelimit 使用uber_ratelimit实现限流

### [ini](https://github.com/hwholiday/learning_tools/tree/master/ini) (配置文件库)
1: main 配置文件ini的读取,以及自动匹配到结构体里面

### [minio](https://github.com/hwholiday/learning_tools/tree/master/minio) (对象存储服务)
1: minio 对象存储服务使用

### [mysql](https://github.com/hwholiday/learning_tools/tree/master/mysql) (mysql服务器)
1: main 简单的mysql使用

### [redis](https://github.com/hwholiday/learning_tools/tree/master/redis) (redis相关)
1: bloom_filter redis 实现BloomFilter过滤器
2: lock redis实现全局锁
3: pipeline redis事务
4: subscription redis发布订阅

### [mongodb](https://github.com/hwholiday/learning_tools/tree/master/mongodb) (mongodb服务器)
1: mgo.v2 mgo.v2库的基础使用学习
2: mongo-go-driver 官方库的demo,以及事务提交(不能是单节点)

### [gin](https://github.com/hwholiday/learning_tools/tree/master/gin) (web框架gin学习)
1: mvc 模式,swagger文档 可作为基础学习gin

### [jwt](https://github.com/hwholiday/learning_tools/tree/master/jwt) (JSON WEB TOKEN)
1: jwt 学习使用

### [zaplog](https://github.com/hwholiday/learning_tools/tree/master/kafka) (uber zap日志封装)
1: zap 日志封装

### [snow_flake](https://github.com/hwholiday/learning_tools/tree/master/snow_flake) (雪花算法)
1: main 雪花算法

### [encryption_algorithm](https://github.com/hwholiday/learning_tools/tree/master/encryption_algorithm) (双棘轮算法, KDF链,迪菲-赫尔曼棘轮,x3dh)
1: aes ase-(cfb,cbc,ecb)-(128,192,256)加解密方法
2: curve25519 椭圆曲线算法
3: 3curve25519 双棘轮算法,KDF

### [LRU](https://github.com/hwholiday/learning_tools/tree/master/LRU)(缓存淘汰算法)
1: list lru 缓存淘汰算法

### [tcp](https://github.com/hwholiday/learning_tools/tree/master/tcp) (tcp协议实现)
1: 实现网络库,封包,解包 len+tag+data 模式

### [websocket](https://github.com/hwholiday/learning_tools/tree/master/websocket) (websocket协议实现)
1: 实现网络库

### [binary_conversion](https://github.com/hwholiday/learning_tools/tree/master/binary_conversion) (进制转换)
1: 10to36 10进制转36进制
2: 10to62 10进制转62进制
3: 10to76 10进制转76进制
4: binary 用一个int64来描述开关(用户设置很多建议使用)

### [job_worker_mode](https://github.com/hwholiday/learning_tools/tree/master/job_worker_mode) (job_worker模式)
1: worker job_worker模式,可提高系统吞吐量

### [filewatch](https://github.com/hwholiday/learning_tools/tree/master/filewatch) (监控文件变化)
1: main 监控文件变化 可实现自动构建

### [push](https://github.com/hwholiday/learning_tools/tree/master/prometheus) (一个简单的推送服务)
1: main 推送服务

### [goquery](https://github.com/hwholiday/learning_tools/tree/master/goquery) (网页解析工具)
1: main 可以作为爬虫解析网页使用

### [active_object](https://github.com/hwholiday/learning_tools/tree/master/active_object)(并发设计模式)
1: active_object Go并发设计模式之Active Object

### [heap](https://github.com/hwholiday/learning_tools/tree/master/container/heap) (优先级队列)
1: heap 利用heap创建一个优先级队列

### [cli](https://github.com/hwholiday/learning_tools/tree/master/cli) (go命令行交互)
1: main go命令行交互

### [context](https://github.com/hwholiday/learning_tools/tree/master/context) (context包学习)
1: main context包学习

### [err](https://github.com/hwholiday/learning_tools/tree/master/err) (error 相关)
1: main golang 1.13 error 相关

### [interface](https://github.com/hwholiday/learning_tools/tree/master/interface) (interface包学习)
1: main interface包学习

### [syncPool](https://github.com/hwholiday/learning_tools/tree/master/syncPool) (syncPool包学习)
1: main syncPool包学习

### [reflect](https://github.com/hwholiday/learning_tools/tree/master/reflect) (reflect包学习)
1: main reflect包学习

【蚂蚁金服】蚂蚁金服研发效能团队招人啦!

回复

招聘应聘vs小金刚 发起了问题 • 1 人关注 • 0 个回复 • 330 次浏览 • 6 天前 • 来自相关话题

GoCN每日新闻(2019-12-10)

回复

每日新闻傅小黑 发起了问题 • 1 人关注 • 0 个回复 • 6222 次浏览 • 6 天前 • 来自相关话题

GoCN每日新闻(2019-12-16)

回复

文章分享smallfish1 发起了问题 • 1 人关注 • 0 个回复 • 119 次浏览 • 7 小时前 • 来自相关话题