锘??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩天天综合,国产亚洲精品久,亚洲精品网站在线播放gifhttp://www.shnenglu.com/jinq0123/category/21366.htmlzh-cnMon, 22 Feb 2021 15:12:27 GMTMon, 22 Feb 2021 15:12:27 GMT60net.LookupSRV()鏌ヨk8s鏃犲ご鏈嶅姟http://www.shnenglu.com/jinq0123/archive/2021/02/22/217615.html閲戝簡閲戝簡Mon, 22 Feb 2021 08:17:00 GMThttp://www.shnenglu.com/jinq0123/archive/2021/02/22/217615.htmlhttp://www.shnenglu.com/jinq0123/comments/217615.htmlhttp://www.shnenglu.com/jinq0123/archive/2021/02/22/217615.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/217615.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/217615.html
(閲戝簡鐨勪笓鏍?2021.2)

濡備笅鍒涘緩 StatefulSet 鍜?Headless Service: test.yaml

```
apiVersion: v1
kind: Service
metadata:
  name: headless-svc
  labels:
    app: headless-svc
spec:
  ports:
  - port: 80
    name: aaaa
  - port: 20080
    name: bbbb
  selector:
    app: headless-pod
  clusterIP: None
 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-test
spec:
  serviceName: headless-svc
  replicas: 3
  selector:
    matchLabels:
      app: headless-pod
  template:
    metadata:
      labels:
        app: headless-pod
    spec:
      containers:
      - name: myhttpd
        image: httpd
        ports:
        - containerPort: 80
        - containerPort: 20080
```

閮ㄧ講錛?br />```
kubectl apply -f test.yaml
```

鐒跺悗寮涓涓?shell:
```
kubectl run mygolang -it --image golang -- bash
If you don't see a command prompt, try pressing enter.
root@mygolang:/go#
```

鍏堣涓?vim:
```
apt install vim
```

鐒跺悗鍐欎釜 golang 嫻嬭瘯紼嬪簭錛屽悜 DNS 鏌ヨ bbbb 鏈嶅姟鐨勫湴鍧涓庣鍙o細
```
root@mygolang:/jinqing# cat main.go
package main

import (
    "fmt"
    "github.com/davecgh/go-spew/spew"
    "net"
)

func main() {
    cname, addresses, err := net.LookupSRV("bbbb", "tcp", "headless-svc.default.svc.cluster.local")
    if err != nil {
        fmt.Printf("failed: %s\n", err)
    }
    fmt.Printf("cname: %s\n", cname)
    spew.Dump(addresses)
}
root@mygolang:/jinqing#
```

榪愯緇撴灉涓猴細
```
cname: _bbbb._tcp.headless-svc.default.svc.cluster.local.
([]*net.SRV) (len=3 cap=4) {
 (*net.SRV)(0xc00000e220)({
  Target: (string) (len=58) "statefulset-test-0.headless-svc.default.svc.cluster.local.",
  Port: (uint16) 20080,
  Priority: (uint16) 0,
  Weight: (uint16) 33
 }),
 (*net.SRV)(0xc00000e1e0)({
  Target: (string) (len=58) "statefulset-test-2.headless-svc.default.svc.cluster.local.",
  Port: (uint16) 20080,
  Priority: (uint16) 0,
  Weight: (uint16) 33
 }),
 (*net.SRV)(0xc00000e200)({
  Target: (string) (len=58) "statefulset-test-1.headless-svc.default.svc.cluster.local.",
  Port: (uint16) 20080,
  Priority: (uint16) 0,
  Weight: (uint16) 33
 })
}
```

澶氭榪愯鍙戠幇緇撴灉欏規搴忓浐瀹氾紝騫舵病鏈夋寜鏉冮噸闅忔満銆?br />
Service yaml 瀹氫箟涓紝蹇呴』涓烘瘡涓鍙e懡鍚嶏紝涓嶇劧娌℃硶鏌ヨ銆?br />
```
    cname, addresses, err := net.LookupSRV("bbbb", "tcp", "headless-svc.default.svc.cluster.local")
```
鍙埄鐢ㄩ粯璁ゅ煙鍚嶅悗緙綆鍐欎負
```
    cname, addresses, err := net.LookupSRV("bbbb", "tcp", "headless-svc")
```
杈撳嚭鐩稿悓銆?br />


閲戝簡 2021-02-22 16:17 鍙戣〃璇勮
]]>
rpc搴旂瓟澶揩閫犳垚璇鋒眰瓚呮椂http://www.shnenglu.com/jinq0123/archive/2020/09/17/217453.html閲戝簡閲戝簡Thu, 17 Sep 2020 07:59:00 GMThttp://www.shnenglu.com/jinq0123/archive/2020/09/17/217453.htmlhttp://www.shnenglu.com/jinq0123/comments/217453.htmlhttp://www.shnenglu.com/jinq0123/archive/2020/09/17/217453.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/217453.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/217453.html
(閲戝簡鐨勪笓鏍?2020.9)

鍦ㄥ帇嫻嬩腑鍙戠幇鎬繪湁鍑犱釜璇鋒眰瓚呮椂錛岃秴鏃舵椂闀胯澶т篃浼氭湁錛岃屾垚鍔熺殑璇鋒眰寤舵椂榪滃皬浜庤秴鏃舵椂闂淬?br />鏌ラ敊鐨勭涓鏂瑰悜鏄煡緗戠粶搴撲腑鏈夋秷鎭涪澶便?br />璺熻釜鎵鏈夋秷鎭紝鍙戠幇瓚呮椂鐨勬秷鎭簲璇ユ槸姝e父澶勭悊騫惰繑鍥炰簡銆?br />浜庢槸鏌ユ帴鏀跺簲絳旀秷鎭悗鐨勫鐞嗭紝鏈緇堟壘鍒頒唬鐮侊細
```go
func (c *Client) onRpcRet(cbIndex uint32, ...) {
    ii, ok := c.callbacks.Load(cbIndex)
    if !ok {
        // logger.Errorf("onRpcRet can not find cbIndex %d", cbIndex) // 鍙兘鏄秴鏃跺凡鍒?br />        return
    }
```
鎵撳紑鏃ュ織錛屽彂鐜拌秴鏃剁殑璇鋒眰瀵瑰簲鏈夎鏉¢敊璇棩蹇椼?br />姝ゅ鍥炶皟涓嶅瓨鍦ㄧ殑鎯呭喌錛屾甯告槸鍏堣秴鏃跺垹闄ゅ洖璋冿紝鐒跺悗鍐嶆敹鍒板簲絳斻?br />鐜板湪鏄厛鏀跺埌浜嗗簲絳旓紝鍙戠幇鎵句笉鍒板洖璋冿紝鐒跺悗榪囦簡涓孌墊椂闂翠細琚垽涓鴻秴鏃舵棤鍝嶅簲銆?br />
灝嗕笅闈唬鐮佹崲涓搴忓氨濂戒簡錛?br />```go
    if err := c.Session.Send(msg); err != nil {
        ...
        return
    }
    c.callbacks.Store(cbIndex, ...)
```
鏀逛負
```go
    // 蹇呴』鍏堣鍥炶皟錛岀劧鍚庡彂閫侊紝鍥犱負搴旂瓟鍙兘浼氬緢蹇?br />    c.callbacks.Store(cbIndex, ...)
    if err := c.Session.Send(msg); err...
```

鍘嬫祴鏃跺洜涓哄姞鍘嬫満CPU鏄弧璐熻澆榪愯漿錛屾墍浠?Send() 鍜?Store() 涔嬮棿鍙兘浼氶棿闅旀暟姣錛?br />瓚沖 rpc 璇鋒眰澶勭悊瀹屾垚騫惰繑鍥烇紝鑰屽簲絳旇繑鍥炴椂鍥炶皟榪樻病璁劇疆銆?br />
鍏?Send() 鍚?Store() 鍐欎唬鐮佷細紼嶅井綆鍗曠偣錛屽洜涓?Send() 澶辮觸鍚庡彲浠ョ洿鎺ヨ繑鍥炪?br />鍏?Store() 鍚?Send() 鏃訛紝Send() 澶辮觸鍒欓渶瑕佺浉搴?Delete().



