1.相比ruby on rails,laravel ,TP, 感觉go生态里的 web框架都很“简陋”。目前看来 goframe 设计的还不错,里面提到了大多 orm框架 有很多字符串的硬编码,不是很安全,曹大怎么看?
- goframe 认为企业级框架应该集大成,以单库维护依赖版本,避免业务出问题。
- “order_id > “: “1”
2.logger 打印规范,一个标准格式例子?日志过多会影响性能得厉害吗?
- 这个我们压测过,没有日志,比有日志快10~20%,如果用异步,非sugar模式的zap,可以快更多。如果硬盘很龊也不行。
- 2021-01-02 00:00:23||[module_name]|| pb
- for {log.Infof()}
- 日志对性能影响极大,具体多大,需要压测,如果打的不好,性能降为 1/100 都有可能
- logStr := a + b + c => fmt.Sprintf(“%v %v %v”) => p2 事故
3.没有接触过微服务的小白, 如何入门? 老师有推荐的微服务入门书单?
4.Go 做 Web 的话,一般是怎么做热更新的呢?
- 代码里面要把预设的模式编码好,根据数据库里的配置做修改,govaluate,不太灵活
- gopherlua,gopherjs — 不是特别稳定,没有见大公司有使用
- go-plugin,很垃圾,基本没人用
- wasm
- viper,自己设计的话,搞一个简单的双 buffer 就可以
5.依赖注入是怎样实现的呢?主要为了解决什么问题?
- 为了自动做变量绑定,少写一些初始化代码
- wire、dig,复杂依赖,初始化的时候很麻烦,方便测试
6.想问个题外话-面试题:如何做技术选型?
- 选什么,你和你的同事一定能维护得动
- 其次,性能、功能指标能达到你们业务需求目标
- 你选的这个方案不是冷门方案,未来也好招人
- 选 star 多的,代码质量好的
7.看过挺多微服务框架, 一直没决定选哪个框架进行深入,老22222较好?
- 我个人倾向去学 go-micro
- 公司选择的话,可以都看看
- https://magodo.github.io/micro-go-src-server-client/
- https://goframe.org/display/gf/2021-04-17+GoCN+Gopher+Meetup
8.sre是哪本书哇?应该是这本

9.分布式的接口限流一般都是怎么做的?
- registry store [getOrder],访问量限制
- 每个服务都订阅了自己,所以每个服务知道自己的实例数
10.框架是具有普适性的吧?也能适应IM, 物联网这种行业业务么?
- websocket,在框架里很多也支持
- IOT,mqtt 协议之类,涉及到存储,那还是需要一个简单的框架
11.刚才说的etcd做服务注册服务发现有什么问题啊?
- cp,ap
- etcd 挂了(网络分区),那你的服务就找不到其它服务,这种情况是不是可以接受的
12.曹大后续会讲DDD嘛。Go怎么用DDD思想搭框架呀?
- 会讲,通用的思想可以借鉴
- 教条的词汇没什么用,而且同事可能会反感
13.重启服务时,服务关了;但此时端口交给tcp 正在closed,重启时发现端口还是被占用,一般怎么处理?
- 摘流,等待一段时间
- kill -9
- tcp_reuse?
14.Go框架中打日志是单独的协程负责吗?算是异步的吗?
- 不一定,logger 实现不一定是异步的
- logrus 记得是同步的
15.怎么较为容易的提高团队的技术水平呢?
- 组织大家搞技术分享/读书会
- 每周挑一天,组里人轮流来分享
16.容器内的自适应限流应该怎么做?有啥开源的项目吗?如果没有的话,手撸一个有啥思路吗?
- 监控系统,agent <- metrics sdk,通过 metrics 查询本容器的性能指标,然后根据查到的性能指标来做限流
- sentinel 代码、kratos v1 好像有自适应限流
17.Go如果对外发布一些库,除了源码以外,有其他好的方案吗?
- go-plugin,不好用,main plugin 是同一个版本编译出来的才行
- Go 在这方面目前还不太完善,只能源码发布
18.IDL管理的话,有什么成熟的套件可以使用么?
- 公司内一般都是自研的。。
- IDL - CI/CD 要打通
- 同学提出可以参考 erda
19.依赖反转的例子没太懂,可以用个代码说明下吗?就算用了interface,调用方还是要切换的吧?
- 调用方需要切换,但一般只需要改一下初始化代码就可以了
- 如果有依赖注入方案的话,可能改一行配置就可以了
- 切换过程不侵入到业务逻辑代码里的
20.cli 自动化生成代码模版这块,具体该如何实现呢?
- func getOrderList(context.Context, , ) {
- }
- 约定好的目录,把代码放进去就可以了
- ast 也可以用到
21.改造 gorm logger 下的 Trace 方法, 通过 context.Context 注入 traceID 可以定位到具体的慢查询语句以及慢查询语句对应的请求, 这种改造 Trace 的方式是否值得?
- 方便定位问题的改进都是值得的
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lihuanjie113@gmail.com