• Realm
    2021-08-01
    这两篇老师的总结很受启发。 练习: 1 在项目中一般还是使用goroutine比较多,或者atomic,或者读写锁; 2 限流可以使用令牌桶和漏桶,或者自适应限流; 问: 一个业务通过A->B->C完成,通过requestID可以串起来,假如严格一点,是不是还要搞个parnent-request-id ?

    作者回复: 不用的,日志系统会按时间戳排序的

    共 3 条评论
    5
  • helloworld
    2021-08-11
    Extend和ExtendShadow设计真的很棒,敢问灵感从哪里来的👍

    作者回复: 来源于实际开发的痛点,不过还有一种设计方法。将模型层也接口化。这个IAM项目后面会实现

    共 2 条评论
    4
  • 宙斯
    2021-08-30
    健康检查这里有两个疑问: 1 配置了健康检查会阻塞,不会运行 eg.Wait() ,这是故意阻塞在ping这里的吗? 2 健康检查ping函数for中,我查看到逻辑是这样的, a) 在启动时web服务还未启动,会出错err,每隔1s运行一次, b) 当服务正常启动后,这是能请求通畅,然后就return nil,只运行一次就不再运行了。 这个逻辑有些疑惑,健康检查不应该总是运行的么? 代码位置:iam/internal/pkg/server/genericapiserver.go 版本:当前master版本

    作者回复: 1. 是的 2. 这个是启动时的健康检查。服务的健康检查,可以通过一些旁路系统来保证,比如:kubernetes健康检查机制等。不过,你说这是个很好的思路。我记录个TODO,以后有需要更新下。

    
    3
  • helloworld
    2021-08-13
    项目源码中的var _ UserSrv = (*userService)(nil) 的目的是为了在编译阶段检查 userServer 类型是否实现了 UserSrv 的接口, 如果没有实现则panic, (*userService)(nil)这种语法是出自哪里呢, 在哪里能找到这个语法的详细说明呢, 我找了半天没找到, 只知道(*userService)(nil)用来表示类型*userService的零值.

    作者回复: Go基本语法中有。 var _ UserSrv = (*userService)(nil) 是一个赋值语句,右边是*userService类型的零值,赋值给左边的变量,如果变量类型不metch,编译器会报错

    共 3 条评论
    2
  • xgt132
    2022-08-07 来自广东
    老师你好:在 ”并发处理模板“这一模块时,当遇到错误就会返回nil, 此时剩下的协程会不会还在继续运行,这样是不是浪费了系统资源呢

    作者回复: 这个模板有点问题,我优化下

    
    1
  • NULL
    2022-08-04 来自广东
    "这样,我们下次需要新增参数的话,只需要调用 context 的 WithValue 方法:" 这样不好吧, 传递的sex可能会被修改. 也不清晰, 不知道传递了什么数据 官方文档也说 "Use context Values only for request-scoped data that transits processes and APIs, not for passing optional parameters to functions." https://pkg.go.dev/context

    作者回复: 实际情况是很多项目是这么弄得。controller-runtime会从context中传递Logger。我觉得只要传递一些通用的,感知性非常强的,就可以。WithValue确实不应该乱用

    
    1
  • Geek_63505f
    2022-01-27
    老师请问下这里 下面那个run方法是启动命令行的命令吗?我看a.cmd.Execute()命令里面是执行os.Args[1:] 。 apiserver.NewApp("iam-apiserver").Run() func (a *App) Run() { if err := a.cmd.Execute(); err != nil { fmt.Printf("%v %v\n", color.RedString("Error:"), err) os.Exit(1) } }

    作者回复: 是命令行的启动命令。

    共 2 条评论
    1
  • Geek_433b2b
    2021-12-29
    孔老师,你好。我是 Go 语言初学者,在并发处理模板这块有个疑问: 为什么在协程中不是直接对参数 user 赋值:user.TotalPolicy = policies.TotalCount,最后直接返回 users。而是重新创建一个 User 对象?包括在 ListWithBadPerformance 中也是重新创建了一个对象。 我写了个 demo 是可以正常赋值的。这样做的话不就可以不使用 map 了吗,而且也能保证顺序。

    作者回复: user是个临时变量,下一次for循环值就变了

    
    1
  • ppd0705
    2021-10-03
    请问SQL文件里面时间字段为什么是如下语句?和实际gorm的逻辑不一致 ```sql `createdAt` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `updatedAt` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', ``` 实际表现应该是如下 ```sql `createdAt` timestamp NOT NULL DEFAULT current_timestamp(), `updatedAt` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), ```

    作者回复: 感谢反馈! SQL写反了,我修复下!

    
    1
  • XI
    2021-09-23
    go func() { // 将服务在 goroutine 中启动 if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %s\n", err) } }() 优雅关停机这段代码,当前面有nginx的时候是无法拿到客户端ip的,拿到的ip 会是nginx的ip 详请可见gin 的r.run 方法

    作者回复: nginx可以配置成透传客户端IP

    共 2 条评论
    1