閲戝簡 2020-09-17 15:59 鍙戣〃璇勮
]]>
golang鍚勬暟鍊肩被鍨嬬殑鏈澶ф渶灝忓?/title><link>http://www.shnenglu.com/jinq0123/archive/2020/09/11/217443.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Fri, 11 Sep 2020 06:55:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2020/09/11/217443.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/217443.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2020/09/11/217443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/217443.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/217443.html</trackback:ping><description><![CDATA[# golang鍚勬暟鍊肩被鍨嬬殑鏈澶ф渶灝忓?br /><br />(閲戝簡鐨勪笓鏍?2020.9)<br /><br />golang 鐨?math 鍖呭凡緇忓畾涔変簡浠ヤ笅甯擱噺錛?br /><br />Constants<br /><br />```<br />const (<br />    E   = 2.71828182845904523536028747135266249775724709369995957496696763 // https://oeis.org/A001113<br />    Pi  = 3.14159265358979323846264338327950288419716939937510582097494459 // https://oeis.org/A000796<br />    Phi = 1.61803398874989484820458683436563811772030917980576286213544862 // https://oeis.org/A001622<br /><br />    Sqrt2   = 1.41421356237309504880168872420969807856967187537694807317667974 // https://oeis.org/A002193<br />    SqrtE   = 1.64872127070012814684865078781416357165377610071014801157507931 // https://oeis.org/A019774<br />    SqrtPi  = 1.77245385090551602729816748334114518279754945612238712821380779 // https://oeis.org/A002161<br />    SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038 // https://oeis.org/A139339<br /><br />    Ln2    = 0.693147180559945309417232121458176568075500134360255254120680009 // https://oeis.org/A002162<br />    Log2E  = 1 / Ln2<br />    Ln10   = 2.30258509299404568401799145468436420760110148862877297603332790 // https://oeis.org/A002392<br />    Log10E = 1 / Ln10<br />)<br />```<br /><br />Mathematical constants.<br /><br />```<br />const (<br />    MaxFloat32             = 3.40282346638528859811704183484516925440e+38  // 2**127 * (2**24 - 1) / 2**23<br />    SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23)<br /><br />    MaxFloat64             = 1.797693134862315708145274237317043567981e+308 // 2**1023 * (2**53 - 1) / 2**52<br />    SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)<br />)<br />```<br /><br />Floating-point limit values. Max is the largest finite value representable by the type. SmallestNonzero is the smallest positive, non-zero value representable by the type.<br /><br />```<br />const (<br />    MaxInt8   = 1<<7 - 1<br />    MinInt8   = -1 << 7<br />    MaxInt16  = 1<<15 - 1<br />    MinInt16  = -1 << 15<br />    MaxInt32  = 1<<31 - 1<br />    MinInt32  = -1 << 31<br />    MaxInt64  = 1<<63 - 1<br />    MinInt64  = -1 << 63<br />    MaxUint8  = 1<<8 - 1<br />    MaxUint16 = 1<<16 - 1<br />    MaxUint32 = 1<<32 - 1<br />    MaxUint64 = 1<<64 - 1<br />)<br />```<br />Integer limit values. <img src ="http://www.shnenglu.com/jinq0123/aggbug/217443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2020-09-11 14:55 <a href="http://www.shnenglu.com/jinq0123/archive/2020/09/11/217443.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍙傛暟澶伒媧誨鏄撳嚭閿?/title><link>http://www.shnenglu.com/jinq0123/archive/2020/07/24/217407.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Fri, 24 Jul 2020 01:15:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2020/07/24/217407.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/217407.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2020/07/24/217407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/217407.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/217407.html</trackback:ping><description><![CDATA[鍙傛暟澶伒媧誨鏄撳嚭閿?br /><br />(閲戝簡鐨勪笓鏍?2020.7)<br /><br />golang涓彲浠ュ皢鍙傛暟綾誨瀷璁句負 interface{}, 榪欐牱灝卞彲浠ヤ紶鍏ヤ換鎰忕被鍨嬬殑鍙傛暟錛?br />鍜?C++ 涓?void* 鐨勪綔鐢ㄧ浉浼箋?br />浣嗘槸榪欑涓囪兘綾誨瀷搴旇灝介噺灝戠敤錛屽敖閲忎嬌鐢ㄥ叿浣撶殑綾誨瀷錛屾垨鑰呬嬌鐢ㄤ竴涓叿浣撶殑鎺ュ彛綾誨瀷銆?br />涓昏鐨勫師鍥犳槸, 璁╃紪璇戞湡鐨勭被鍨嬫鏌ユ尅浣忕紪鐮侀敊璇紝鍑忓皯榪愯鏈熺殑閿欒銆?br /><br />渚嬪錛実o-mongo-driver 鏈変釜鍒涘緩绱㈠紩鐨勫弬鏁幫細<br />```<br />type IndexModel struct {<br />    // A document describing which keys should be used for the index. It cannot be nil.<br />    // This must be an order-preserving type such as bson.D. Map types such as bson.M are not valid.<br />    Keys interface{}<br />    ...<br />}<br />```<br /><br />鍏朵腑 Keys 鍙互鏄換鎰忕被鍨嬶紝濡?1234, "abcd", 褰撶劧涓嶇鍚堢儲寮曡姹傜殑綾誨瀷浼氳繑鍥炲け璐ャ?br />浣嗘槸 bson.M 綾誨瀷錛屼細鍒涘緩绱㈠紩鎴愬姛錛屼絾鏄儲寮曠殑嬈″簭浼氭湁閿欒銆?br />娉ㄩ噴涓凡鎸囧嚭錛屼笉瑕佺敤 bson.M, 搴旇浣跨敤 bson.D.<br /><br />姝g‘鐨?Keys 濡備笅錛岃〃紺哄鍚堢儲寮?(field1, field2)錛?琛ㄧず姝e簭錛?1鍒欏弽搴忥細<br />```<br />    indexModel.Keys := bson.D{{"field1", 1}, {"field2", 1}}<br />```<br /><br />濡傛灉浣跨敤 bson.M, 瀹為檯涓婃槸涓?map錛?br />```<br />    indexModel.Keys := bson.M{"field1"錛?, "field2": 1}<br />```<br />鍥犱負 map 鎴愬憳鐨勬搴忎笉瀹氾紝鏈鍚庡垱寤虹殑绱㈠紩鍙兘鏄?(field1, field2)錛屼篃鍙兘鏄?(field2, field1)銆?br /><br />姝ゅ綾誨瀷鍏佽 interface{} 鐨勬兂娉曟槸錛屽厑璁鎬換鎰忕被鍨嬶紝浼?bson 緙栫爜鍚庝紶緇?mongo 鏈嶅姟鍣紝騫朵笉浼氳繘琛岀被鍨嬫鏌ャ?br />榪欑鐏墊椿鎬ч潪甯稿鏄撻犳垚閿欒錛屽茍涓斿浣曚嬌鐢ㄤ篃涓嶆槑紜? 浠呴潬娉ㄩ噴浣滅敤寰堝皬銆?br /><br /><img src ="http://www.shnenglu.com/jinq0123/aggbug/217407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2020-07-24 09:15 <a href="http://www.shnenglu.com/jinq0123/archive/2020/07/24/217407.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>grpc澶栭儴璐熻澆鍧囪 鍣ㄦ祴璇?/title><link>http://www.shnenglu.com/jinq0123/archive/2020/04/17/217239.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Fri, 17 Apr 2020 02:08:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2020/04/17/217239.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/217239.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2020/04/17/217239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/217239.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/217239.html</trackback:ping><description><![CDATA[# grpc澶栭儴璐熻澆鍧囪 鍣ㄦ祴璇?br /><br />(閲戝簡鐨勪笓鏍?2020.4)<br /><br />grpc 瀵規瘡涓姹傝繘琛岃礋杞藉潎琛°傝礋杞藉潎琛$殑鏂瑰紡鏈夛細<br /><br />* 浠g悊妯″紡<br />* 瀹㈡埛绔疄鐜?br />* 澶栭儴璐熻澆鍧囪 <br /><br />鍙傝冿細gRPC LB https://blog.csdn.net/xiaojia1100/article/details/78842295<br /><br />gRPC 涓礋杞藉潎琛$殑涓昏鏈哄埗鏄閮ㄨ礋杞藉潎琛°?br /><br />gRPC 瀹氫箟浜嗗閮ㄨ礋杞藉潎琛℃湇鍔$殑鎺ュ彛錛歨ttps://github.com/grpc/grpc/tree/master/src/proto/grpc/lb/v1<br /><br />* load_balancer.proto 瀹㈡埛绔悜 lb 鏈嶆煡璇㈠悗绔垪琛?br />* load_reporter.proto lb 鏈嶅悜鍚庣鏈嶆煡璇㈣礋杞?br /><br />https://github.com/bsm/grpclb 瀹炵幇浜嗕竴涓?grpc 鐨勫閮ㄨ礋杞藉潎琛℃湇銆?br />鍥犱負鍏跺疄鐜版棭浜庤礋杞藉潎琛℃湇鐨勬帴鍙h鑼冿紝鎵浠ユ帴鍙e畾涔変笌 grpc 瑙勮寖涓嶅悓銆?br />瑙?issue#26: https://github.com/bsm/grpclb/issues/26#issuecomment-613873655<br />grpclb 鐩墠浠呮敮鎸?consul 鏈嶅姟鍙戠幇銆?br /><br />鏍囧噯鐨?grpclb 瀹炵幇鐩墠濂藉儚鍙湁 https://github.com/joa/jawlb銆?br />jawlb 閫氳繃 Kubernetes API 鏉ュ彂鐜版湇鍔°?br /><br />浠ヤ笅嫻嬭瘯 grpc 瀹㈡埛绔粠 jawlb 鏈嶆煡璇㈡湇鍔″櫒鍒楄〃錛岀劧鍚庤姹傛湇鍔°?br />棣栧厛鍦ㄦ湰鏈哄紑浜嗗涓?greeter 鏈嶅疄渚嬶紝绔彛涓嶅悓銆?br />鐒跺悗鏇存敼 greeter 瀹㈡埛绔紝涓嶈鐩存帴榪?greeter 鏈嶅湴鍧錛岃屾槸閰嶄竴涓?jawlb 鏈嶅湴鍧銆?br />鍚屾椂鏇存敼 jawlb, 鍒犻櫎鏈嶅姟鍙戠幇錛屾敼涓哄浐瀹氳緭鍑烘湰鏈烘湇鍔″垪琛紝瀹氭椂鍒囨崲銆?br /><br />greeter 鏄寚 grpc-go 涓殑渚嬪瓙錛歡rpc-go\examples\helloworld\greeter<br /><br />## greeter 鏈嶆洿鏀?br /><br />娣誨姞鍙傛暟鎸囧畾鏈嶅姟绔彛銆?br /><br />```<br />package main<br /><br />import (<br />    "fmt"<br />    "log"<br />    "net"<br /><br />    "github.com/spf13/pflag"<br />    "github.com/spf13/viper"<br />    "golang.org/x/net/context"<br />    "google.golang.org/grpc"<br />    pb "google.golang.org/grpc/examples/helloworld/helloworld"<br />)<br /><br />// GreeterServer is used to implement helloworld.GreeterServer.<br />type GreeterServer struct {<br />}<br /><br />// SayHello implements helloworld.GreeterServer<br />func (s *GreeterServer) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {<br />    msg := fmt.Sprintf("Hello %s from server-%d", in.Name, viper.GetInt("port"))<br />    return &pb.HelloReply{Message: msg}, nil<br />}<br /><br />func main() {<br />    pflag.Int("port", 8000, "server bind port")<br />    pflag.Parse()<br />    viper.BindPFlags(pflag.CommandLine)<br />    port := viper.GetInt("port")<br /><br />    addr := fmt.Sprintf(":%d", port)<br />    lis, err := net.Listen("tcp", addr)<br />    if err != nil {<br />        log.Fatalf("failed to listen: %v", err)<br />    }<br />    s := grpc.NewServer()<br />    pb.RegisterGreeterServer(s, &GreeterServer{})<br />    s.Serve(lis)<br />}<br />```<br /><br />## greeter 瀹㈡埛绔洿鏀?br />```<br />package main<br /><br />import (<br />    "context"<br />    "log"<br />    "os"<br />    "time"<br /><br />    "github.com/sirupsen/logrus"<br />    "google.golang.org/grpc"<br />    _ "google.golang.org/grpc/balancer/grpclb"<br />    pb "google.golang.org/grpc/examples/helloworld/helloworld"<br />    "google.golang.org/grpc/grpclog"<br />    "google.golang.org/grpc/resolver"<br />    "google.golang.org/grpc/resolver/manual"<br />)<br /><br />const (<br />    defaultName = "world"<br />)<br /><br />func init() {<br />    grpclog.SetLogger(logrus.New())<br />}<br /><br />func main() {<br />    rb := manual.NewBuilderWithScheme("whatever")<br />    rb.InitialState(resolver.State{Addresses: []resolver.Address{<br />        {Addr: "127.0.0.1:8888", Type: resolver.GRPCLB},<br />    }})<br /><br />    conn, err := grpc.Dial("whatever:///this-gets-overwritten", grpc.WithInsecure(), grpc.WithBlock(),<br />        grpc.WithResolvers(rb))<br />    if err != nil {<br />        log.Fatalf("did not connect: %v", err)<br />    }<br />    defer conn.Close()<br />    c := pb.NewGreeterClient(conn)<br /><br />    name := defaultName<br />    if len(os.Args) > 1 {<br />        name = os.Args[1]<br />    }<br /><br />    for {<br />        ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)<br />        r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})<br />        cancel()<br /><br />        if err != nil {<br />            log.Fatalf("could not greet: %v", err)<br />            time.Sleep(time.Second)<br />            continue<br />        }<br /><br />        log.Printf("Greeting: %s", r.GetMessage())<br />        time.Sleep(time.Second)<br />    }<br />}<br />```<br /><br />鏈変互涓嬫洿鏀癸細<br />* import _ "google.golang.org/grpc/balancer/grpclb"<br />* grpc.Dial("whatever:///this-gets-overwritten", grpc.WithResolvers(rb))<br />    + 閲囩敤涓涓嚜瀹氫箟瑙f瀽鍣紝鐢ㄦ潵鑾峰彇 jawlb 鍦板潃<br />    + Scheme("whatever") 鍙互浠繪剰錛岀敤浣滆В鏋愬櫒鍚嶅瓧<br />    + 鐩爣 this-gets-overwritten 鍙互浠繪剰錛屽洜涓?jawlb 蹇界暐浜嗚鍚嶅瓧<br />    + 127.0.0.1:8888 鏄?jawlb 鍦板潃<br />* 鏀逛負姣忕璇鋒眰涓嬈?br /><br />姝e父鐨?grpclb 鏄湪 DNS 涓緗?SRV 璁板綍錛?br />姝ゅ嫻嬭瘯閬垮厤璁劇疆 DNS, 閲囩敤浜嗕竴涓嚜瀹氫箟瑙f瀽鍣紝<br />浠g爜涓婂浜嗗嚑琛屻?br />鐢?DNS 璁劇疆鐨勫ソ澶勬槸, 鍙互鐩存帴瑙f瀽涓哄悗绔?IP, 涔熷彲浠ユ坊鍔?grpclb, 浠g爜涓婂鍚岀洿鎺ヨ繛鎺ュ悗绔細<br />```<br />    conn, err := grpc.Dial("dns:///myservice.domain.com", grpc.WithInsecure())<br />```<br /><br />## jawlb 鏇存敼<br /><br />### main.go<br /><br />鍒犻櫎鎵鏈夐厤緗紝鏀逛負鍥哄畾鏈満 8888 绔彛鐩戝惉銆?br /><br />* 鍒犻櫎 `envconfig.MustProcess("JAWLB", &cfg)`<br />* listen() 鏀逛負<br />    ```<br />    func listen() (conn net.Listener, err error) {<br />        conn, err = net.Listen("tcp", ":8888")<br />        return<br />    }<br />    ```<br />    <br />### watch.go<br /><br />```<br />package main<br /><br />import (<br />    "context"<br />    "fmt"<br />    "net"<br />    "time"<br />)<br /><br />func watchService(ctx context.Context) (_ <-chan ServerList, err error) {<br />    ch := make(chan ServerList)<br /><br />    go func() {<br />        ticker := time.NewTicker(10 * time.Second)<br />        i := 0<br />        for {<br />            select {<br />            case <-ctx.Done():<br />                ticker.Stop()<br />                close(ch)<br />                return<br />            case <-ticker.C:<br />                i += 1<br />                fmt.Printf("i = %d\n", i)<br />                ports := []int32{8010, 8020}<br />                var servers []Server<br />                for _, port := range ports {<br />                    servers = append(servers, Server{IP: net.ParseIP("127.0.0.1"), Port: port + int32(i%2)})<br />                }<br />                ch <- servers<br />            } // select<br />        } // for<br />    }()<br /><br />    return ch, nil<br />}<br />```<br /><br />鍒犻櫎鎵鏈夋湇鍔″彂鐜頒唬鐮侊紝鏀逛負姣?0縐掑垏鎹㈢鍙o細8010,8020 <-> 8011,8021<br /><br />## 榪愯<br /><br />### jawlb<br />```<br />λ jawlb.exe<br />2020/04/16 15:35:17 waiting for TERM<br />i = 1<br />2020/04/16 15:35:27 endpoints:<br />2020/04/16 15:35:27     127.0.0.1:8011<br />2020/04/16 15:35:27     127.0.0.1:8021<br />i = 2<br />2020/04/16 15:35:37 endpoints:<br />2020/04/16 15:35:37     127.0.0.1:8010<br />2020/04/16 15:35:37     127.0.0.1:8020<br />```<br /><br />### server<br /><br />榪愯 4 涓疄渚嬶細<br />```<br />server --port 8010<br />server --port 8020<br />server --port 8011<br />server --port 8021<br />```<br /><br />### client<br /><br />```<br />λ client<br />INFO[0002] lbBalancer: handle SubConn state change: 0xc00008a590, CONNECTING<br />INFO[0002] Channel Connectivity change to CONNECTING<br />INFO[0002] lbBalancer: handle SubConn state change: 0xc00008a5f0, CONNECTING<br />INFO[0002] Subchannel picks a new address "127.0.0.1:8021" to connect<br />INFO[0002] Subchannel Connectivity change to READY<br />INFO[0002] lbBalancer: handle SubConn state change: 0xc00008a590, READY<br />INFO[0002] Channel Connectivity change to READY<br />INFO[0002] Subchannel Connectivity change to READY<br />INFO[0002] lbBalancer: handle SubConn state change: 0xc00008a5f0, READY<br />2020/04/16 15:37:47 Greeting: Hello world from server-8021<br />2020/04/16 15:37:48 Greeting: Hello world from server-8011<br />2020/04/16 15:37:49 Greeting: Hello world from server-8021<br />2020/04/16 15:37:50 Greeting: Hello world from server-8011<br />2020/04/16 15:37:51 Greeting: Hello world from server-8021<br />2020/04/16 15:37:52 Greeting: Hello world from server-8011<br />2020/04/16 15:37:53 Greeting: Hello world from server-8021<br />2020/04/16 15:37:54 Greeting: Hello world from server-8011<br />2020/04/16 15:37:55 Greeting: Hello world from server-8021<br />2020/04/16 15:37:56 Greeting: Hello world from server-8011<br />INFO[0012] lbBalancer: processing server list: servers:<ip_address:"\000\000\000\000\000\000\000\000\000\000\377\377\177\000\000\001" port:8020 > servers:<ip_address:"\000\000\000\000\000\000\000\000\000\000\377\377\177\000\000\001" port:8010 ><br />INFO[0012] lbBalancer: server list entry[0]: ipStr:|127.0.0.1|, port:|8020|, load balancer token:||<br />INFO[0012] lbBalancer: server list entry[1]: ipStr:|127.0.0.1|, port:|8010|, load balancer token:||<br />2020/04/16 15:37:57 Greeting: Hello world from server-8020<br />2020/04/16 15:37:58 Greeting: Hello world from server-8010<br />2020/04/16 15:37:59 Greeting: Hello world from server-8020<br />2020/04/16 15:38:00 Greeting: Hello world from server-8010<br />2020/04/16 15:38:01 Greeting: Hello world from server-8020<br />2020/04/16 15:38:02 Greeting: Hello world from server-8010<br />2020/04/16 15:38:03 Greeting: Hello world from server-8020<br />2020/04/16 15:38:04 Greeting: Hello world from server-8010<br />2020/04/16 15:38:05 Greeting: Hello world from server-8020<br />2020/04/16 15:38:06 Greeting: Hello world from server-8010<br />INFO[0022] lbBalancer: processing server list: servers:<ip_address:"\000\000\000\000\000\000\000\000\000\000\377\377\177\000\000\001" port:8021 > servers:<ip_address:"\000\000\000\000\000\000\000\000\000\000\377\377\177\000\000\001" port:8011 ><br />INFO[0022] lbBalancer: server list entry[0]: ipStr:|127.0.0.1|, port:|8021|, load balancer token:||<br />INFO[0022] lbBalancer: server list entry[1]: ipStr:|127.0.0.1|, port:|8011|, load balancer token:||<br />2020/04/16 15:38:07 Greeting: Hello world from server-8011<br />2020/04/16 15:38:08 Greeting: Hello world from server-8021<br />2020/04/16 15:38:09 Greeting: Hello world from server-8011<br />```<br /><br />## 緇撹<br /><br />瀹㈡埛绔簲鐢ㄤ竴涓嚜瀹氫箟 resolver 瑙f瀽 "whatever:///this-gets-overwritten"錛?br />鑾峰彇鍒?`{Addr: "127.0.0.1:8888", Type: resolver.GRPCLB}`, <br />鐭ラ亾榪欐槸涓涓?grpclb錛屼簬鏄寜 load_balancer.proto 鐨勫畾涔夋煡璇?jawlb 鏉ヨ幏鍙栧悗绔湴鍧鍒楄〃銆?br /><br />jawlb 姣?10s 鏇存柊涓嬈℃湇鍔″櫒鍒楄〃錛屾瘡嬈¤緭鍑哄涓湴鍧銆傚鎴風鍦ㄥ涓湴鍧闂磋疆鎹㈣姹傘?br /><br />## 鍏朵粬嫻嬭瘯<br /><br />* 涓嶅紑 jawlb錛屽鎴風灝嗘棤娉曟垚鍔熻姹傦紝鐩村埌 jawlb 寮鍚墠鎴愬姛<br />* 涓斿叧闂?jawlb, 璇鋒眰浠嶄細鎴愬姛錛屼絾鏄繚鎸佷負鏈鍚庣殑鏈嶅姟鍣ㄥ垪琛?br />    + 鍚屾椂浼氫笉鏂皾璇曢噸榪?jawlb, 浣嗘槸閲嶈繛鎴愬姛鍚庢病鏈夊垏鎹㈡湇鍔★紝搴旇鏄釜閿欒<br />* Dial() 涓嶅姞 grpc.WithBlock() 鍙傛暟, 鎶ラ敊錛歛ll SubConns are in TransientFailure <br /><br />```<br />λ client<br />INFO[0000] parsed scheme: "whatever"<br />INFO[0000] ccResolverWrapper: sending update to cc: {[{127.0.0.1:8888  <nil> 1 <nil>}] <nil> <nil>}<br />INFO[0000] ClientConn switching balancer to "grpclb"<br />INFO[0000] Channel switches to new LB policy "grpclb"<br />INFO[0000] lbBalancer: UpdateClientConnState: {ResolverState:{Addresses:[{Addr:127.0.0.1:8888 ServerName: Attributes:<nil> Type:1 Metadata:<nil>}] ServiceConfig:<nil> Attributes:<nil>} BalancerConfig:<nil>}<br />INFO[0000] parsed scheme: "grpclb-internal"<br />INFO[0000] ccResolverWrapper: sending update to cc: {[{127.0.0.1:8888  <nil> 0 <nil>}] <nil> <nil>}<br />INFO[0000] ClientConn switching balancer to "pick_first"<br />INFO[0000] Channel switches to new LB policy "pick_first"<br />INFO[0000] Subchannel Connectivity change to CONNECTING<br />INFO[0000] blockingPicker: the picked transport is not ready, loop back to repick<br />INFO[0000] pickfirstBalancer: HandleSubConnStateChange: 0xc00003fb10, {CONNECTING <nil>}<br />INFO[0000] Channel Connectivity change to CONNECTING<br />INFO[0000] Subchannel picks a new address "127.0.0.1:8888" to connect<br />INFO[0000] CPU time info is unavailable on non-linux or appengine environment.<br />INFO[0000] Subchannel Connectivity change to READY<br />INFO[0000] pickfirstBalancer: HandleSubConnStateChange: 0xc00003fb10, {READY <nil>}<br />INFO[0000] Channel Connectivity change to READY<br />INFO[0000] lbBalancer: processing server list: servers:<ip_address:"\000\000\000\000\000\000\000\000\000\000\377\377\177\000\000\001" port:8010 > servers:<ip_address:"\000\000\000\000\000\000\000\000\000\000\377\377\177\000\000\001" port:8020 ><br />INFO[0000] lbBalancer: server list entry[0]: ipStr:|127.0.0.1|, port:|8010|, load balancer token:||<br />INFO[0000] lbBalancer: server list entry[1]: ipStr:|127.0.0.1|, port:|8020|, load balancer token:||<br />INFO[0000] Subchannel Connectivity change to CONNECTING<br />INFO[0000] Subchannel Connectivity change to CONNECTING<br />INFO[0000] Channel Connectivity change to TRANSIENT_FAILURE<br />INFO[0000] lbBalancer: handle SubConn state change: 0xc00008a220, CONNECTING<br />INFO[0000] Channel Connectivity change to CONNECTING<br />INFO[0000] lbBalancer: handle SubConn state change: 0xc00008a280, CONNECTING<br />2020/04/16 16:40:06 could not greet: rpc error: code = Unavailable desc = all SubConns are in TransientFailure<br />```<br /><br /><br /><img src ="http://www.shnenglu.com/jinq0123/aggbug/217239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2020-04-17 10:08 <a href="http://www.shnenglu.com/jinq0123/archive/2020/04/17/217239.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鏁扮粍make鍙傛暟閿欒http://www.shnenglu.com/jinq0123/archive/2020/03/19/217210.html閲戝簡閲戝簡Thu, 19 Mar 2020 05:38:00 GMThttp://www.shnenglu.com/jinq0123/archive/2020/03/19/217210.htmlhttp://www.shnenglu.com/jinq0123/comments/217210.htmlhttp://www.shnenglu.com/jinq0123/archive/2020/03/19/217210.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/217210.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/217210.html
(閲戝簡鐨勪笓鏍?2020.3)

