前言
上篇介绍了gRPC中TLS认证和自定义方法认证,最后还简单介绍了gRPC拦截器的使用。gRPC自身只能设置一个拦截器,所有逻辑都写一起会比较乱。本篇简单介绍< ahref="https://github.com/grpc-ecosystem/go-grpc-middleware">go-grpc-middleware的使用,包括grpc_zap
、grpc_auth
和grpc_recovery
。
题目描述 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 解题思路 详见代码 代码实现 // ListNode Definition for singly-linked list. type ListNode struct { Val int Next *ListNode } func reverseList(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } var prev *ListNode cur := head for cur != nil...阅读全文
概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(理论篇),这篇文章咱们接着分享:路由中间件 - Jaeger 链路追踪(实战篇)。 这篇文章,确实让大家久等了,主要是里面有一些技术点都是刚刚研究的,没有存货。 先看下咱们要实现的东西: API 调用了 5 个服务,其中 4 个 gRPC 服务,1 个 HTTP 服务,服务与服务之间又相互调用: Speak 服务,又调用了 Listen 服务 和 Sing 服务。 Read 服务,又调用了 Listen 服务 和 Sing 服务。 Write 服务,又调用了 Listen 服务 和 Sing 服务。 咱们要实现的就是查看 API 调用的链路。 关于一些理论的东西,大家可以去看看上篇文章或查阅一些资料,这篇文章...阅读全文
你好啊各位码农们!在这个教程中,我们将介绍一些进阶的测试实践,很多 Go 语言的核心开发人员以及流行的生产级工具都使用到了它们。 我希望这种通过生产上真实使用的案例来讲解的方法。能够给你一些启示,让你深入了解怎么去测试你自己的生产级别的 Go 程序。 > 注意:如果你对如何测试 Go 语言的程序完全不了解的话,我建议你先看看之前的教程: > [an introduction to testing in Go](https://tutorialedge.net/golang/intro-testing-in-go/) > (译注:Go 语言中文网译文:[Go 测试介绍](https://studygolang.com/articles/16772)) ## 通过表格驱动的测试来实现良好的测试覆...阅读全文
基于Spring Boot自动配置的思想封装起来,使其他Spring Boot项目引入后能够进行快速配置。AutoConfigurationSpring Boot的一个重要特性就是提供了各种各样的AutoConfiguration。例如DataSourceAutoConfiguration。这样我们只需要在配置文件中进行如下配置:spring: datasource: url: jdbc:mysql://xxxxxxxxxxx/realname username: xxxxx password: xxxxx driverClassName: com.mysql.jdbc.DriverSpring Boot就会在容器中按照我们的配置的信息注入一个DataSource。那么Spring boot...阅读全文
golang Regexp主要提供如下正则所表示的16个方法:
Find(All)?(String)?(Submatch)?(Index)?若带All,该方法返回一个所有递进匹配结果的slice;该方法需要额外传一个整数n,若n>=0,至多返回n个匹配或子匹配,若x<0,返回全部。
概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可。 这篇文章咱们分享:路由中间件 - 日志记录。 日志是特别重要的一个东西,方便我们对问题进行排查,这篇文章我们实现将日志记录到文本文件中。 这是我规划的,需要记录的参数: - request 请求数据 - request_time - request_method - request_uri - request_proto - request_ua - request_referer - request_post_data - request_client_ip - response 返回数据 ...阅读全文
破解方法rainbow table 1 .攻击者将所有的常见密码进行单向操作,得到最后的结果,然后和数据库的进行对比,就可以得到对应的密码。 2 .尤其是我们使用的哈希算法是开源的,那就更不安全了 密码存储进阶方案 1 .加盐 2 .利用已有的哈希算法进行多次哈希 3 .将第一次得到的值加上一个只有管理员知道的随机串,在进行一次哈希加密 4 .这样就保证了,只要加的盐不会被泄露,即使黑客拿到最后的加密串,也几乎无法推出原来的密码 5 . 专家方案 1 .意增加密码计算所需耗费的资源和时间,使得任何人都不可获得足够的资源建立所需的rainbow table。除非量子计算机出来 2 .算法中都有个因子,用于指明计算密码摘要所需要的资源和时间,也就是计算强度。计算强度越大,攻击者建立rainbow...阅读全文
Go 2, here we come! 29 November 2018 道法自然,学究天人。论英语与Golang的长天一色,得翻译和技术之并驾齐驱。 背景(Background) At GopherCon 2017, Russ Cox officially started the thought process on the next big version of Go with his talk The Future of Go (blog post). We have called this future language informally Go 2, even though we understand now that it will arrive in incremental ...阅读全文
Java的两大数据类型: 一、内置数据类型 前面一片已经介绍二、引用数据类型 引用数据类型 强引用 软引用 弱引用 虚引用 本文由zshipu.com学习笔记或整理或转载,如有侵权请联系,必改之...阅读全文
go语言Mac安装Go有多种安装方式: Go源码安装:这是一种标准的软件安装方式。对于经常使用Unix类系统的用户,尤其对于开发者来说,从源码安装可以自己定制。 Go标准包安装:Go提供了方便的安装包,支持Windows、Linux、Mac等系统。这种方式适合快速安装,可根据自己的系统位数下载好相应的安装包,一路next就可以轻松安装了。推荐这种方式 第三方工具安装:目前有很多方便的第三方软件包工具,例如Ubuntu的apt-get和wget、Mac的homebrew等。这种安装方式适合那些熟悉相应系统的用户。 我们这里只介绍 homebrew 的安装方式,我感觉这种最为简单。Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一...阅读全文
你是刚开始使用Go工具么?或者你想扩展知识?这篇文章将会描述每个人都需要知道的Go工具参数。 免责声明:这篇文章可能会有些偏见。这篇文章描述了我个人会用到的Go工具参数,还有一些是我周围的人遇到的问题。如果你还有别的想法,在Twitter联系我。 $ go build -x -x会列出来go build调用到的所有命令。 如果你对Go的工具链好奇,或者使用了一个跨C编译器,并且想知道调用外部编译器用到的具体参数,或者怀疑链接器有bug;使用-x来查看所有调用。 $ go build -x WORK=/var/folders/00/1b8h8000h01000cxqpysvccm005d21/T/go-build600909754 mkdir -p $WORK/hello/perf/_obj/...阅读全文
互联网二十多年,已到十字路口。区块链出现前的互联网被称为古典互联网,而应用区块链技术的互联网才进入了后互联网时代。作为一项新兴的技术,区块链无疑正处于风口浪尖之上,其发展前景于普通大众而言也终将是利好。但目前由于区块链技术处于发展早期阶段,存在技术成熟度、落地应用场景有限等问题,兄弟连教育建议用户在选择专业Go语言+区块链培训机构前应进行仔细考量与辨别。在iterate整个map的时候,使用delete是安全的。这跟c++是不一样的,c++在delete的时候,会导致整棵树发生变化,所以不能在迭代的时候删除元素。那为什么golang的map是安全的呢,从源码来看,golang的map使用了桶的概念,元素是被hash到桶存储,每个桶预设是存储八个kv,而且在头部有一个uint8 tophash...阅读全文
介绍Golang并发的模型写了几篇了,但一直没有以channel为主题进行介绍,今天就给大家聊一聊channel,channel的基本使用非常简单,想必大家都已了解,所以直接来个进阶点的:介绍channel的阻塞情况,以及给你一个必杀技,立马解决阻塞问题,实用性高。 阻塞场景 无论是有缓存通道、无缓冲通道都存在阻塞的情况。阻塞场景共4个,有缓存和无缓冲各2个。 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景: 通道中无数据,但执行读通道。 通道中无数据,向通道写数据,但无协程读取。 // 场景1 func ReadNoDataFromNoBufCh() { noBufCh := make(chan int) <-noBufCh fmt.Println("read fro...阅读全文
上篇介绍了gRPC中TLS认证和自定义方法认证,最后还简单介绍了gRPC拦截器的使用。gRPC自身只能设置一个拦截器,所有逻辑都写一起会比较乱。本篇简单介绍< ahref="https://github.com/grpc-ecosystem/go-grpc-middleware">go-grpc-middleware的使用,包括grpc_zap
、grpc_auth
和grpc_recovery
。
文:Rust futures: an uneducated, short and hopefully not boring tutorial - Part 5 - Streams本文时间:2018-12-09,译者:motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址 ,好文将在以下地方直接展示 Rust中文社区首页 Rust中文社区阅读Rust文章栏目 知乎专栏Rust中文社区 思否专栏Rust中文社区 简书专题Rust中文社区 微博Rustlang-cn Intro 在上篇文章中我们学习了如何实现一个高效率的Future(尽量不阻塞, 只有在需要时才会Unpark我们的Task). 今天继续扩展我们的Future: 实现一个Stream Trait.S...阅读全文
之前的文章都提到过,Golang的并发模型都来自生活,select也不例外。举个例子:我们都知道一句话,“吃饭睡觉打豆豆”,这一句话里包含了3件事: 妈妈喊你吃饭,你去吃饭。 时间到了,要睡觉。 没事做,打豆豆。 在Golang里,select就是干这个事的:到吃饭了去吃饭,该睡觉了就睡觉,没事干就打豆豆。 结束发散,我们看下select的功能,以及它能做啥。 select功能 在多个通道上进行读或写操作,让函数可以处理多个事情,但1次只处理1个。以下特性也都必须熟记于心: 每次执行select,都会只执行其中1个case或者执行default语句。 当没有case或者default可以执行时,select则阻塞,等待直到有1个case可以执行。 当有多个case可以执行时,则随机选择1个c...阅读全文
如今随着环境的改变,做技术如果不想有中年危机的话,就要知道这句话:学习新技术,更新自己的知识和技能储备最近在北京参加 QCon,看了《QCon 十周年特刊》里面一篇文章,讲了大数据十年之路。大数据是当前最热的技术之一,有了数据才会有后面的云计算时代、人工智能时代等。摘记如下:大数据领域:非实时(Hadoop + Hive),最全家桶的实时计算(Flink / Blink)+ Spark。还有可以关注下 Apache Beam。很多初学者,对大数据的概念都是模糊不清的,大数据是什么,能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展,想深入了解,想学习的同学欢迎来到大数据学习平台群:606859705点击即可直达(零基础以及进阶的经典实战)与大家分享目前国内最完整的大数据高端实战实用学...阅读全文
from:https://blog.csdn.net/qq_26981997/article/details/52608081对go做过开发的朋友都很熟悉interface。这几天在网上看到了篇文章,谈到了interface与nil判等的问题。题是好题,就进一步了解了一下。原题如下:Nil接口并不是有Nil指针的接口type Cat interface { Meow()}type Tabby struct {}func (*Tabby) Meow() { fmt.Println("meow") }func GetACat() Cat { var myTabby *Tabby = nil // Oops, we forgot to set myTabby to a real value ret...阅读全文
简单实现hashSet -- 应用篇 写这篇文章的起因: 在使用golang和php的时候我们经常会判断一个变量是否在map或者数组中; 在php中的时候我们经常使用in_array()来判断,这里是我们经常用的。 其实用in_array()这个函数就是对数组进行遍历判断是否存在时间复杂度是log(n) 一般数组不是太大也就这样了; 但是在golang中并没有封装这个函数,这个需要我们自己去封装。 如果也是用循环的方式去判断变量是否存在,那是不是感觉很low,也就是这个原因引出了这篇文章 此篇文章GitHub地址:https://github.com/wrack0001/note/blob/master/skill/%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0ha...阅读全文
https://www.jianshu.com/p/d5693ca22c3...阅读全文
之前的文章都提到过,Golang的并发模型都来自生活,select也不例外。举个例子:我们都知道一句话,“吃饭睡觉打豆豆”,这一句话里包含了3件事: 妈妈喊你吃饭,你去吃饭。 时间到了,要睡觉。 没事做,打豆豆。 在Golang里,select就是干这个事的:到吃饭了去吃饭,该睡觉了就睡觉,没事干就打豆豆。 结束发散,我们看下select的功能,以及它能做啥。 select功能 在多个通道上进行读或写操作,让函数可以处理多个事情,但1次只处理1个。以下特性也都必须熟记于心: 每次执行select,都会只执行其中1个case或者执行default语句。 当没有case或者default可以执行时,select则阻塞,等待直到有1个case可以执行。 当有多个case可以执行时,则随机选择1个c...阅读全文
介绍 到现在为止,我们已经实现了一个拥有所有关键功能的区块链了:匿名,安全,还有随机生成的地址;区块链数据存储;工作量证明系统;以可靠的方式存储交易。尽管这些功能很关键,但还是有不足。到底是什么会让这些功能真的闪耀起来呢,到底是什么使得加密货币成为可能呢 —— 是网络。如果一个这样牛逼的区块链只是在一台计算机上运行有什么卵用?当只有一个用户的时候,这些基于密码学的功能有啥好处?是网络使得这些机制可以工作起来,而且变得有用。 你可以把这些区块链的功能想象成教条,类似于那种人们想要一起生活成长就要遵守的教条。这是一种社会准则。区块链网络是一个遵循着同样准则的程序社区,正式这种遵循准则使得社区得以存活。这和真实世界很相似,当人们分享了类似的思想,他们就会更强而且可以一同创造更好的生活。如果有人遵循...阅读全文
goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。这篇文章介绍,如何合理的退出goroutine,减少软件bug。 goroutine在退出方面,不像线程和进程,不能通过某种手段强制关闭它们,只能等待goroutine主动退出。但也无需为退出、关闭goroutine而烦恼,下面就介绍3种优雅退出goroutine的方法,只要采用这种最佳实践去设计,基本上就可以确保goroutine退出上不会有问题,尽情享用。 1:使用for-range退出 for-range是使用频率很高的结构,常用它来遍历数据,range能够感知channel的关闭,当chan...阅读全文
前言 阅读Golang sync包时,总会看到一句话“must not be copied after first use”,对此感到很好奇,查阅过程中发现这篇文章总结得挺到位的,因此转载,记录一下,因为我只是对于原理上面好奇,因此没有全文翻译过来,只挑选了一些自己感兴趣的地方用自己的话总结了一下,感兴趣的可以看看原文章: What does “nocopy after first use” mean in golang and how 正文 must not be copied after first use 初次使用后不能复制,sync包大多跟并发控制相关,出于安全考虑(避免指针的复制使得指针污染不安全,误操作而使程序崩溃)不能复制可以理解,但Golang是怎么样办到的呢,接下来就从源码...阅读全文
最近几年,写了一些博客,加起来不算多,150篇左右吧。 对于很多人来说,可能不明白我为什么写博客,写博客对于我来说,可能就像大家看电影一样,有时间就看看(写写)。对于我自己也是一些东西的总结,有时候通过写,才能加深理解。写博客还可以可以让你保持学习的心态,和读者交流,自我能力提升。 写的东西涉及各方面都有,但是以技术互联网居多,辅以管理、生活、总结等,内容有浅有深,如果你看到了,并且可以从中受益,那么这篇文章也就有了价值。 最近从这150篇中,根据阅读数,选了Golang(Go语言)、Android相关的十大热门篇文章,给大家分享。 No.10 关键词:IO Go语言实战笔记(十九)| Go Writer 和 Reader http://www.flysnow.org/2017/05/08/...阅读全文
goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理。但有时候,我们还是想控制一下。 比如,我们有A、B两类工作,不想把太多资源花费在B类务上,而是花在A类任务上。对于A,我们可以来1个开一个goroutine去处理,对于B,我们可以使用一个协程池,协程池里有5个线程去处理B类任务,这样B消耗的资源就不会太多。 控制使用资源并不是协程池目的,使用协程池是为了更好并发、程序鲁棒性、容错性等。废话少说,快速入门协程池才是这篇文章的目的。 协程池指的是预先分配固定数量的goroutine处理相同的任务,和线程池是类似的,不同点是协程池中处理任务的是协程,线程池中处理任务的是线程。 最简单的协程池模型 上面这个图展示了最简单的协程池的样子。先把协...阅读全文
一、背景容器和微服务的出现并得到大量应用,从根本上改变了应用系统的组成和运行方式。而随着开发人员开始利用编排系统来管理和部署容器,规则进一步发生了变化。以往主机上的一个简单应用,现在已成为一个复杂的、动态编排的、多容器的体系架构,这同时也对应用的监测提出了全新的挑战。Sysdig,是专注于系统故障排查和监控工具的公司,其产品Sysdig Cloud是定位于容器系统故障排查和监控的平台。在今年召开的JFrog SwampUp用户大会上,Sysdig公司提出监测容器及构建在其上的微服务的五大关键原则。这些原则充分考虑了容器和微服务与传统架构在运维方式上的差异。本文即是根据Sysdig公司在本次大会上的演讲视频整理而成的。二、微服务是什么要正确地监测微服务,首先要正确地理解什么是微服务。演讲首先...阅读全文
文: A complete journey with Goroutines 在Golang中如果我们想并发的处理事情,我们使用Goroutines。 但是什么是并发呢? 这儿有个例子:我正在写这篇文章突然感到口渴 ,我将停止打字然后去喝水,然后我将继续开始打字。现在,我通过时间切片的方式同时处理了2件事情(打字和喝水),这就被说成是并发工作。这里需要指明的是这两件任务(写字和喝水)不是在同一时间被处理的 。如果事情是在同一时间被处理的,那么它们就被叫做并行(例如一边玩你的手机一边吃薯片)。 因此并发是同时处理多件事情(没有必要在相同的时间做...阅读全文
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。 Java内存模型(JMM) JVM内存模式是JVM的内存分区 Java内存模式是一种虚拟机规范 1. Jvm内存按照运行时态及内存规范划分 Java内存区域 2.1 线程安全 2.1.1 程序计数器 2.1.2 虚拟机栈 2.1.3 本地方法 2.2 线程不安全 2.2.1 方法区 2.2.2 堆包含如下图 2.2.3 堆内存划分 总结: 程序计算器是唯一不会 OOM区 堆是gc的主要场所 线程安全区: 虚拟机栈,本地方法,程序计数器 非线程安全区:方法区,堆 堆:划分为 Eden,From Survivor,To Survivor 堆:各区比例:8:1:1 本文由zshipu....阅读全文
最近几年,写了一些博客,加起来不算多,150篇左右吧。 对于很多人来说,可能不明白我为什么写博客,写博客对于我来说,可能就像大家看电影一样,有时间就看看(写写)。对于我自己也是一些东西的总结,有时候通过写,才能加深理解。写博客还可以可以让你保持学习的心态,和读者交流,自我能力提升。 写的东西涉及各方面都有,但是以技术互联网居多,辅以管理、生活、总结等,内容有浅有深,如果你看到了,并且可以从中受益,那么这篇文章也就有了价值。 最近从这150篇中,根据阅读数,选了Golang(Go语言)、Android相关的十大热门篇文章,给大家分享。 No.10 关键词:IO Go语言实战笔记(十九)| Go Writer 和 Reader http://www.flysnow.org/2017/05/08/...阅读全文
连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrift-Clinet链接Service端使用的时候出现了并发问题,然后找到了一个通用的连接池的库在这里分享给大家. 附上: 喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-pool 1.连接池 在使用之前我们需要先了解清楚连接池的概念,总结下来连接池主要解决以下几类问题: 减少连接创建时间 与数据库还是Thrift等程序建立连接都是有开销的。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。 简化的编程模式 当使用连接池时,具体的操...阅读全文
package mainimport ( "fmt" "log" "net/http" "os" "golang.org/x/net/html")var ( str string = "https://docs.hacknode.org/gopl-zh/")//CreatFile is a func ti make infomation in filefunc CreatFile(bt []byte) { f, err := os.OpenFile("F:/MyGo/src/practice/url.txt", os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatal(err) } defer f.Close() res, err :=...阅读全文
『就要学习 Go 语言』系列 -- 第 25 篇分享好文 Go 语言没有对象的概念,但是 struct 类型有着和对象类似的特性。struct 类型可以定义自己的属性和方法。这篇文章我们来总结下 Go 语言中关于 “继承” 和多态的概念。 嵌入类型 嵌入类型是指将已有的类型直接声明在新的结构类型里。不像 Java、C++ 等语言,Go 语言没有继承,但是可以通过组合的方式实现代码的复用。 type User struct { Name string Email string } type Admin struct { User Level string } func (u *User) Speak() { fmt.Println("I am user",u.Name) } 复制代码上面的代码...阅读全文
添加编辑和保存功能 继续上篇文章【Go基础学习记录 - 编写Web应用程序 - 添加编辑和保存功能(一)】 如果将上篇文章的逻辑进行构建并运行,试图访问一个不存在的wiki,比如/view/APageThatDoesntExist,将看到包含HTML的空页面。这是因为它忽略了loadPage的错误返回值,并继续尝试填写没有数据的模板。相反,如果请求的页面不存在,它应该将客户端重定### 处理不存在的页面修改下viewHandler来达到我们的需求,如下 func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] p, err := loadPage(title) ...阅读全文
微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。 重平衡的作用 重平衡跟消费组紧密相关,它保证了消费组成员分配分区可以做到公平分配,也是消费组模型的实现,消费组模型如下: image.png 从图中可以找到消费组模型的几个概念: 同一个消费组,一个分区只能被一个消费者订阅消费,但一个消费者可订阅多个分区,也即是每条消息只会被同一个消费组的某一个消费者消费,确保不会被重复消费; 一个分区可被不同消费组订阅,这里有种特殊情况,加...阅读全文
近几个月的工作中,有遇到一些场景:基本不需要全局的状态管理,但页面级的,肯定需要在一些组件中共享,引入Redux这类状态管理库有点繁琐,直接通过props传递的话,写起来总觉得不是那么优雅。刚好项目中React版本比较新,就试了下Context Api,代码大致如下: // Context.js const Context = React.createContext( {} // default value ) export const Provider = Context.Provider export const Consumer = Context.Consumer // App.jsx import {Provider} from './Context' import Page fr...阅读全文
你是刚开始使用Go工具么?或者你想扩展知识?这篇文章将会描述每个人都需要知道的Go工具参数。免责声明:这篇文章可能会有些偏见。这篇文章描述了我个人会用到的Go工具参数,还有一些是我周围的人遇到的问题。如果你还有别的想法,在Twitter联系我。$ go build -x-x会列出来go build调用到的所有命令。如果你对Go的工具链好奇,或者使用了一个跨C编译器,并且想知道调用外部编译器用到的具体参数,或者怀疑链接器有bug;使用-x来查看所有调用。$ go build -x WORK=/var/folders/00/1b8h8000h01000cxqpysvccm005d21/T/go-build600909754 mkdir -p $WORK/hello/perf/_obj/ mkdi...阅读全文
请关注公众号: 搬砖程序员带你飞,学习更多内容。 本文主要介绍 supervisor 对 fastcgi 进程的管理 fastcgi 进程的管理 在php 中,php-fpm 有主进程来管理和维护子进程的数量。但是并不是所有的服务都有类似的主进程来做子进程的维护。在很多其他语言中,有很多比较有名的fastcgi 服务,例如py 的flup, c++ 实现的 FastCgi++等。如果这些服务在单机中启动多个进程(极有可能),那如何管理这些进程是个比较头疼的问题。 supervisor 的fastcgi 管理的功能就是为了解决这个问题。 配置 在普通进程的基础上,添加如下配置: [fcgi-program:x] socket = "tcp://10.3.2.10:9002" // 支持 tcp...阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lastsweetop/article/details/78395076 前言 为了让golang的路由更加清晰,让路由的代码可读性更好,我们采用mux包去实现路由,并且在原有功能上做了精简 该系列文章所有代码放在这里 开始 所需的包github.com/gorilla/mux 我们在启动http服务时设置一下路由的配置方法 func startHttp() { if err := http.ListenAndServe(":9090", api.NewAPIMux()); err != nil { log.Fatal("ListenAndServe: ", err) } } 配置方法 api包...阅读全文
连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrift-Clinet链接Service端使用的时候出现了并发问题,然后找到了一个通用的连接池的库在这里分享给大家. 附上: 喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-pool 1.连接池 在使用之前我们需要先了解清楚连接池的概念,总结下来连接池主要解决以下几类问题: 减少连接创建时间 与数据库还是Thrift等程序建立连接都是有开销的。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。 简化的编程模式 当使用连接池时,具体的操...阅读全文
前言 在写这个系列第一篇文章的时候,有些朋友可能不知道wasm能够使用在什么场景,虽然在评论里面有提及,但是没有上具体的例子,这篇文章,使用一个具体的例子来示范下wasm的使用场景。这篇文章主要会讲以下几个方面的东西: md5简单介绍 使用Go计算文件md5 使用js计算文件md5 性能对比 文件秒传什么实现的? md5的简单介绍 md5 简单的说就是它是一种散列算法,在以前有很多网站或者系统,都是使用 md5 来加密的,md5 的特征是,任意长度的输入,它都可以给你生成一个128位的结果出来,而且只要输入不一样,输出的结果肯定不一样(现在据说会有hash碰撞,不过我们这里不讨论)。128位使用16进制的数字表示就是32位了。不过,在现在的系统中,应该是没有再使用md5来加密密码的了,因为 ...阅读全文
本文主要介绍 supervisor Event 的功能。 supervisor 作为一个进程管理工具,在 3.0 版本之后,新增了 Event 的高级特性, 主要用于做(进程启动、退出、失败等)事件告警服务。 Event 特性是将监听的服务(listener)注册到supervisord中,当supervisord监听到相应事件时,将事件信息推送给监听对应事件的listener。 事件类型 Event 可以设置 27 种事件类型,可以分为如下几类: 1. 监控进程状态转移事件; 2. 监控进程状态日志变更事件; 3. 进程组中进程添加删除事件; 4. supervisord 进程本身日志变更事件; 5. supervisord 进程本身状态变更的事件; 6. 定时触发事件。 事件可以被单独监...阅读全文
继续上篇文章的学习,今天来看看其他的环境变量。 GOEXE The executable file name suffix (".exe" on Windows, "" on other systems). 编译后的二进制文件后缀,在Windows平台是".exe",在其他平台是""。 GOFLAGS 这个变量看起来比较陌生,用的不多,我们看看文档里是怎么解释的: A space-separated list of -flag=value settings to applyto go commands by default, when the given flag is known bythe current command. Each entry must be a standalone ...阅读全文
image 现代软件的研发流程基本上均会配备一定程度的CI/CD(这篇文章解释了为何需要在企业里实施CI/CD),整个流程主要分为CI和CD部分,这篇文章将围绕CI部分展开,并通过一个具体的例子解释如何0成本在github上构建CI。构建CI的最佳实践离不开Trunk Based Development的分支策略,感兴趣的读者可以通过这篇文章来了解什么是Trunk Based Development。在github上构建CI有2个好处:无需任何费用和有大量可以用于构建CI的模块,借助这2个好处,小规模团队可以快速地搭建还不错的CI流程。接下来,让我们结合一个使用Go编写的Hello World例子以及基于Trunk-Based Development模式来构建这个CI流程。 这篇文章将分为以...阅读全文
Golang: 思路:组合题,先反转链表,再让它们相加,再反转回来即可。针对题目提到的进阶,可以先将两个链表拷贝下来做大数加法,再赋值回去或者新开一条链表 代码如下: func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { l1 = reverseList(l1) l2 = reverseList(l2) temp:=addTwoLinkedLists(l1,l2) return reverseList(temp) } //两个链表相加,使用的某大佬的代码 func addTwoLinkedLists(l1 *ListNode, l2 *ListNode) *ListNode { var temp = &ListNode{} va...阅读全文
Golang: 思路:这题是个栈,属于括号匹配的进阶写法,但其实也没啥进阶的 代码如下: func isValid(S string) bool { var res []byte if len(S)%3!=0{ return false } for i:=0;i
Golang: 思路:这题是分配糖果的进阶篇,分配链表,这题为了实现简单,没那么在乎空间复杂度,因此最终结果空间复杂度效率较低,也算是在预期之内。 代码如下: func splitListToParts(root *ListNode, k int) []*ListNode { node1:=root var nodes []*ListNode for node1!=nil{ nodes=append(nodes,node1) node1=node1.Next } if len(nodes)