8.框架原理与实现

  1. 1.曹大,我一看到接口就脑壳疼。还有那种用type定义和函数的。我该怎么迈过这一道坎?有没有易懂得源码可以step by step?还有那种包了一层结构体的,去适配etcd consoul?包多层结构体看代码看的很迷糊,不清楚包那么多层结构体 好复杂。
  2. 2.type HandlerFunc func(wr, *r) 和 type HandlerFunc = func(wr, *r) 什么区别?
  3. 3.nType=catchAll的时候,/users/:name/*any 这个path,any参数接收到的内容gin为什么设计为path的内容;举例:/users/jack/666,any参数被解析为 “/666” 今天下午看到这个不理解,为什么不是 “666”,下午调试看到的
  4. 4.认证放中间件好还是放一个request对象判断好,类似drf就是放request对象判断
  5. 5.路由那个算法那么快,可以用在别处吗 类似 高并发 ?除了路由,还有哪些场景可以用到。
  6. 6.小项目用自带的net http好 还是第三方gin之类的好?
  7. 7.中间件那个跟流水线算法好像有点像,那种类似Jenkins pipeline支持编排后执行的不知道怎么个思路实现?
  8. 8.中间件可插可拔,非常方便,感觉有点类似插件的思路,经常看到有些系统支持自定义插件扩展功能。这种不清楚他们是怎么支持插件式扩展的?
  9. 9.路由的链式调用和用那个use两种用法,链式调用不清楚怎么实现的?
  10. 10.router的path设计严格遵守restful模式吗 好像还有用那个graphql的?哪种场景用哪种?
  11. 11.刚才讲的测试分身,能稍微演示一下吗?
  12. 12.感觉周围同事写的代码一塌糊涂,甚至有个女同事老抄我的代码实现怎么搞?
  13. 13.可以讲讲web开发中各层测试的常规套路吗,应该怎么写test
  14. 14.validator 能辨别零值和默认值吗?
  15. 15.validator会不会影响性能?
  16. 16.曹大,你一天能集中精力几小时写代码?一天写多少算合格?我一般两三小时之后时间再没精神了。
  17. 17.有没有必要整理一下go的设计模式常用代码,方便业务代码套进去?有资料推荐吗
  18. 18.Go里有类似 Java Spring 事务管理器吗?
  19. 19.框架中很多实现都是需要用reflect的,有效率相关的benchmark吗?是否有实现cache反射结果的实现?
  20. 20.公司框架集成了gin,是不是应该让gin.Context入侵到业务呢?从输入输出层到repo层都有gin.Context,感觉也没啥问题,因为毕竟两三年不会被换掉,确实很方便
  21. 21.那个kratos框架怎么样?
  22. 22.头条魔改net包的那个方案咋样
  23. 23.今天讲的内容平时的业务域涉及不到,框架有点没头绪,平时实现后台服务和提供RPC等,可以基于gRPC做validator或interception等吗?
  24. 24.手写router需要通过sync.Pool缓存什么数据
  25. 25.httprouer 和 mux 、fasthttp功能基本相似, star也差不多, 能简单的对比下吗
  26. 26.问个题外的,database/sql 然后各种driver 用_ 方式导入, 这种模式用在业务上是否合适?
  27. 27.对于sdk类型的库,依赖于其它组件,如何测试比较合适,特别是依赖库的版本变化比较大的情况
  28. 28.限速有哪个推荐?不清楚什么原理。能不能根据cpu的负载,自动伸缩goroutine的数量?
  29. 29.orm的原理能简单的梳理一下吗?
  30. 30.chi源码感觉有点复杂,能简单梳理一下吗?
  31. 31.代码中大量使用设计模式,算不算可读性差?
  32. 32.在写vaildate时如果要校验那种有参数又有上传文件的怎么办?这种结构体怎么定义,有点转不过来
  33. 33.可以讲讲gitlab flow吗 公司一般怎么管理分支的?
  34. 34.设计模式,在大厂中会要求代码设计符合设计模式么?
  35. 35.clickhouse一般用什么场景?
  36. 36.曹大,你把标准库里源码都浏览完了吗?有什么顺序,最佳方式读下去的,要不要从go1.5开始?
  37. 37.业务单元测试怎么做好,各层之间定义的interface太大的话,写的东西也不少。还有一个题外话,如果package的名字叫user,测试的文件也叫user还是叫user_test呢,package的名字不是文件的名字
  38. 38.interface套多层这种代码,读起来好难受,一般什么场景会出现这种设计?
  39. 39.函数体用汇编为什么会提高效率?编译成二进制不都是汇编了嘛
  40. 40.goroutine池一般什么场景用到?高并发那个文章真的可以提升性能吗https://mp.weixin.qq.com/s/-gKgduM8Cw_GGYyzrzSbXw
  41. 41.设计一个cmdb用mogodb是不是更好点?因为可能动态给资产加字段。也有可能不同类型的资产导入,不想每次建表去写代码适配了。
  42. 42.有没有微服务治理、网关做的比较好的公司(可以在线体验一下产品),内部哪些工具已开源的(类似 sentinel),可以拿来鉴赏一下?
  43. 43.没有goroutinie池,如果goroutine太多了,岂不是会造成goroutine泄漏?uber有一个检测工具 go.uber.org/goleak ,比如这样的goroutine池的实现 https://github.com/panjf2000/ants 是不是会更好一些?
  44. 44.为什么go用的plan 9汇编,却可以跑Intel指令集?
  45. 45. 没有具体任务目标的时候(为了卷而去看),应当如何着手去剖析框架?是自己写一个demo,然后一路追踪运行流程吗?有没有什么套路?看A问题时候又发现需要B知识,看B又发现C有点迷糊…有点子子孙孙无穷尽也,这个问题有点困惑
  46. 46.. 看 go runtime 的时候大量的汇编代码,其实各种MOV都很好理解的,但是有很多寄存器并不是看得很懂,官方文档里貌似没有详细叙述(AX BX RRR5之类),请问这个应该怎么看呢

1.曹大,我一看到接口就脑壳疼。还有那种用type定义和函数的。我该怎么迈过这一道坎?有没有易懂得源码可以step by step?还有那种包了一层结构体的,去适配etcd consoul?包多层结构体看代码看的很迷糊,不清楚包那么多层结构体 好复杂。

  • dlv
  • goland 的 interface 查看实现功能
  • 加日志

2.type HandlerFunc func(wr, *r) 和 type HandlerFunc = func(wr, *r) 什么区别?

  • type alias 和 type equality ,后者无法定义方法,equlity的等号两边完全等价

3.nType=catchAll的时候,/users/:name/*any 这个path,any参数接收到的内容gin为什么设计为path的内容;举例:/users/jack/666,any参数被解析为 “/666” 今天下午看到这个不理解,为什么不是 “666”,下午调试看到的

  • 得调一下。。。

4.认证放中间件好还是放一个request对象判断好,类似drf就是放request对象判断

  • 不太确定…

5.路由那个算法那么快,可以用在别处吗 类似 高并发 ?除了路由,还有哪些场景可以用到。

  • Google

6.小项目用自带的net http好 还是第三方gin之类的好?

  • 用 gin 好一些,中间件可以用,validator 之类的工具,标准库里都没有,自己整合要花点时间

7.中间件那个跟流水线算法好像有点像,那种类似Jenkins pipeline支持编排后执行的不知道怎么个思路实现?

  • 有点没看懂。。skip

8.中间件可插可拔,非常方便,感觉有点类似插件的思路,经常看到有些系统支持自定义插件扩展功能。这种不清楚他们是怎么支持插件式扩展的?

  • 两方要编译到一起的话:interface,实现你的 interface 就行
  • 还有一种方式,interface,但是我可以加载你的动态库
  • rpc

9.路由的链式调用和用那个use两种用法,链式调用不清楚怎么实现的?

  • 需要看一下《Go 高级编程》的 middleware 部分
  • go-chi/chi

10.router的path设计严格遵守restful模式吗 好像还有用那个graphql的?哪种场景用哪种?

  • 不太清楚是不是严格,需要找反例
  • graphql,相对于 restful,如果我接口获取的字段有变动,不需要后端做任何修改
    • {user_id : 1, user_name : alex}, => {user_id : 1, user_name : alex, user_age : 23}
    • graphql 前端请求加新字段就行了
  • graphql 缺点
    • 权限不好控制
    • 稳定性不好做,qps 100 -> 每一个请求他的成本完全不一样,比如有的请求一次只返回一个字段,有的请求一次返回 1000 个字段;难以限流
  • 公司内部一些比较后台的运营系统,获取数据。

11.刚才讲的测试分身,能稍微演示一下吗?

12.感觉周围同事写的代码一塌糊涂,甚至有个女同事老抄我的代码实现怎么搞?

  • CR
  • golangci-lint
  • 评审、设计
  • 注释

13.可以讲讲web开发中各层测试的常规套路吗,应该怎么写test

  • unit test -> pkg,func
  • 模块测试 -> 脚本,集成公司内上线的 CI 系统里
  • 集成测试 -> 脚本,数据可能从线上采集下来的全流程的 case,CI 流程里跑(流量回放之类的技术手段
  • QA 手动、负责维护自动化的东西

14.validator 能辨别零值和默认值吗?

  • 这个和 validator 没关系,主要 Go 语言的类型系统的问题
  • int,没有办法区分用户传了0还是用户没有传值;
    • int,nil,0

15.validator会不会影响性能?

  • 我觉得性能影响比较小

16.曹大,你一天能集中精力几小时写代码?一天写多少算合格?我一般两三小时之后时间再没精神了。

  • 四个小时可以;
  • 每写三十分钟,摸 15 分钟鱼

17.有没有必要整理一下go的设计模式常用代码,方便业务代码套进去?有资料推荐吗

  • 可以看看这个:senghoo/golang-design-pattern: 设计模式 Golang实现-《研磨设计模式》读书笔记 (github.com)

18.Go里有类似 Java Spring 事务管理器吗?

  • 不太了解
  • tx

19.框架中很多实现都是需要用reflect的,有效率相关的benchmark吗?是否有实现cache反射结果的实现?

  • 编码、解码、validate 要用到
  • router 不需要,middleware 不需要
  • 编解码是反射性能差的重灾区

20.公司框架集成了gin,是不是应该让gin.Context入侵到业务呢?从输入输出层到repo层都有gin.Context,感觉也没啥问题,因为毕竟两三年不会被换掉,确实很方便

  • 不应该 gin.Context 入侵业务
  • clean architecture,business logic 放在最上层,不应该让外部变动影响到我的业务。
  • 做框架切换、换数据库,都不应该改任何业务相关的代码。

21.那个kratos框架怎么样?

  • kratos 有很多不错的东西
  • v1 有不少从 google sre 里学到的稳定性经验
  • v2 还没写完

22.头条魔改net包的那个方案咋样

  • 头条方案需要改 runtime,把 epoll_wait 对用户函数的回调插入到 netpoll 流程里。
  • syscall.EpollWait 写回调代码的话,执行 reactor 的 goroutine 没有高优先级,所以延迟会大幅上升
  • 我在 mosn 里的测试结果是 4c 以下,netpoll 比标准库节省大量内存,且延迟低,1000 qps
  • 8c 以上,netpoll 延迟大幅上升。

23.今天讲的内容平时的业务域涉及不到,框架有点没头绪,平时实现后台服务和提供RPC等,可以基于gRPC做validator或interception等吗?

  • gRPC 应该本来就有 interceptor 的功能,类似中间件
  • pb 里面就可以写一些校验规则,你把 unmarshal 出来的 struct 额外 validate 一次也是可以的

24.手写router需要通过sync.Pool缓存什么数据

  • 通过 go test -benchmem 找内存分配位置,然后通过 sync.Pool 做优化
  • 直接看 gin 的代码的 sync.Pool

25.httprouer 和 mux 、fasthttp功能基本相似, star也差不多, 能简单的对比下吗

  • mux 相比 httprouter 多了正则匹配的功能,性能上肯定也会稍微差一些;但是路由上的性能不是绝对考虑的因素,主要还是功能。
  • fasthttp 不是一个 router,fasthttp <-> net/http,fasthttp 对 http 标准的支持不是很全,如果你不是碰到了 http server 的性能问题,也不建议用 fasthttp。
  • fasthttp 他的函数签名和 net/http 不一样,给 net/http 用的 router 在 fasthttp 也没有办法直接用,fasthttp 有自己的 router,比如一些 fasthttprouter

26.问个题外的,database/sql 然后各种driver 用_ 方式导入, 这种模式用在业务上是否合适?

  • _ 导入是用了 init 函数
  • 大量用 init 函数,如果 init 之间有依赖的话,初始化顺序不对,可能程序就启动不了了 => go fmt 当前文件,可能就跑不了了
  • 补充一下,同一个包下面的init执行顺序是按照文件名排序的,也会有坑
  • https://github.com/leighmcculloch/gochecknoinits

27.对于sdk类型的库,依赖于其它组件,如何测试比较合适,特别是依赖库的版本变化比较大的情况

  • anti-corruption-layer
  • 回归测试
  • v1/v2 能回滚

28.限速有哪个推荐?不清楚什么原理。能不能根据cpu的负载,自动伸缩goroutine的数量?

29.orm的原理能简单的梳理一下吗?

  • reflect tag, sql.Row, set
  • sqlx -> sql string -> params, : @ $. identifier
  • gorm 我也没太看过,可以问答区看看

30.chi源码感觉有点复杂,能简单梳理一下吗?

  • 问答区吧。。。

31.代码中大量使用设计模式,算不算可读性差?

  • 如果你的代码确实有很多可能的变化点和需要适配的外部变动,那设计模式是有必要的
  • mysql 这类存储基本是不太可能变的
  • 适可而止的使用就可以了

32.在写vaildate时如果要校验那种有参数又有上传文件的怎么办?这种结构体怎么定义,有点转不过来

1
2
3
4
type req struct {
email string `validate:"email"`
file xxx
}

33.可以讲讲gitlab flow吗 公司一般怎么管理分支的?

  • master 不改代码,直接锁定,发布和上线
  • dev
  • feature-new-register
  • fix-20221-dfsfajf
  • fork cch/project
  • feature, fix 都是从 master checkout -b
  • master -> merge request -> CR
  • cherry-pick

34.设计模式,在大厂中会要求代码设计符合设计模式么?

  • 大厂没人考你设计模式
  • 架构合适好用就行了

35.clickhouse一般用什么场景?

  • clickhouse,取代 es 做日志存储
  • 在线的 olap,取消 es

36.曹大,你把标准库里源码都浏览完了吗?有什么顺序,最佳方式读下去的,要不要从go1.5开始?

37.业务单元测试怎么做好,各层之间定义的interface太大的话,写的东西也不少。还有一个题外话,如果package的名字叫user,测试的文件也叫user还是叫user_test呢,package的名字不是文件的名字

  • 个人经验不是特别多

38.interface套多层这种代码,读起来好难受,一般什么场景会出现这种设计?

  • 为了灵活,interface 就是会特别多
  • 借助 ide 和 debugger 看

39.函数体用汇编为什么会提高效率?编译成二进制不都是汇编了嘛

  • c/c++ 写了一些 json 的解析函数
  • clang c/c++ -> asm,-o2 o3,asm optimized,asm : intel -> plan9
  • 这样你就有了一个高优化级别的 Go plan9 汇编函数

40.goroutine池一般什么场景用到?高并发那个文章真的可以提升性能吗https://mp.weixin.qq.com/s/-gKgduM8Cw_GGYyzrzSbXw

41.设计一个cmdb用mogodb是不是更好点?因为可能动态给资产加字段。也有可能不同类型的资产导入,不想每次建表去写代码适配了。

  • 公司能不能运维好 mongodb
  • 其次 mysql 的 json 功能是否已经可以支持你的需求

42.有没有微服务治理、网关做的比较好的公司(可以在线体验一下产品),内部哪些工具已开源的(类似 sentinel),可以拿来鉴赏一下?

  • 服务框架里去做这些功能,go-micro,go-zero,kratos v1
  • 云原生社区里面的 service mesh 的落地情况,istio,envoy(mosn),魔改
  • apisix

43.没有goroutinie池,如果goroutine太多了,岂不是会造成goroutine泄漏?uber有一个检测工具 go.uber.org/goleak ,比如这样的goroutine池的实现 https://github.com/panjf2000/ants 是不是会更好一些?

  • goroutine 泄露,比如:goroutine 阻塞在某个 channel 上,永远降不下去,这个叫 goroutine 泄露。

44.为什么go用的plan 9汇编,却可以跑Intel指令集?

  • 机器执行的是机器码,plan9 语法、intel 语法是助记符号

45. 没有具体任务目标的时候(为了卷而去看),应当如何着手去剖析框架?是自己写一个demo,然后一路追踪运行流程吗?有没有什么套路?看A问题时候又发现需要B知识,看B又发现C有点迷糊…有点子子孙孙无穷尽也,这个问题有点困惑

  • 改代码,加日志,写测试 demo
  • delve 做调试

46.. 看 go runtime 的时候大量的汇编代码,其实各种MOV都很好理解的,但是有很多寄存器并不是看得很懂,官方文档里貌似没有详细叙述(AX BX RRR5之类),请问这个应该怎么看呢


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lihuanjie113@gmail.com

×

喜欢就点赞,疼爱就打赏