鐢?mgo 鐨?Bulk 鎺ュ彛鎿嶄綔 mongodb 鐨勪唬鐮侊紝鍦?mongodb 4.2 姝e父錛?br />鑰岃繛 mongodb 2.6 鎶ラ敊錛?br />```
error parsing element 0 of field documents :: caused by :: wrong type for '0' field, expected object, found 0: null
```

浠g爜濡備笅錛?br />```
func (u *Util) AddUsers(userIDs []int) error {
    docs := make([]interface{}, len(userIDs))
    for _, userID := range userIDs {
        docs = append(docs, dbdoc.UsersDoc{
            UserID:     userID,
        })
    }
    bulk := u.c().Bulk()
    bulk.Insert(docs...)
    _, err := bulk.Run()
    return err
}
```

璇曠潃鏀規垚濡備笅璋冪敤灝辨垚鍔燂細
```
func (u *Util) AddUsers(userIDs []int) error {
    bulk := u.c().Bulk()
    for _, userID := range userIDs {
        bulk.Insert(dbdoc.UsersDoc{
            UserID:     userID,
        })
    }
    _, err := bulk.Run()
    return err
}
```

鑰?Insert() 鏃犺鏄涓繕鏄崟涓弬鏁幫紝搴曞眰瀹炵幇鏄竴鏍風殑銆?br />
杈撳叆鍗曚釜濡?[]int{123} 榪樻槸鍑洪敊.
灝?Insert(docs...) 鏀規垚 Insert(docs[0]) 鏃跺彂鐜板厓绱犱負絀恒?br />鏈緇堟壘鍒頒簡閿欒鐨勪唬鐮佽錛?br />```
-    docs := make([]interface{}, len(userIDs))
+    docs := make([]interface{}, 0, len(userIDs))
```

楂樼増鏈殑mongodb緇撴灉姝g‘搴旇鏄粬蹇界暐浜嗙┖鐨勬枃妗c?br />
鎰熻 golang make() 鍗沖彲浠?涓弬鏁頒篃鍙互3涓弬鏁拌皟鐢ㄧ殑璁捐鏄釜閿欒銆?br />

