2020-01-22 16:14:33    701    0    0

说明 在使用client-go 在对K8S中的资源进行监听时,一段时间就会断开连接,本文对此问题记性记录

常规用法

  1. func PodWatch(watcher watch.Interface,containerName string){
  2. for {
  3. select {
  4. case msg:=<- watcher.ResultChan():
  5. event:= msg.DeepCopy()
  6. podsobj:= event.Object.(*v1.Pod)
  7. hostip:= podsobj.Status.HostIP
  8. podip:= podsobj.Status.PodIP
  9. }
  10. }
  11. }
  12. func main() {
  13. var kubeconfig *string
  14. if home := ""; home != "" {
  15. kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
  16. } else {
  17. kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
  18. }
  19. flag.Parse()
  20. config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  21. if err != nil {
  22. panic(err.Error())
  23. }
  24. // create the clientset
  25. clientset, err := kubernetes.NewForConfig(config) //创建clientset
  26. if err != nil {
2016-08-02 13:26:50    195    0    0

一、sql书写规范:

  1、sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。
  
  2、连接符or、in、and、以及=、<=、>=等前后加上一个空格。
  
  3、对较为复杂的sql语句加上注释,说明算法、功能。
  
   注释风格:注释单独成行、放在语句前面。
    (1)   应对不易理解的分支条件表达式加注释;
    (2)   对重要的计算应说明其功能;
    (3)   过长的函数实现,应将其语句按实现的功能分段加以概括性说明;
    (4)   每条SQL语句均应有注释说明(表名、字段名)。
    (5)  常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)
    (6)  可采用单行/多行注释。(-- 或 /* */ 方式)
  
  4、SQL语句的缩进风格
  
    (1)  一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进
    (2)  where子句书写时,每个条件占一行,语句另起一行时,以保留字或者连接符开始,连接符右对齐。
  
  5、多表连接时,使用表的别名来引用列。
  
  6、供别的文件或函数调用的函数,绝不应使用全局变量交换数据;
    
    如例(1)
  

二、书写优化性能建议

  1、避免嵌套连接。例如:A = B and B = C and C = D
  
  2、where条件中尽量减少使用常量比较,改用主机变量
  
  3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。
  
  4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。
  
   如必须使用排序操作,请遵循如下规则:
  
    (1)  排序尽量建立在有索引的列上。
    (2)  如结果集不需唯一,使用union all代替union。
  
  5、索引的使用。
    
    (1)  尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。
    (2)  尽量注意比较值与索引列数据类型的一致性。
    (3)  对于复合索引,SQL

2020-01-10 16:42:05    372    0    0

我希望在项目中引用本地的另外一个项目中的代码
结构如下
module mode1.com/mode1
文件结构

  1. gomode1
  2. apkg
  3. apkg.go
  4. bpkg
  5. bpkg.go
  6. go.mod

其中apkg.go 的内容为

  1. package apkg
  2. import "fmt"
  3. func Hello(){
  4. fmt.Println(" apkg 's hello\n")
  5. }

bpkg.go 的内容为

  1. package bpkg
  2. import apkg "mode1.com/mode1/apkg"
  3. import "fmt"
  4. func Test(){
  5. fmt.Println("this is Test\n")
  6. apkg.Hello()
  7. }

然后看另外一个包gomode2
文件结构
gomode2
main.go
go.mod

其中main.go 的内容为

  1. package main
  2. import "github.com/mode1/bpkg"
  3. func main(){
  4. bpkg.Test()
  5. }

我的go.mod 内容为

  1. module gomode2
  2. go 1.13
  3. require github.com/mode1 v0.0.0-incompatible
  4. replace github.com/mode1 => ../gomode1

可以看到我已经把对github.com/mode1 的引用替换成了

  1. ../gomode1

在编译的时候报错

  1. build gomode2: cannot load mode1.com/mode1/apkg: cannot find module providing package mode1.com/mode1/apkg

可以看到他说他找不到包 mode1.com/mode1/apkg
这个代码是在 bpkg.go 中引入的

问题的根本就是,当我们在引入一个包的时候,编译时会把他所有引入的包A、以及A中引入其他包的import语句都原样执行,
但是他不是跳转到对应的路径执行,而是在当前路径执行,这就出问题了

mode1.com/m