Go实现自定义语言的基础 - goyacc简易入门

0x01 自言自语一直就对解析文档,比较感兴趣,一直没深入研究,只停留在仅知道 Lex & yacc 和 antlr 的名词阶段,最近看了go-zero的api解析器,觉得甚好,是时候花时间学习一下了。 简单看了go-zero发现是自己实现了词法分析、语法解析,这不符合我的一贯偷懒作风,所以并未其源码开始学习。既然用golang那么他自带的goyacc就是我学习的不二之选。当然你可能会听说Lex&yacc 已经很古老了,antlr更先进一点。但是既然goyacc能成为golang官方工具,那么肯...阅读全文

51CTO博客 2021-04-17 22:46:58 mob604756f0bbf4

还在担心服务挂掉?Sentinel Go 让服务稳如磐石

背景 微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战。 在生产环境中大家可能遇到过以下不稳定的情况: 大促时瞬间洪峰流量导致系统超出最大负载,load 飙高,系统崩溃导致用户无法下单 “黑马”热点商品击穿缓存,DB 被打垮,挤占正常流量 调用端被不稳定第三方服务拖垮,线程池被占满,调用堆积,导致整个调用链路卡死 这些不稳定的场景可能会导致严重后果,但很多时候我们又容易忽视这些与流量...阅读全文

51CTO博客 2021-04-17 22:08:51 mob604756f0bbf4

Nacos Go微服务生态系列(一) | Dubbo-go 云原生核心引擎探索

作者:李志鹏, Github账号:Lzp0412,开源社区爱好者,Nacos Committer,Nacos-SDK-go作者,现就职于阿里云云原生应用平台,主要参与服务发现、CoreDNS、ServiceMesh相关工作,负责推动Nacos Go微服务生态建设。 近几年,随着Go语言社区逐渐发展和壮大,越来越多的公司开始尝试采用Go搭建微服务体系,也涌现了一批Go的微服务框架,如go-micro、go-kit、Dubbo-go等,跟微服务治理相关的组件也逐渐开始在Go生态发力,如Sentine...阅读全文

51CTO博客 2021-04-17 22:06:17 mob604756f0bbf4

Go chassis 微服务开发框架实战系列(一)

什么是 Go chassisgo chassis 是一个 go 语言微服务开发框架,专注于云原生应用的开发,我们主要的使用场景是云服务开发。我们将自己在云服务开发过程中沉淀的能力融入到了开发框架中,以帮助开发团队快速编写云原生应用。 文章目标本文介绍我们的设计理念和目标,为何 go chassis 会诞生。后面的系列文章会着重介绍使用方法,项目实战。对于微服务架构模式,云原生要素,为什么选择 go 语言等将不再过多赘述。 诞生背景公司开发云服务,要构建健壮,韧性,安全,高可靠的云服务,必然有大量...阅读全文

51CTO博客 2021-04-17 22:02:58 mob604756f0bbf4

难以遏制的人因差错 -Go 的日志工具之痛

Go的日志工具之痛go生态一直没能有一个强势的日志工具,优秀的日志有zap,zerolog,但是API各有各的设计理念,自然是不兼容的 openlog和seclog的初衷倒退5年,go的日志工具更加不成熟,我们folk lager项目,进行安全整改后成为自己的项目https://github.com/go-chassis/seclog 然而他的老旧的API设计已经被我诟病很久。就是以f为结尾的函数调用 openlogging.GetLogger().Debugf("shuffler %d %d...阅读全文

51CTO博客 2021-04-17 21:48:46 mob604756f0bbf4

你还在手撕微服务?快试试 go-zero 的微服务自动生成

0. 为什么说做好微服务很难?要想做好微服务,我们需要理解和掌握的知识点非常多,从几个维度上来说: 基本功能层面 并发控制&限流,避免服务被突发流量击垮 服务注册与服务发现,确保能够动态侦测增减的节点 负载均衡,需要根据节点承受能力分发流量 超时控制,避免对已超时请求做无用功 熔断设计,快速失败,保障故障节点的恢复能力 高阶功能层面 请求认证,确保每个用户只能访问自己的数据 链路追踪,用于理解整个系统和快速定位特定请求的问题 日志,用于数据收集和问题定位 可观测性,没有度量就没有优化 对于其中每...阅读全文

51CTO博客 2021-04-17 21:47:04 mob604756f0bbf4

Pkg.go.dev 开源了