閲戝簡 2020-03-19 13:38 鍙戣〃璇勮
]]>
go涓嶈瀵煎嚭channelhttp://www.shnenglu.com/jinq0123/archive/2020/03/10/217194.html閲戝簡閲戝簡Tue, 10 Mar 2020 07:58:00 GMThttp://www.shnenglu.com/jinq0123/archive/2020/03/10/217194.htmlhttp://www.shnenglu.com/jinq0123/comments/217194.htmlhttp://www.shnenglu.com/jinq0123/archive/2020/03/10/217194.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/217194.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/217194.html
(閲戝簡鐨勪笓鏍?2020.3)

瀵煎嚭 channel 鐨勫寘閮芥瘮杈冮毦鐢ㄣ傚鉤甯鎬篃涓嶄細灝嗘帴鍙h璁℃垚 channel.
浠ヤ笅鎽樿嚜錛歨ttps://studygolang.com/articles/12135?fr=sidebar

涓嶈瀵煎嚭騫跺彂鍘熻

Go 鎻愪緵浜嗛潪甯告槗浜庝嬌鐢ㄧ殑騫跺彂鍘熻錛岃繖涔熷鑷翠簡瀹冭榪囧害鐨勪嬌鐢ㄣ傛垜浠富瑕佹媴蹇冪殑鏄?channel 鍜?sync package 銆傛湁鐨勬椂鍊欐垜浠細瀵煎嚭涓涓?channel 緇欑敤鎴蜂嬌鐢ㄣ傚彟澶栦竴涓父瑙佺殑閿欒灝辨槸鍦ㄤ嬌鐢?sync.Mutex 浣滀負緇撴瀯浣撳瓧孌電殑鏃跺欐病鏈夋妸瀹冭緗垚縐佹湁銆傝繖騫朵笉鎬繪槸寰堢碂緋曪紝涓嶈繃鍦ㄥ啓嫻嬭瘯鐨勬椂鍊欏嵈闇瑕佽冭檻鐨勬洿鍔犲叏闈€?br />
褰撴垜浠鍑?channel 鐨勬椂鍊欐垜浠氨涓鴻繖涓寘鐨勭敤鎴峰甫鏉ヤ簡嫻嬭瘯涓婄殑涓浜涗笉蹇呰鐨勯夯鐑︺備綘姣忓鍑轟竴涓?channel 灝辨槸鍦ㄦ彁楂樼敤鎴峰湪嫻嬭瘯鏃跺欑殑闅懼害銆備負浜嗗啓鍑烘紜殑嫻嬭瘯錛岀敤鎴峰繀欏昏冭檻榪欎簺錛?br />
    浠涔堟椂鍊欐暟鎹彂閫佸畬鎴愩?br />    鍦ㄦ帴鍙楁暟鎹殑鏃跺欐槸鍚︿細鍙戠敓閿欒銆?br />    濡傛灉闇瑕佸湪鍖呬腑娓呯悊浣跨敤榪囩殑channel鐨勬椂鍊欒鎬庝箞鍋氥?br />    濡備綍灝?API 灝佽鎴愪竴涓帴鍙o紝浣挎垜浠笉鐢ㄧ洿鎺ュ幓璋冪敤瀹冦?br />

閲戝簡 2020-03-10 15:58 鍙戣〃璇勮
]]>
go浠g爜瑕嗙洊嫻嬭瘯http://www.shnenglu.com/jinq0123/archive/2020/02/29/217174.html閲戝簡閲戝簡Sat, 29 Feb 2020 01:10:00 GMThttp://www.shnenglu.com/jinq0123/archive/2020/02/29/217174.htmlhttp://www.shnenglu.com/jinq0123/comments/217174.htmlhttp://www.shnenglu.com/jinq0123/archive/2020/02/29/217174.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/217174.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/217174.html # go浠g爜瑕嗙洊嫻嬭瘯
(閲戝簡鐨勪笓鏍?2020.2)

鍋囪搴旂敤鍚嶄負 MyMod, 涓誨嚱鏁扮殑鏂囦歡涓?main.go, 閭e氨鍒涘緩濡備笅鐨?main_test.go 鏂囦歡錛?br />```
package main

/* 嫻嬭瘯鏁翠釜鏈嶅姟鍣ㄣ?/span>
    go test -c -covermode=count -coverpkg ./...
鐢熸垚 MyMod.test.exe. 澶嶅埗鍒?bin 鐩綍涓嬭繍琛岋細
    MyMod.test.exe --systemTest --test.coverprofile MyMod.cov
鐢熸垚浠g爜瑕嗙洊嫻嬭瘯緇撴灉 MyMod.cov, 闇瑕佸湪 go.mod 綆$悊鐨勭洰褰曚笅鎵ц
    go tool cover -html=MyMod.cov -o MyMod.html
鎵撳紑 MyMod.html 鏌ョ湅緇撴灉銆?/span>
*/

import (
    "flag"
    "fmt"
    "testing"
)

var systemTest *bool

func init() {
    systemTest = flag.Bool("systemTest", false, "Set to true when running system tests")
}

// Test started when the test binary is started. Only calls main.
func TestSystem(t *testing.T) {
    if *systemTest {
        fmt.Println("Test system...")
        main()
    }
}
```

MyMod.cov 浼氱Н绱紝鍙姞鍏?Git.
MyMod.cov 鎻愪氦鍓嶏紝闇瀵瑰叾鎺掑簭錛屾柟渚挎煡鐪?diff.

鎺掑簭鑴氭湰 sort_cov.bat 濡備笅錛?br />```
head -1 MyMod.cov > tmp.cov
cat MyMod.cov | sed '1d' | sort >> tmp.cov
cp tmp.cov MyMod.cov
del tmp.cov
pause
```



閲戝簡 2020-02-29 09:10 鍙戣〃璇勮
]]>
鑰冨療go涓鑷存ash搴?/title><link>http://www.shnenglu.com/jinq0123/archive/2020/02/22/217148.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Sat, 22 Feb 2020 04:45:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2020/02/22/217148.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/217148.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2020/02/22/217148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/217148.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/217148.html</trackback:ping><description><![CDATA[<h1> # 鑰冨療go涓鑷存ash搴?/h1><br />(閲戝簡鐨勪笓鏍?2020.2)<br /><br />github 鎼?consistent, 鎸夋槦鏁頒緷嬈″療鐪?br /><br /><h2>## stathat/consistent</h2><br />Consistent hash package for Go. <br /><br />688鏄?<br /><br />stathat 搴旇鏄釜鏁版嵁緇熻鐨勪簯鏈嶅姟銆俢onsistent琚涓烘槸鐢熶駭鍙敤鐨勩?br />鎵鏈夋枃妗i兘鍦?godoc. 紺轟緥鍜屾帴鍙g畝媧佹槗鎳傘?br /><br /><h2>## lafikl/consistent</h2><br />A Go library that implements Consistent Hashing and Consistent Hashing With Bounded Loads. <br /><br />575 鏄?br /><br />鏈夌晫璐熻澆鐨勪竴鑷存у搱甯岀畻娉?br /><br />紺轟緥涓槸 c.GetLeast() 鑾峰彇鏈灝忚礋杞斤紝涓嶅儚鏄竴鑷存ash鐨勫簲鐢ㄣ?br />浠庝唬鐮佺湅錛屽簲璇ユ槸鏈榪戠殑鏈弧杞斤紝涓嶆槸鏈灝忚礋杞姐?br /><br />`MaxLoad()`璇存槑鏄劇ず鏈澶ц礋杞芥槸鑷姩璁劇疆涓?(total_load/number_of_hosts)*1.25銆?br /><br />`const replicationFactor = 10`<br /><br />娌℃湁涓嬈¤幏鍙栧涓殑鎺ュ彛銆?br /><br /><h2>## serialx/hashring</h2><br />Consistent hashing "hashring" implementation in golang (using the same algorithm as libketama)<br /><br />367 鏄?br /><br />鏄粠 Python 搴撶Щ妞嶇殑銆傚彲浠ヨ緗?weight.<br /><br />紺轟緥<br />```<br /><span style="color: #800000;">replicaCount := 3</span><br /><span style="color: #800000;">ring := hashring.New(serversInRing)</span><br /><span style="color: #800000;">server, _ := ring.GetNodes("my_key", replicaCount)</span><br />```<br />瀹為檯涓婃槸 GetN 鐨勫姛鑳姐傚唴閮ㄥ疄鐜扮己灝?replicationFactor<br /><br /><h2>## buraksezer/consistent</h2><br />Consistent hashing with bounded loads in Golang <br /><br />263 鏄?br /><br />鏈彁渚涚己鐪乭ash鍑芥暟銆?br /><br />澶氫簡涓涓猔PartitionCount`<br /><br />c.loads 浠呯敤浜庢煡璇㈣礋杞斤紝騫舵病鏈夌敤浜庢湁鐣岃礋杞姐?br /><br />緇撹鏄繖涓笉鏄湁鐣岃礋杞界殑涓鑷存у搱甯岋紝鍚屾椂涓鑷存у搱甯岀殑瀹炵幇涓嶅悓瀵誨父銆?br /><br /><h2>## 鍏朵粬</h2><br />jump hash 涓嶈兘縐婚櫎鑺傜偣錛屼笉鑰冭檻<br /><br /><h3>### dgryski/go-jump</h3><br />go-jump: Jump consistent hashing<br /><br />281 鏄?br /><br /><h3>### lithammer/go-jump-consistent-hash</h3><br />鈿★笍 Fast, minimal memory, consistent hash algorithm  <br /><br />138 鏄?img src ="http://www.shnenglu.com/jinq0123/aggbug/217148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2020-02-22 12:45 <a href="http://www.shnenglu.com/jinq0123/archive/2020/02/22/217148.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>灝唃o鍑芥暟鎸囬拡杞負鎺ュ彛http://www.shnenglu.com/jinq0123/archive/2020/02/13/217125.html閲戝簡閲戝簡Thu, 13 Feb 2020 06:38:00 GMThttp://www.shnenglu.com/jinq0123/archive/2020/02/13/217125.htmlhttp://www.shnenglu.com/jinq0123/comments/217125.htmlhttp://www.shnenglu.com/jinq0123/archive/2020/02/13/217125.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/217125.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/217125.html# 灝唃o鍑芥暟鎸囬拡杞負鎺ュ彛
(閲戝簡鐨勪笓鏍?2020.2)

golang 涓殑鎺ュ彛濡備笅錛?br />
```
type Writer interface {
    Write func(p []byte) (n int, err error)
}
```

涓鑸珹PI鍙傛暟瑕佹眰涓涓帴鍙o紝鑰屼笉鏄竴涓嚱鏁版寚閽堬紝濡?io.Copy() 闇瑕佽緭鍏ヤ竴涓?Writer 鍜?Reader錛?br />```
func Copy(dst Writer, src Reader) (written int64, err error)
```

鑰屼笉鏄繖鏍?涓嚱鏁版寚閽堬細
```
func CopyWithFunc(writeFunc func([]byte) (int, error), readRunc func([]byte) (int, error)) (written int64, err error)
```

澶у緇熶竴浣跨敤鎺ュ彛錛岃屼笉鏄帴鍙e拰鍑芥暟鎸囬拡娣風敤錛屽彲浠ラ伩鍏岮PI澶嶆潅鍖栥?br />濡?io.Copy() 鏈?涓弬鏁幫紝濡傛灉瑕佹敮鎸佹帴鍙e拰鍑芥暟鎸囬拡娣風敤錛屽氨浼氬彉鎴?涓?Copy() 閲嶈澆銆?br />golang 娌℃湁閲嶈澆錛屽氨鍙兘鐢?涓笉鍚岀殑鍑芥暟鍚嶃?br />
鍦ㄥ疄闄呬嬌鐢ㄤ腑錛岄渶瑕佸皢鍑芥暟杞寲鎴愭帴鍙o紝鎵嶈兘璋冪敤 io.Copy().
濡傛湁涓涓嚱鏁?
```
func MyWriteFunction(p []byte) (n int, err error) {
    fmt.Print("%v",p)
    return len(p),nil
}
```
璋冪敤 io.Copy() 鏃墮渶瑕佸垱寤轟竴涓?Writer錛屽茍灝嗚鍑芥暟鎸囬拡杞瀷涓篧riter鍚庝嬌鐢ㄣ?br />榪欓噷鐢?`WriteFunc` 綾誨瀷瀹炵幇 Writer銆?br />
```
type WriteFunc func(p []byte) (n int, err error)

func (wf WriteFunc) Write(p []byte) (n int, err error) {
    return wf(p)
}
```

WriteFunc 鏈韓鏄釜涓?MyWriteFunction 鍚岀被鍨嬬殑鍑芥暟綾誨瀷錛屽悓鏃跺疄鐜頒簡 Writer 鎺ュ彛銆?br />鎵浠?MyWriteFunction 鍙互鐩存帴杞垚WriteFunc綾誨瀷鎴愪負涓涓?Writer.
榪欐牱灝卞彲浠ヨ皟鐢?io.Copy() 浜嗭細

```
io.Copy(WriteFunc(MyWriteFunction), strings.NewReader("Hello world"))
```

鍙傝冿細https://stackoverflow.com/questions/20728965/golang-function-pointer-as-a-part-of-a-struct

閲戝簡 2020-02-13 14:38 鍙戣〃璇勮
]]>
golang chan 鍏抽棴鏃剁殑鍘熷垯http://www.shnenglu.com/jinq0123/archive/2020/01/08/217067.html閲戝簡閲戝簡Wed, 08 Jan 2020 11:46:00 GMThttp://www.shnenglu.com/jinq0123/archive/2020/01/08/217067.htmlhttp://www.shnenglu.com/jinq0123/comments/217067.htmlhttp://www.shnenglu.com/jinq0123/archive/2020/01/08/217067.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/217067.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/217067.html
(閲戝簡鐨勪笓鏍?2020.1)

golang 紼嬪簭涓嫻嬪埌 DATA RACE, 鏄?chan 鍏抽棴鍜屽彂閫佸啿紿侊細

==================
WARNING: DATA RACE
Write at 0x00c000098010 by goroutine 68:
  runtime.closechan()
      /usr/lib/golang/src/runtime/chan.go:327 +0x0
  valky/common/tcp.(*Session).Close()
      /var/tmp/src/f4f4f712-7894-4d98-83dd...
  valky/common/tcp.(*Session).recvloop()
      /var/tmp/src/f4f4f712-7894-4d98-83dd...

Previous read at 0x00c000098010 by goroutine 100:
  runtime.chansend()
      /usr/lib/golang/src/runtime/chan.go:140 +0x0
  valky/common/tcp.(*Session).Send()
      /var/tmp/src/f4f4f712-7894-4d98-83dd...
  main.(*Role).sendMsg()
      /var/tmp/src/f4f4f712-7894-4d98-83dd...
==================
Found 1 data race(s)

鏌ヤ簡涓涓?chan 鍏抽棴鐨勬紜仛娉曪紝鍙戠幇浜嗕竴綃囬潪甯歌緇嗙殑鏂囩珷錛?br />[How to Gracefully Close Channels](https://go101.org/article/channel-closing.html)

鏂囦腑鎸囧嚭錛宑han 澶氭鍏抽棴錛屾垨鑰呭湪鍏抽棴鐨?chan 涓婂彂閫侊紝閮戒細 panic.
涓婇潰鐨?DATA RACE 灞炰簬騫歌繍錛屾病鏈?panic銆?br />
chan 鍏抽棴鏃剁殑鍘熷垯鏄細涓嶈鍦ㄦ帴鏀跺崗紼嬩腑鍏抽棴錛屽茍涓旓紝濡傛灉鏈夊涓彂閫佽呮椂灝變笉瑕佸叧闂璫han浜嗐?br />
涓婇潰鐨凞ATA RACE 鏄湪鎺ユ敹鍗忕▼涓叧闂璫han.

鏂囦腑璇︾粏鍒楀嚭浜嗗縐嶆柟妗堝叧闂璫han.
濡傛灉綺楁毚鐐癸紝鍙互鐩存帴鍔犱釜 recover. 鍏朵粬鏂規閮芥槸瑕佷繚璇佸彂閫佸畬鎴愬悗鍐嶅叧闂?br />


閲戝簡 2020-01-08 19:46 鍙戣〃璇勮
]]>
open-match鍖歸厤嫻佺▼http://www.shnenglu.com/jinq0123/archive/2019/01/31/216228.html閲戝簡閲戝簡Thu, 31 Jan 2019 02:21:00 GMThttp://www.shnenglu.com/jinq0123/archive/2019/01/31/216228.htmlhttp://www.shnenglu.com/jinq0123/comments/216228.htmlhttp://www.shnenglu.com/jinq0123/archive/2019/01/31/216228.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/216228.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/216228.html

# open-match鍖歸厤嫻佺▼


(閲戝簡鐨勪笓鏍?2019.1)

https://github.com/GoogleCloudPlatform/open-match

open-match 鏄竴涓氱敤鐨勬父鎴忓尮閰嶆鏋躲?br />鐢辨父鎴忔彁渚涜嚜瀹氫箟鐨勫尮閰嶇畻娉曪紙浠ocker闀滃儚鐨勬柟寮忔彁渚涳級銆?br />
鍒嗕負澶氫釜榪涚▼錛屽悇榪涚▼涔嬮棿鍏變韓涓涓?redis.

* 鍓嶇, 鎺ユ敹鐜╁鍔犲叆 redis錛屾垚鍔熷悗閫氱煡鐜╁鎴塊棿鏈嶅湴鍧
* 鍚庣錛岃緗竴灞娓告垙鐨勫尮閰嶈鍒欙紝璁劇疆鎴塊棿鏈嶅湴鍧
* MMFOrc錛屽惎鍔ㄥ尮閰嶇畻娉?MMF)
* MMF, 鑷畾涔夊尮閰嶇畻娉曪紝璇誨彇 redis 鑾峰彇鐜╁錛屽尮閰嶆垚鍔熷氨灝嗙粨鏋滃啓鍏?redis. 浠呭尮閰嶄竴灞灝遍鍑恒?br />
娓告垙鏈嶄腑榪炴帴 open-match 鐨勫墠绔笌鍚庣鐨勮繘紼嬶紝鍒嗗埆縐頒負 frontendclient 鍜?Director銆?br />杈撳叆鍒?閮ㄤ喚錛屼竴鏄帺瀹朵俊鎭紝浜屾槸瀵瑰眬淇℃伅銆?br />Director 鍚戝悗绔緭鍏ュ灞淇℃伅錛屽氨浼氭敹鍒頒竴涓帴涓涓殑瀵瑰眬浜哄憳鍒楄〃.
Director 闇瑕佷負姣忎釜瀵瑰眬寮鎴塊棿錛岀劧鍚庨氱煡鍚庣鎴塊棿鍦板潃銆?br />鍚庣灝嗘埧闂村湴鍧鍐欏叆 redis, 鐒跺悗鍓嶇璇誨彇鍒版埧闂村湴鍧錛屽氨閫氱煡 frontendclient錛岃鐜╁榪涘叆鎴塊棿銆?br />

## test/cmd/frontendclient


妯℃嫙澶у巺鏈嶆垨緇勯槦鏈嶏紝榪炴帴鍓嶇API, 璇鋒眰鍖歸厤鐜╁/闃熶紞銆傛垚鍔熷悗灝嗘敹鍒版埧闂存湇(DGS)鐨勫湴鍧(Assignment)銆?br />
Player 瀹為檯涓婃槸涓涓槦浼嶏紝鍏朵腑ID瀛楁鏄敤絀烘牸鍒嗛殧鐨勫涓狪D.
铏界劧鍙傛暟綾誨瀷閮芥槸 Player, CreatePlayer() 鍙傛暟涓烘暣涓槦浼嶏紝鑰?GetUpdates() 鍙傛暟鏄崟涓帺瀹躲?br />
main() 涓垱寤哄涓帺瀹訛紝姣忎釜鐜╁璋冪敤 GetUpdates() 浠ヨ幏鍙栫粨鏋滐紝go waitForResults() 涓鐞嗙粨鏋溿?br />waitForResult() 璇誨彇嫻佷腑鐨勫尮閰嶇粨鏋滐紝鍘嬪叆 resultsChan錛堜絾濂藉儚 resultsChan 浠呯敤浜庢墦鍗幫級銆?br />鎵鏈夌帺瀹跺悎騫跺埌 g 瀹炰緥涓紝鐒跺悗璋冪敤 CreatePlayer() 璇鋒眰鍖歸厤銆?br />
cleanup() 璋冪敤 DeletePlayer() 鏉ュ垹闄ゅ尮閰嶈姹傦紝涓嶄粎闇鍒犻櫎鏁翠釜闃熶紞錛屼篃闇瑕佸垹闄ゅ崟涓帺瀹躲?br />
濂藉儚鏈鍚庡彇緇撴灉娌″彇瀵瑰湴鏂癸紝搴旇浠?resultChan 涓幏鍙?Assignment, 騫剁敤璇ュ湴鍧 udpClient().

鐪嬩簡璇ョず渚嬪氨鍙互鐞嗚В frontend.proto

## examples/backendclient


MatchObject.Properties 鏄粠 testprofile.json 璇誨彇鐨勶紝搴旇鏀瑰悕涓?Profile 鏄惁鏇村ソ鐐癸紵
pbProfile 鏄?MatchObject錛孭rofile 絳夊悓浜?MatchObject?
Profile 鐨勫畾涔夋槸 MMF 鎵闇鐨勬墍鏈夊弬鏁般?br />`pbProfile.Properties = jsonProfile` 閲嶅浜?閬嶃?br />
ListMatches()鍒楀嚭榪欎釜Profile鐨勬墍鏈夊尮閰嶃?br />鏀跺埌涓涓尮閰嶅悗錛岄』鐢–reateAssignments()灝嗘埧闂存湇鍦板潃, 縐頒負 Assignment, 鍙戦佸埌鎵鏈夋父鎴忓鎴風銆?br />

## cmd/frontendapi


CreatePlayer() 灝?Player 瀵硅薄鍐欏叆 redis, 閿間負 Player.Id, 綾誨瀷涓?HSET銆?br />瀵?Player 鐨勬瘡涓?attribute錛屾坊鍔犲埌 ZSET 涓幓銆?br />姝ゅ Player 鏄竴緇勭帺瀹躲?br />
GetUpdates() 姣忛殧2s璇誨彇redis, Player鏁版嵁鏈夊彉鍖栨椂灝卞彂閫併傛澶?Player 鏄崟涓帺瀹躲?br />
濡傛灉CreatePlayer()涓槦浼嶅彧鏈変竴涓帺瀹訛紝
鍒欏啓鍏ョ殑Player涓嶨etUpdates()涓鍙栫殑鐜╁鏄悓涓涓猺edis閿?br />

## cmd/backendapi


CreateMatch() 涓?profile 綾誨瀷涓?MatchObject, 鏄竴涓瘮璧涚殑闄愬埗鏉′歡銆?br />profile 鍏堝啓鍏?redis, 閿負 profile.Id.
`requestKey := xid() + "." + profile.Id`,
騫跺皢 requestKey 鍔犲叆 redis 闆嗗悎 "profileq"銆?br />鐒跺悗姣?s鏌ヨ redis, 鐪嬫槸鍚︽湁 requestKey 閿嚭鐜幫紝騫惰繑鍥炶鍊箋?br />
ListMatch() 姣?s璋冪敤涓嬈?CreateMatch().