我们很高兴地宣布,pkg.go.dev的代码库 现已开放源代码。 代码库位于 go.googlesource.com/pkgsite 上(阅读原文获取) ,并镜像到 github.com/golang/pkgsite。我们将继续使用Go问题跟踪器来跟踪 与pkg.go.dev相关的反馈。 贡献如果您有兴趣对与pkg.go.dev相关的任何问题做出贡献 ,请查看我们的 贡献指南(https://go.googlesource.com/pkgsite/+/refs/heads/master/CONT...阅读全文

51CTO博客 2021-04-17 21:26:22 mob604756f0bbf4

JetBrains 发布 2020 年 Go 语言调查报告

有63%的人Go主要用于工作,28%的人用于个人项目 大多数人同时使用多个版本的Go,我估计是要维护不同版本下的项目,下面这个数据印证了这个猜测。 71%的Go开发者主要用来做微服务,排在Scala之后。 GOPATH影响深远啊,74%的人还是只使用一个全局GOPATH,其实最佳实践是分两个,一个用来下载第三方库,另一个用来做项目,但是目前引入新的module之后基本上不用GOPATH了。 版本管理基本上都已经切换到modules,dep和godep紧跟其后,我估计后面这些都是老版本维护工具了 ...阅读全文

51CTO博客 2021-04-17 21:25:29 mob604756f0bbf4

涂鸦智能 dubbo-go 亿级流量的实践与探索

dubbo 是一个基于 Java 开发的高性能的轻量级 RPC 框架,dubbo 提供了丰富的服务治理功能和优秀的扩展能力。而 dubbo-go 在 java 与 golang 之间提供统一的服务化能力与标准,是涂鸦智能目前最需要解决的主要问题。本文分为实践和快速接入两部分,分享在涂鸦智能的 dubbo-go 实战经验,意在帮助用户快速接入 dubbo-go RPC 框架,希望能让大家少走些弯路。另外,文中的测试代码基于 dubbo-go版本 v1.4.0。 dubbo-go 网关实践 dubb...阅读全文

51CTO博客 2021-04-17 21:23:57 mob604756f0bbf4

[斗鱼]没人比我更懂微服务--Go微服务框架Jupiter

项目开源地址: https://github.com/douyu/jupiter Jupiter 是斗鱼开源的,面向服务治理的Golang微服务框架,以开发效率和治理效率为核心目标,从统一开发规范、完善监控埋点、降低开发难度等多个维度来帮助Gopher开发高性能、高可靠性的微服务框架。 Jupiter在斗鱼内部经过三年打磨、几百个服务的线上验证,在多种应用场景中适配、历经多次基础架构迭代,有效地保障了服务应用的快速迭代、精确监控,并在异地多活、容器云、混沌工程等基础建设中,支撑服务的平滑迁移、平...阅读全文

51CTO博客 2021-04-17 21:18:49 mob604756f0bbf4

dubbo-go 中 REST 协议实现

在社区小伙伴们的努力下,Apache/dubbo-go 在 v1.4.0 中支持 REST 协议了。 什么是 REST 协议 REST 是 REpresentational State Transfer(表述性状态转移)的简写,是一种软件架构风格。虽然 REST 架构风格不是一定要基于 HTTP 协议进行传输,但是因为 HTTP 协议的通用性和易用性,现在越来越多的 web 服务采用基于 HTTP 协议实现 RESTful 架构。 在 dubbo-go 中的 REST 协议指的是一种基于 HTT...阅读全文

51CTO博客 2021-04-17 21:16:51 mob604756f0bbf4

Etcd使用go module的灾难

最近几个月,或者最近一年,使用etcd做开发的朋友,如果你开启了go module的功能的话,没有出现翻车的现象吗?或者go get -u .更新一下项目依赖试试看。 因为我使用visual studio code的方式是打开整个GOPATH路径,而gopls对于整个GOPATH并不友好,非常的慢,所以我设置了全局变量GO111MODULE=off,还是采用传统的老的库依赖方式。 但是我并不排斥使用go module,并且觉得它对解决库依赖的冲突至关重要,所以我一般在项目中也会是不是的开启go ...阅读全文

51CTO博客 2021-04-17 21:13:53 mob604756f0bbf4

记一次对 dubbo-go-hessian2 的性能优化

dubbo-go-hessian2 是一个用 Go 实现的 hessian 协议 v2.0 版本的序列化库。从项目名称里可以看到主要用在 dubbo-go 这个项目里。hessian 协议作为 dubbo 的默认协议,因此对性能有比较高的要求。立项譬如有网文 基于Go的马蜂窝旅游网分布式IM系统技术实践 把 dubbo-go 与其他 RPC 框架对比如下: 有鉴于此,社区便开始组织部分人力,启动了对 dubbo-go 性能优化【同时也欢迎上文作者到钉钉群 23331795 与我们社区交流】。考察...阅读全文

51CTO博客 2021-04-17 21:07:31 mob604756f0bbf4

2020 中国 Go 开发者调查报告

2020 年初,看过Go官方在过去一年里面的总结,GopherChina 也通过网络的方式对中国的 Go 开发者进行了一次深度调查。本次调查旨在关注 Go 在中国的最新趋势并总结 Go 开发的发展情况。 来自全国数十个城市的 1300 多名开发人员参与了此次调查,帮助我们勾勒出一个尽可能准确的中国 Go 社区的全景图。调查内容涵盖 Go 在中国的使用、开发类型、框架、库、技术、开发工具、就业等方面。 01 Go使用情况 Go 作为主要语言 vs 第二语言 在我们的调查中,61.5%的 Go 用户...阅读全文

51CTO博客 2021-04-17 21:04:13 mob604756f0bbf4

gops 是怎么和 Go 的运行时进行交互的?

原文地址:https://medium.com/a-journey-with-go/go-how-does-gops-interact-with-the-runtime-778d7f9d7c18 本文基于 Go 1.13 和 gops 0.3.7. gops 旨在帮助开发人员诊断 Go 流程并与之交互。它提供了跟踪运行中的程序几秒钟的功能,可以通过获取 CPU 配置文件 pprof,甚至可以直接与垃圾收集器进行交互。 发现gops 提供发现服务,该服务能够列出计算机上运行的 Go 进程。gops...阅读全文

51CTO博客 2021-04-17 21:00:21 mob604756f0bbf4

Golang 中字典的 Comma Ok 是如何实现的

本文字数:2297 字 精读时间:6 分钟 也可在 3 分钟内完成速读 众所周知,Golang 中函数的返回值的数量是固定的,而不是像 Python 中那样,函数的返回值数量是不固定的。 如果我们把 Golang 中对 map 的取值看作是一个函数的话,那么直接取值和用 comma ok 方式取值的实现就变得很意思。 Golang 中 map 的取值方式 v1, ok := m["test"] v2 := m2["test"] 先看看汇编是如何实现的。 package main import "...阅读全文

51CTO博客 2021-04-17 20:47:48 mob604756f0bbf4

全球首发特性,goproxy.io 支持海外私有库代理了

介绍goproxy.io 是 Go 语言公共的镜像代理服务,在中国乃至全球有众多 Go 语言开发者使用。现在给大家介绍一下 goproxy.io Private 功能,通过这个功能,开发者可以同时缓存并加速自己海外的私有仓库和公有仓库。 使用指南首先,登录 https://user.goproxy.io,通过 github OAuth 进行登录,无需注册, 点击授权后,登录成功, 如下图所示。 登录成功后,点击 “New Repo” 新增自己的私有仓库授权,将 goproxy.io 生成的公钥添...阅读全文

51CTO博客 2021-04-17 20:49:53 mob604756f0bbf4

Play with Go

在开始学习 Go 语言之后,我发现 Go 语言对于初学者实在是太友好了。 Go 语言的文档很全面,可以说,在开始学习 Go 语言的时候,直接通过 Go 的文档开始就可以了,比如从 A tour of Go , 就是一份很不错的入门教程,可以直接在网页端的交互式学习,都不需要在本地安装 Go 的环境,而且里面的知识点覆盖的很全面,跟完整个教程之后,对 Go 就有了一个基本的了解。 还有 Go blog 也很很不错,Go 语言的最新动态,版本的发布,特性的更新,都会第一时间在这里更新。 当学完 A ...阅读全文

简书 2021-04-17 17:33:06 rayjun

新入职的P7开发的第一个功能,刚上线就崩了,只因忽视这件事

众所周知,在互联网时代,设计接口都要考虑高并发冲击,如果对接口没有限流,那可能会万劫不复,结果就是P0背回家,一年白干。限流简介现在说到高可用系统,都会说到高可用的保护手段:缓存、降级和限流,本博文就主要说说限流。限流是流量限速(Rate Limit)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服务、排队或等待、降级等处理。对于server服务而言,限流为了保证一部分的请求流量可以得到正常的响应,总好过全部的请求都不能得到响应,甚至导致系统雪崩。限流与熔断经常被人弄混,博主认为它们最...阅读全文

简书 2021-04-17 17:32:57 我是阿牛哥啊

Go context

控制并发有两种经典的方式:WaitGroup和Context WaitGroup:控制多个Goroutine同时完成 Context:并发控制和超时控制的标准做法 WaitGroup WaitGroup控制多个Goroutine同时完成,适用于多个Goroutine协同完成一项任务时,由于每个Goroutine做的都是整体的一部分,只有全部Goroutine都完成,整个任务才算完成,因此会采用等待组的方式。 var wg sync.WaitGroup wg.Add(2) go func(){ d...阅读全文

简书 2021-04-17 13:32:36 JunChow520