DeleteMatch() 浠呬粎鍒犻櫎 Id 榪欎釜閿?br />
CreateAssignments() 涓哄涓槦浼嶈緗瓵ssignment, 鍗蟲埧闂村湴鍧銆?br />閬嶅巻鎵鏈塕oster涓殑Player瀵硅薄錛屽湪redis涓緗瓵ssignment.
(Assignment 鏇存敼鍚庯紝浼氳Е鍙戝墠绔洿鏂般?
灝嗘墍鏈?Player.Id 浠?"proposed" 縐誨埌 "deindexed"錛岃繖涓や釜鏄?ZSET, 鍒嗗間負鍔犲叆鏃墮棿銆?br />Roster 搴旇鏄瘮璧涗腑鐨勯樀钀ワ紝濡傜孩鏂癸紝钃濇柟錛屾瘡涓樀钀ヤ腑鍙湁澶氫釜闃熶紞銆?br />
DeleteAssignments() 浠呬粎閬嶅巻鎵鏈?Player 瀵硅薄鏉ュ垹闄?Assignment 瀛楁銆?br />

## cmd/mmforc


鍖歸厤嫻佺▼鏄敱 mmforc (matchmaking function orchestrator) 鎺у埗鐨勩?br />
mmforc 姣忕浠?redis 鐨?profileq 涓彇鍑?100 涓垚鍛? 鍏朵腑 profileq 鏄釜set綾誨瀷錛?br />浣跨敤鍛戒護涓篳SPOP profileq 100`.

瀵規瘡涓?profile, 鍒涘緩涓涓?k8s 浠誨姟錛?br />
```
    // Kick off the job asynchrnously
    go mmfunc(ctx, profile, cfg, defaultMmfImages, clientset, &pool)
```

姣忛殧10s, 榪樻湁鎵鏈夊尮閰嶄換鍔¢兘瀹屾垚鍚庯紝闇瑕?`checkProposals`, 鍗沖垱寤?evaluator 浠誨姟銆?br />
profileq 涓殑鍏冪礌 profile 涓哄瓧絎︿覆錛宮atchObjectID.profileID銆?br />浠?profileID 涓洪敭錛屽彲浠ヤ粠 redis 璇誨彇 profile 鐨勫唴瀹? profile 鏄釜 MatchObject 瀵硅薄銆?br />
profile 鐨勫唴瀹逛負 json 涓詫紝鍏朵腑 "jsonkeys.mmfImages" 涓?mmf (matchmaking function) 闀滃儚銆?br />
濡傛灉profile璇誨彇澶辮觸錛屾垨鑰?mmfImages 涓虹┖錛屽垯浣跨敤榛樿鐨勯暅鍍忋俶mfImages 鏈潵浼氭敮鎸佸涓暅鍍忋?br />
閫氳繃 MMF_* 鐜鍙橀噺浼犲叆鍚勭鍙傛暟.

## mmf


紺轟緥錛歟xamples\functions\golang\manual-simple

浠庣幆澧冨彉閲?"MMF_PROFILE_ID" 瑙f瀽鍑?profileID, 騫跺悜 redis 鏌ヨ(HGETALL) profile錛孒SET 綾誨瀷銆?br />
浠?profile 涓彇 pools 瀛楁錛屽嵆鍖歸厤鏉′歡銆?br />pools 鍒嗕負澶氫釜 pool, 姣忎釜 pool 涓湁澶氫釜 filter, 姣忎釜 filter 鍚?redis 鍙栫鍚堢殑 Player.

profile 鐢ㄥ埌浠ヤ笅瀛楁錛?br />
* "properties.playerPool"
  json涓詫紝鏄竴浜涜繃婊ゆ潯浠訛紝濡?#8220;mmr: 100-999”
* "properties.roster"
  json涓? 鏄涓槦浼嶅ぇ灝忥紝濡?“red: 4”

紺轟緥瑙侊細`examples\backendclient\profiles\testprofile.json`

### 綆鍗曞尮閰嶈繃紼?/h3>
simple mmf 鐨勫尮閰嶈繃紼嬪涓嬶細

1. 浠?redis 鏌ヨ profile錛岃幏鍙栬繃婊ゆ潯浠跺拰鍚勯槦浼嶅ぇ灝?br />1. 姣忎釜榪囨護鏉′歡鍚?redis 鏌ヨ錛屾墍鏈夌粨鏋滅殑浜ら泦涓哄彲閫夋垚鍛?br />1. 鍘婚櫎 ignoreList, 鍗蟲渶榪?800s 鍐呭凡鍖歸厤鎴愬姛鐨勬垚鍛橈紝鍗?proposal 鍜?deindexed ZSET 鍒楄〃銆?br />1. 濡傛灉鍙夋垚鍛樹釜鏁板お灝忥紝鍒?insufficient_players 騫墮鍑?br />1. 鍒嗛厤鍚勪釜闃熶紞鎴愬憳
1. 鍚?redis 璁板綍緇撴灉

### 緇撴灉


profile 涓坊鍔?roster錛屽嵆鍚勯樀钀ユ垚鍛樺悕鍗曪紝瀛樺叆 prososalKey.
淇濆瓨涓嶅垎闃熶紞鐨勬垚鍛樺悕鍗曘?br />鐒跺悗鍚?"proposalq" 娣誨姞 prososalKey

### 緇嗚妭


poolRosters 浠?(pool鍚? filter attribute) 涓洪敭錛屽間負 Player ID 鍒楄〃.
淇濆瓨浠?redis 鏌ヨ鐨勭鍚堟潯浠剁殑 Player ID.

overlaps 浠?pool 鍚嶄負閿紝淇濆瓨絎﹀悎璇ool涓墍鏈塮ilter鐨?Player ID 鍒楄〃錛屽幓闄?ignore list.

rosters 鏄?profile 涓殑 "properties.rosters" 瀛楁銆備笉鐭ヤ綍鐢紵
閬嶅巻 rosters, 涓烘瘡涓樀钀ョ殑姣忎釜player鎵懼埌瀵瑰簲pool鐨凱layerID, 淇濆瓨鍒?mo.Rosters.
鍏朵腑 profileRosters 濂藉儚娌$敤銆?br />


閲戝簡 2019-01-31 10:21 鍙戣〃璇勮
]]>
璇曠敤 go modhttp://www.shnenglu.com/jinq0123/archive/2018/12/26/216141.html閲戝簡閲戝簡Wed, 26 Dec 2018 02:07:00 GMThttp://www.shnenglu.com/jinq0123/archive/2018/12/26/216141.htmlhttp://www.shnenglu.com/jinq0123/comments/216141.htmlhttp://www.shnenglu.com/jinq0123/archive/2018/12/26/216141.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/216141.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/216141.html璇曠敤 go mod
(閲戝簡鐨勪笓鏍?2018.12)

Go 1.11 鏀寔 module.

浠g爜涓嶉渶瑕佸湪 GOPATH/src 鐩綍涓嬨?br />
鍏堝垵濮嬪寲妯″潡錛岀敓鎴?`go.mod`

E:\temp
λ mkdir -p testmod\hello

E:\temp
λ cd testmod\hello\

E:\temp\testmod\hello
λ go mod init github.com/jinq0123/hello
go: creating new go.mod: module github.com/jinq0123/hello


鍒涘緩 `hello.go`

package main

import (
    "fmt"
    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}


鏋勫緩鏃舵姤 `golang.org/x/text` 榪炰笉涓婏細

E:\temp\testmod\hello
λ go build
go: golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c: unrecog
nized import path "golang.org/x/text" (https fetch: Get https://g
olang.org/x/text?go-get=1: dial tcp 216.239.37.1:443: connectex:
A socket operation was attempted to an unreachable network.)
go: error loading module requirements


`go.mod` 娣誨姞

replace golang.org/x/text => github.com/golang/text v0.3.0


鐒跺悗鏋勫緩灝辨垚鍔熶簡錛?br />
E:\temp\testmod\hello
λ go build
go: finding github.com/golang/text v0.3.0
go: downloading rsc.io/sampler v1.3.0
go: downloading github.com/golang/text v0.3.0

E:\temp\testmod\hello
λ hello.exe
Hello, world.


濡傛灉涓嶅姞鐗堟湰鍙鳳紝鍒欎細鎶ラ敊錛?br />
go.mod:9: replacement module without version must be directory path (rooted or starting with ./ or ../)


Go 1.11.1 replace 榪樻湁闂錛屼粛浼氳瘯鍥捐繛鎺ュ師鍦板潃銆傜洰鍓嶇増鏈?1.11.4 鍙互鐢ㄣ?br />
鍙傝冿細
https://github.com/golang/go/wiki/Modules


閲戝簡 2018-12-26 10:07 鍙戣〃璇勮
]]>
gotest 鏄湁緙撳瓨鐨?/title><link>http://www.shnenglu.com/jinq0123/archive/2018/10/29/216026.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Mon, 29 Oct 2018 10:47:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2018/10/29/216026.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/216026.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2018/10/29/216026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/216026.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/216026.html</trackback:ping><description><![CDATA[<div>gotest 鏄湁緙撳瓨鐨?br /><br />(閲戝簡鐨勪笓鏍?2018.10)<br /><br />鐢?gotest 榪愯涓涓祴璇曪紝寰 mongodb 涓彃鍏ヤ竴鏉★紝鍙戠幇鏈夋椂鐏碉紝鏈夋椂涓嶇伒銆?br /><br />鍥犱負閿欒鍦版鐤?mgo 鐢ㄩ敊浜嗭紝鑰楄垂浜嗕笉灝戞椂闂淬?br />鏈緇堝彂鐜版槸鍥犱負 gotest 鏄湁緙撳瓨鐨勶紝杈撳嚭鐨勬槸涓婃榪愯鐨勭粨鏋滐紝浣嗘槸騫舵病鏈夊疄闄呰繍琛屼唬鐮併?br /><br />榪愯鏈夋晥鏄洜涓轟唬鐮佸垰鏀硅繃錛屾祴璇曟椂浼氬疄闄呰繍琛屻?br /><br />鏈緇堜篃鏄棤鎰忛棿鍙戠幇鐨勩傜粰 mgo 寮鍚簡璋冭瘯鏃ュ織錛岀劧鍚庢瘮杈?嬈¤繍琛岋紝鍙戠幇杈撳嚭鏄竴鏍風殑錛?br />鍙湁涓琛屼笉鍚岋細<br /><br /><span style="color: #0000ff;">ok      mail-server/server      0.519s</span><br /><span style="color: #0000ff;">ok      mail-server/server      (cached)</span><br /><br />鏄庣‘鏄劇ず浜嗙2嬈℃槸緙撳瓨銆傚墠闈㈣繍琛屼簡鍑犲崄嬈¢兘蹇界暐浜?cached 榪欎釜杈撳嚭銆?br /><br />涓轟簡紱佹緙撳瓨錛屽彲鍔犱笂 -count=1 鍙傛暟錛?br /><span style="color: #800000;">go test -count=1</span><br /><br /></div><img src ="http://www.shnenglu.com/jinq0123/aggbug/216026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2018-10-29 18:47 <a href="http://www.shnenglu.com/jinq0123/archive/2018/10/29/216026.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>K8s鑾峰彇NodePorthttp://www.shnenglu.com/jinq0123/archive/2018/09/04/215903.html閲戝簡閲戝簡Tue, 04 Sep 2018 07:17:00 GMThttp://www.shnenglu.com/jinq0123/archive/2018/09/04/215903.htmlhttp://www.shnenglu.com/jinq0123/comments/215903.htmlhttp://www.shnenglu.com/jinq0123/archive/2018/09/04/215903.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/215903.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/215903.htmlK8s鑾峰彇NodePort

(閲戝簡鐨勪笓鏍?2018.9)

灝嗘湇鍔$敤NodePort鏆撮湶鍒板緗戯紝涓洪伩鍏嶇鍙e啿紿侊紝涓嶆寚瀹歂odePort,
 鑰屾槸璁﹌8s鑷姩閫夋嫨涓涓鍙c?br /> 
$ cat get_node_port.yaml
kind: Service
apiVersion: v1
metadata:
  name: jq-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80

$ kubectl apply -f get_node_port.yaml
service "jq-service" configured
$ kubectl describe svc/jq-service
Name:                     jq-service
Namespace:                default
Labels:                   <none>
Annotations:              kubectl...
Selector:                 app=MyApp
Type:                     NodePort
IP:                       10.104.228.187
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32115/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>


鍙互鐪嬪埌k8s鍒嗛厤浜哊odePort 32115銆?br />
鐒跺悗闇瑕佽幏鍙栬繖涓姩鎬佺殑NodePort錛屼互閫氱煡瀹㈡埛绔繛鎺ヨ绔彛銆?br />
package main

import (
    "context"
    "fmt"
    "log"
    "io/ioutil"

    "github.com/ghodss/yaml"
    "github.com/ericchiang/k8s"
    corev1 "github.com/ericchiang/k8s/apis/core/v1"
)

func main() {
    data, err := ioutil.ReadFile("config")
    if err != nil {
        panic(err)
    }

    // Unmarshal YAML into a Kubernetes config object.
    var config k8s.Config
    if err := yaml.Unmarshal(data, &config); err != nil {
        panic(err)
    }

    client, err := k8s.NewClient(&config)
    // client, err := k8s.NewInClusterClient()
    if err != nil {
        log.Fatal(err)
    }

    var svc corev1.Service
    if err := client.Get(context.Background(), "default", "jq-service", &svc); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%d\n", *svc.Spec.Ports[0].NodePort)
}

榪愯鏃墮渶瑕佸鍒禼onfig: `cp ~/.kube/config .`


閲戝簡 2018-09-04 15:17 鍙戣〃璇勮
]]>
grpc涓殑dns璐熻澆鍧囪 http://www.shnenglu.com/jinq0123/archive/2018/08/29/215886.html閲戝簡閲戝簡Wed, 29 Aug 2018 02:59:00 GMThttp://www.shnenglu.com/jinq0123/archive/2018/08/29/215886.htmlhttp://www.shnenglu.com/jinq0123/comments/215886.htmlhttp://www.shnenglu.com/jinq0123/archive/2018/08/29/215886.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/215886.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/215886.htmlgrpc涓殑dns璐熻澆鍧囪 

(閲戝簡鐨勪笓鏍?2018.8)

grpc-go 涓涓嬭繛鎺ユ湇鍔″櫒錛岃姹傚皢鍦ㄥ涓狪P涔嬮棿杞漿銆?br />
    conn, err := grpc.Dial(
        "dns:///rng-headless:8081",
        grpc.WithBalancerName(roundrobin.Name),
        grpc.WithInsecure())

鏍囧噯鐨勭洰鏍囧悕搴旇鏄繖鏍風殑錛歚"dns://authority/endpoint_name"`,
姝ゅ authority 涓虹┖錛岃瑙侊細https://github.com/grpc/grpc/blob/master/doc/naming.md

鏈嶅姟鍣ㄥ紑3涓疄渚嬶紝鎵鏈夎姹傚湪3涓疄渚嬩笂杞漿錛?br />
[jinqing@host-10-2-3-4 RoundRobin]$ kubectl run -it --rm jinqing-roundrobin --image=jinq0123/roundrobin:4
If you don't see a command prompt, try pressing enter.
2018/08/28 10:18:01 request 7754383576636566559
2018/08/28 10:18:02 request 2543876599219675746
2018/08/28 10:18:03 request 927204261937181213
2018/08/28 10:18:04 request 7754383576636566559
2018/08/28 10:18:05 request 2543876599219675746
2018/08/28 10:18:06 request 927204261937181213
...

鏈嶅姟鍣ㄨ繑鍥炰竴涓殢鏈烘暟錛屼笉鍚屽疄渚嬬殑闅忔満鏁頒笉鍚屻備唬鐮佹槸浠?br />https://github.com/kcollasarundell/balancing-on-k8s 淇敼鐨勩?br />
...
const (
        port = ":8081"
)

type server struct{}

var r int64

func init(){
    rand.Seed(time.Now().UnixNano())
    r = rand.Int63()
}

func (s *server) Rng(context.Context, *rng.Source) (*rng.RN, error) {
        return &rng.RN{RN: r}, nil
}

func main() {
        lis, err := net.Listen("tcp", port)
        if err != nil {
                log.Fatalf("failed to listen: %v", err)
        }
        s := grpc.NewServer()
        rng.RegisterRngServer(s, &server{})
        // Register reflection service on gRPC server.
        reflection.Register(s)

        if err := s.Serve(lis); err != nil {
                log.Fatalf("failed to serve: %v", err)
        }
}

鍏堢紪璇戯紝鎵撳寘鎴愰暅鍍忥紝鐒跺悗鐢?`balancing-on-k8s\backend\kube.yaml` 榪愯錛?br />kubectl apply -f kube.yaml

`backend\kube.yaml` 鍒涘緩浜嗕竴涓?ClusterIP 鏈嶅姟鍜屼竴涓?Headless 鏈嶅姟錛岄儴緗蹭簡 3 涓湇鍔″櫒瀹炰緥銆?br />[jinqing@host-10-2-3-4 RoundRobin]$ kubectl get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP             93d
rng-cluster    ClusterIP   10.111.30.205   <none>        8081/TCP            4h
rng-headless   ClusterIP   None            <none>        8081/TCP,8080/TCP   4h

瀹㈡埛绔槸涓涓畝鍗曠殑grpc, 瀹氭椂鍙戦佽姹傦紝鎵撳嵃榪斿洖鐨勯殢鏈烘暟銆?br />`balancing-on-k8s\clientSideBalancer\RoundRobin\main.go`涓殑鍦板潃闇瑕佹坊鍔犵鍙o紝
涓嶇劧grpc浼氬幓榪炴帴 443 绔彛鑰屽け璐ャ?br />
鎵╁鍚庯紝嫻嬪埌澶ф3鍒嗛挓鍚庢墠鐪嬪埌璐熻澆杞Щ銆傜緝瀹瑰悗浼氱珛鍗崇敓鏁堛?br />kubectl scale --replicas=5 deployment/rng

濡傛灉鏄?ClusterIP 鏈嶅姟, 鍒欐湇鍔″悕瀵瑰簲涓涓狢lusterIP;
濡傛灉鏄?Headless 鏈嶅姟錛屽垯鏈嶅姟鍚嶅搴斿悇涓狿od鐨処P:

/ # nslookup rng-headless
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   rng-headless.default.svc.cluster.local
Address: 10.244.3.27
Name:   rng-headless.default.svc.cluster.local
Address: 10.244.0.108
Name:   rng-headless.default.svc.cluster.local
Address: 10.244.2.66

/ # nslookup rng-cluster
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   rng-cluster.default.svc.cluster.local
Address: 10.111.30.205

/ #

濡傛灉鍘婚櫎 "dns:///", 浠呬粎鏄煙鍚嶅姞绔彛錛?br />
conn, err := grpc.Dial(
        "rng-headless:8081",
        grpc.WithBalancerName(roundrobin.Name),
        ...

鍒欏彧浼氳姹傚悓涓涓疄渚嬨傚彧鏈夊綋璇ュ疄渚媝od琚垹闄ゅ悗鎵嶄細鍒囨崲鍒板彟涓涓疄渚嬨?br />浣跨敤緙╁鏃跺彂鐜頒細浼樺厛鍒犻櫎娌℃湁瀹㈡埛绔繛鎺ョ殑瀹炰緥銆?br />鐢?涓鎴風榪炴帴鍒頒笉鍚屾湇鍔″櫒瀹炰緥錛岀劧鍚庣緝瀹逛負1瀹炰緥錛屽氨鍙互鐪嬪埌璇鋒眰鍒囨崲銆?br />
濡傛灉瀹㈡埛绔拰鏈嶅姟鍣ㄦ暟閲忓緢澶э紝榪欎釜dns璐熻澆鍧囪 灝變笉鍚堥備簡錛屽洜涓哄鎴風浼氳繛鎺ユ瘡涓湇鍔″櫒瀹炰緥銆?br />
鍙傝冿細
Exploring Kubernetes Service Discovery and loadbalancing ( https://kca.id.au/post/k8s_service/ )


閲戝簡 2018-08-29 10:59 鍙戣〃璇勮
]]>
k8s闆嗙兢澶杇o瀹㈡埛绔ず渚?/title><link>http://www.shnenglu.com/jinq0123/archive/2018/07/22/215796.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Sun, 22 Jul 2018 03:14:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2018/07/22/215796.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/215796.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2018/07/22/215796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/215796.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/215796.html</trackback:ping><description><![CDATA[<div>k8s闆嗙兢澶杇o瀹㈡埛绔ず渚?br /><br />(閲戝簡鐨勪笓鏍?2018.7)<br /><br />闆嗙兢鍐呭鎴風闇瑕佹墦鍖呮垚docker闀滃儚錛屼笂浼犻暅鍍忥紝鐒跺悗鐢?kubectl run 榪愯錛?br />榪樿璁劇疆鐢ㄦ埛瑙掕壊錛屽お楹葷儲錛岃繕鏄敤闆嗙兢澶栧鎴風嫻嬭瘯姣旇緝鏂逛究銆?br /><br />瀹㈡埛绔簱浣跨敤 ericchiang/k8s, 姣斿畼鏂圭殑 client-go 瑕佺畝鍗曡澶氥?br /><br />闆嗙兢鍐呭鎴風浣跨敤`k8s.NewInClusterClient()`鍒涘緩錛?br />闆嗙兢澶栧鎴風浣跨敤 `NewClient(config *Config)`, 闇瑕佽緭鍏ラ厤緗紝<br />閰嶇疆灝辨槸浠?~/.kube/config 璇誨彇鐨勩?br />鍙傝?https://github.com/ericchiang/k8s/issues/79<br /><br />浠g爜濡備笅錛?br /><br /><span style="font-family: Courier; color: #800000;">package main</span><br /><br /><span style="font-family: Courier; color: #800000;">import (</span><br /><span style="font-family: Courier; color: #800000;">    "context"</span><br /><span style="font-family: Courier; color: #800000;">    "fmt"</span><br /><span style="font-family: Courier; color: #800000;">    "log"</span><br /><span style="font-family: Courier; color: #800000;">    "io/ioutil"</span><br /><br /><span style="font-family: Courier; color: #800000;">    "github.com/ghodss/yaml"</span><br /><span style="font-family: Courier; color: #800000;">    "github.com/ericchiang/k8s"</span><br /><span style="font-family: Courier; color: #800000;">    corev1 "github.com/ericchiang/k8s/apis/core/v1"</span><br /><span style="font-family: Courier; color: #800000;">)</span><br /><br /><span style="font-family: Courier; color: #800000;">func main() {</span><br /><span style="font-family: Courier; color: #800000;">    data, err := ioutil.ReadFile("config")</span><br /><span style="font-family: Courier; color: #800000;">    if err != nil {</span><br /><span style="font-family: Courier; color: #800000;">        panic(err)</span><br /><span style="font-family: Courier; color: #800000;">    }</span><br /><br /><span style="font-family: Courier; color: #800000;">    // Unmarshal YAML into a Kubernetes config object.</span><br /><span style="font-family: Courier; color: #800000;">    var config k8s.Config</span><br /><span style="font-family: Courier; color: #800000;">    if err := yaml.Unmarshal(data, &config); err != nil {</span><br /><span style="font-family: Courier; color: #800000;">        panic(err)</span><br /><span style="font-family: Courier; color: #800000;">    }</span><br /><br /><span style="font-family: Courier; color: #800000;">    client, err := k8s.NewClient(&config)</span><br /><span style="font-family: Courier; color: #800000;">    // client, err := k8s.NewInClusterClient()</span><br /><span style="font-family: Courier; color: #800000;">    if err != nil {</span><br /><span style="font-family: Courier; color: #800000;">        log.Fatal(err)</span><br /><span style="font-family: Courier; color: #800000;">    }</span><br /><br /><span style="font-family: Courier; color: #800000;">    var nodes corev1.NodeList</span><br /><span style="font-family: Courier; color: #800000;">    if err := client.List(context.Background(), "", &nodes); err != nil {</span><br /><span style="font-family: Courier; color: #800000;">        log.Fatal(err)</span><br /><span style="font-family: Courier; color: #800000;">    }</span><br /><span style="font-family: Courier; color: #800000;">    for _, node := range nodes.Items {</span><br /><span style="font-family: Courier; color: #800000;">        fmt.Printf("name=%q schedulable=%t\n", *node.Metadata.Name, !*node.Spec.Unschedulable)</span><br /><span style="font-family: Courier; color: #800000;">    }</span><br /><span style="font-family: Courier; color: #800000;">}</span><br /><br />yaml 搴撶敤浜?ghodss/yaml錛屼笉鑳界敤 go-yaml, 涓嶇劧鎶ラ敊<br />`yaml: unmarshal errors`<br />瑙侊細https://github.com/ericchiang/k8s/issues/81<br /><br />澶嶅埗 .kube/config 鍒拌繍琛岀洰褰曪紝榪愯鍒楀嚭鎵鏈夎妭鐐癸細<br /><br /><span style="font-family: Courier; color: #0000ff;">[jinqing@host-10-1-2-19 out-cluster]$ cp ~/.kube/config .</span><br /><span style="font-family: Courier; color: #0000ff;">[jinqing@host-10-1-2-19 out-cluster]$ ./out-cluster </span><br /><span style="font-family: Courier; color: #0000ff;">name="host-10-1-2-20" schedulable=true</span><br /><span style="font-family: Courier; color: #0000ff;">name="host-10-1-2-21" schedulable=true</span><br /><span style="font-family: Courier; color: #0000ff;">name="host-10-1-2-22" schedulable=true</span><br /><span style="font-family: Courier; color: #0000ff;">name="host-10-1-2-19" schedulable=true</span></div><div><span style="font-family: Courier; color: #0000ff;"><div><span style="font-family: Courier; color: #0000ff;">name="host-10-1-2-18" schedulable=true</span></div></span></div><img src ="http://www.shnenglu.com/jinq0123/aggbug/215796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2018-07-22 11:14 <a href="http://www.shnenglu.com/jinq0123/archive/2018/07/22/215796.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鐢ㄧ洰褰曠粨鏋勮〃紺篻o鍖呬緷璧栧叧緋?/title><link>http://www.shnenglu.com/jinq0123/archive/2018/06/25/215743.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Mon, 25 Jun 2018 09:16:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2018/06/25/215743.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/215743.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2018/06/25/215743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/215743.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/215743.html</trackback:ping><description><![CDATA[<div>鐢ㄧ洰褰曠粨鏋勮〃紺篻o鍖呬緷璧栧叧緋?br /><br />(閲戝簡鐨勪笓鏍?2018.6)<br /><br />鎽樿嚜錛?br />https://www.ardanlabs.com/blog/2017/02/package-oriented-design.html<br /><br />If a package wants to import another package at the same level:<br /><br />* Question the current design choices of these packages.<br />* If reasonable, move the package inside the source tree for the package that wants to import it.<br />* Use the source tree to show the dependency relationships.<br /></div><img src ="http://www.shnenglu.com/jinq0123/aggbug/215743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2018-06-25 17:16 <a href="http://www.shnenglu.com/jinq0123/archive/2018/06/25/215743.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Golang鐨勫寘鍚?/title><link>http://www.shnenglu.com/jinq0123/archive/2018/06/25/215742.html</link><dc:creator>閲戝簡</dc:creator><author>閲戝簡</author><pubDate>Mon, 25 Jun 2018 08:51:00 GMT</pubDate><guid>http://www.shnenglu.com/jinq0123/archive/2018/06/25/215742.html</guid><wfw:comment>http://www.shnenglu.com/jinq0123/comments/215742.html</wfw:comment><comments>http://www.shnenglu.com/jinq0123/archive/2018/06/25/215742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jinq0123/comments/commentRss/215742.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jinq0123/services/trackbacks/215742.html</trackback:ping><description><![CDATA[<div>Golang鐨勫寘鍚?br /><br />(閲戝簡鐨勪笓鏍?2018.6)<br /><br />鎽樿嚜錛?br /><br />https://talks.golang.org/2014/organizeio.slide#1<br /><br />The name of a package<br /><br />Keep package names short and meaningful.<br />Don't use underscores, they make package names long.<br /><br />    io/ioutil not io/util<br />    suffixarray not suffix_array<br /><br />Don't overgeneralize. A util package could be anything.<br /><br />The name of a package is part of its type and function names.<br />On its own, type Buffer is ambiguous. But users see:<br /><br />    buf := new(bytes.Buffer)<br /><br />Choose package names carefully.<br /><br />Choose good names for users.<br /></div><img src ="http://www.shnenglu.com/jinq0123/aggbug/215742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jinq0123/" target="_blank">閲戝簡</a> 2018-06-25 16:51 <a href="http://www.shnenglu.com/jinq0123/archive/2018/06/25/215742.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>grpc-go涓巃ctor妯″紡http://www.shnenglu.com/jinq0123/archive/2018/06/12/215720.html閲戝簡閲戝簡Tue, 12 Jun 2018 03:15:00 GMThttp://www.shnenglu.com/jinq0123/archive/2018/06/12/215720.htmlhttp://www.shnenglu.com/jinq0123/comments/215720.htmlhttp://www.shnenglu.com/jinq0123/archive/2018/06/12/215720.html#Feedback0http://www.shnenglu.com/jinq0123/comments/commentRss/215720.htmlhttp://www.shnenglu.com/jinq0123/services/trackbacks/215720.htmlgrpc-go涓巃ctor妯″紡

(閲戝簡鐨勪笓鏍?2018.6)

grpc-go鏈嶅姟鍣ㄧ殑姣忎釜璇鋒眰閮藉湪涓涓嫭绔嬬殑鍗忕▼涓墽琛屻?br />緗戞父鏈嶅姟鍣ㄤ腑錛屼竴鑸姹備細璋冪敤娓告垙鎴塊棿鐨勬柟娉曪紝鑰屾埧闂存槸涓涓嫭绔嬬殑鍗忕▼銆?br />鍙互灝嗘埧闂村疄鐜頒負actor錛実rpc璇鋒眰閫氳繃Call()鎴朠ost()鏂規硶鏉ユ墽琛屻?br />鍏朵腑Call()浼氱瓑寰呰繑鍥烇紝鑰孭ost()浼氬紓姝ユ墽琛屾棤榪斿洖鍊箋?br />
type Room struct {
    // actC 鏄叾浠栧崗紼嬪悜Room鍗忕▼鍙戦佸姩浣滅殑Channel錛屽崗紼嬩腑灝嗕緷嬈℃墽琛屽姩浣溿?/span>
    // Action 鍔ㄤ綔, 鏄棤鍙傛暟鏃犺繑鍥炲肩殑鍑芥暟.
    actC chan func()

    ...
}

// Run 榪愯鎴塊棿鍗忕▼.
func (r *Room) Run() {
    ticker := time.NewTicker(20 * time.Millisecond)
    defer ticker.Stop()

    for r.running {
        select {
        case act := <-r.actC:
            act()
        case <-ticker.C:
            r.tick()
        }
    }
}

// Call calls a function f and returns the result.
// f runs in the Room's goroutine.
func (r *Room) Call(f func() interface{}) interface{} {
    // 緇撴灉浠巆h榪斿洖
    ch := make(chan interface{}, 1)
    r.actC <- func() {
        ch <- f()
    }
    // 絳夊緟鐩村埌榪斿洖緇撴灉
    return <-ch
}

// Post 灝嗕竴涓姩浣滄姇閫掑埌鍐呴儴鍗忕▼涓墽琛?
func (r *Room) Post(f func()) {
    r.actC <- f
}

grpc鏈嶅姟鏂規硶濡傦細

func (m *RoomService) Test(ctx context.Context, req *pb.TestReq) (*pb.TestResp, error) {
    conn := conn_mgr.GetConn(ctx)
    if conn == nil {
        return nil, fmt.Errorf("can not find connection")
    }

    room := conn.GetRoom()
    resp := room.Call(func() interface{} {
        return room.Test(req)
    })

    return resp.(*pb.TestResp), nil
}

閲戝簡 2018-06-12 11:15 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品久久99精品久久| 亚洲国产成人午夜在线一区 | 中文久久精品| 欧美性色aⅴ视频一区日韩精品| 一本在线高清不卡dvd| 亚洲视频免费看| 国内精品嫩模av私拍在线观看| 男男成人高潮片免费网站| 欧美成人伊人久久综合网| 一区二区三区日韩精品| 国产欧美日韩视频一区二区| 午夜视频久久久久久| 欧美在线一二三区| 亚洲毛片一区二区| 亚洲综合视频在线| 亚洲激情视频在线| 国产精品99久久99久久久二8| 国产精品一区久久久| 欧美成人a视频| 国产精品爱久久久久久久| 久久久久在线观看| 欧美亚州韩日在线看免费版国语版| 久久av一区二区| 欧美国产一区二区三区激情无套| 亚洲欧美日韩国产一区二区| 久久久久国产精品人| 一区二区三区精品视频| 久久不射电影网| 在线亚洲高清视频| 久久免费国产| 欧美在线观看你懂的| 欧美激情亚洲另类| 久久久久国产精品www| 欧美另类视频在线| 麻豆成人在线观看| 国产欧美亚洲精品| 亚洲美女视频在线观看| 韩国v欧美v日本v亚洲v| 亚洲婷婷免费| 日韩视频在线一区二区三区| 久久精品国产99国产精品澳门 | 国产亚洲一二三区| 夜夜躁日日躁狠狠久久88av| 尤物yw午夜国产精品视频| 亚洲视频一区二区在线观看| 亚洲麻豆av| 麻豆成人av| 媚黑女一区二区| 国产一区日韩二区欧美三区| 亚洲视频在线一区观看| 一区二区三区.www| 欧美激情欧美激情在线五月| 奶水喷射视频一区| 黄色亚洲在线| 欧美在线亚洲在线| 久久中文久久字幕| 狠狠爱www人成狠狠爱综合网 | 久久婷婷av| 国产日韩欧美一区二区三区在线观看 | 99国产精品国产精品久久| 麻豆乱码国产一区二区三区| 麻豆视频一区二区| 狠狠色狠狠色综合人人| 久久九九久精品国产免费直播| 欧美在线一二三| 国产亚洲福利| 久久精品女人| 欧美国产在线视频| 亚洲精品永久免费精品| 欧美精品在线一区二区| 亚洲精品综合久久中文字幕| 这里只有精品丝袜| 国产精品乱人伦中文| 亚洲综合首页| 理论片一区二区在线| 亚洲电影天堂av| 欧美经典一区二区| 在线亚洲欧美专区二区| 欧美亚洲视频一区二区| 国精品一区二区三区| 麻豆精品在线观看| 在线亚洲一区观看| 久久久久女教师免费一区| 亚洲国产高清在线观看视频| 欧美另类极品videosbest最新版本| 一本久久综合亚洲鲁鲁| 久久精品色图| 亚洲精品久久久久中文字幕欢迎你| 欧美全黄视频| 欧美亚洲自偷自偷| 亚洲精品国精品久久99热一 | 国产日产欧美a一级在线| 久久精品国产精品亚洲精品| 亚洲电影欧美电影有声小说| 亚洲欧美日韩中文播放| 樱花yy私人影院亚洲| 欧美日本高清| 久久精品成人| 99re热精品| 美女图片一区二区| 亚洲一级网站| 亚洲国产精品高清久久久| 国产精品盗摄久久久| 久久综合久久美利坚合众国| 夜夜爽av福利精品导航| 欧美成人嫩草网站| 欧美一区二区三区在线观看视频| 91久久国产综合久久| 国产精品你懂的在线| 欧美波霸影院| 久久精品国产久精国产爱| 一二三四社区欧美黄| 亚洲国产高清在线观看视频| 久久国产欧美日韩精品| 亚洲天堂网在线观看| 亚洲国产你懂的| 国产视频久久久久久久| 国产精品成人一区二区三区吃奶| 久久艳片www.17c.com| 欧美有码在线观看视频| 一区二区三区四区国产精品| 欧美激情1区| 你懂的视频一区二区| 欧美在线一二三四区| 亚洲欧美日韩专区| 亚洲一区二区三区激情| 99re8这里有精品热视频免费| 狠狠色丁香婷婷综合影院| 国产午夜精品在线| 国产日韩欧美中文在线播放| 欧美日韩亚洲另类| 欧美理论片在线观看| 欧美福利视频网站| 欧美不卡视频一区发布| 久久亚洲一区| 老色批av在线精品| 美女视频黄免费的久久| 美女视频一区免费观看| 久久影音先锋| 欧美暴力喷水在线| 欧美伦理91i| 欧美日韩国产丝袜另类| 欧美天天影院| 国产精品亚洲产品| 国产午夜亚洲精品理论片色戒| 国产日韩精品一区二区三区在线| 国产精品色午夜在线观看| 国产精品揄拍500视频| 国产日产亚洲精品系列| 狠狠色综合日日| 亚洲国产精品久久精品怡红院| 最新中文字幕亚洲| 一本色道久久综合亚洲精品小说 | 午夜精品久久久久久久蜜桃app| 亚洲免费网址| 久久人体大胆视频| 欧美华人在线视频| 国产精品99免费看| 国产欧美一区二区三区久久| 激情丁香综合| 夜夜爽www精品| 欧美在线观看视频一区二区三区 | 亚洲电影免费在线 | 久久免费精品日本久久中文字幕| 久热精品在线视频| 亚洲精品乱码| 亚洲欧美日韩一区二区在线 | 夜夜精品视频一区二区| 午夜久久久久久| 免费日韩视频| 国产精品美女久久久| 一区视频在线播放| 一区二区国产在线观看| 久久大逼视频| 亚洲精品美女在线观看| 亚洲欧美综合| 欧美激情一区二区三区蜜桃视频 | 欧美成人自拍| 国产女人精品视频| 亚洲精品午夜精品| 久久成人免费网| 日韩一区二区精品葵司在线| 欧美在线影院| 国产精品视频大全| 亚洲精品日韩综合观看成人91 | 伊大人香蕉综合8在线视| 亚洲一区二区精品| 欧美成人四级电影| 午夜精品视频在线观看| 欧美日韩mv| 亚洲国产精品高清久久久| 午夜在线视频观看日韩17c| 亚洲成人中文| 久久精品国产免费观看| 国产精品欧美日韩久久| 亚洲精品乱码久久久久| 久久综合色综合88| 欧美一区成人| 国产精品一区二区视频| 一区二区欧美日韩视频|