<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] > [作者文章](https://colobu.com/2016/05/26/RPCX-a-distributed-rpc-dubbo-like-framework-by-Go/#RPC%E6%98%AF%E4%BB%80%E4%B9%88) > [github](http://github.com/smallnest/rpcx) > ## 概述 原因在于盡管這些框架(grpc ,net/rpc 等)都是為Go實現的RPC庫,但是它們的功能比較單一,只是實現了點對點(End-to-End)的通訊框架。缺乏服務治理的功能,比如服務注冊和發現、 負載均衡、容災、服務監控等功能。因此我基于Go net/rpc框架實現了一個類似Dubbo的分布式框架。 * 基于net/rpc,可以將net/rpc實現的RPC項目輕松的轉換為分布式的RPC * 插件式設計,可以配置所需的插件,比如服務發現、日志、統計分析等 * 基于TCP長連接,只需很小的額外的消息頭 * 支持多種編解碼協議,如Gob、Json、MessagePack、gencode、ProtoBuf等 * 服務發現:服務發布、訂閱、通知等,支持多種發現方式如ZooKeeper、Etcd等 * 高可用策略:失敗重試(Failover)、快速失敗(Failfast) * 負載均衡:支持隨機請求、輪詢、低并發優先、一致性 Hash等 * 規模可擴展,可以根據性能的需求增減服務器 * 其他:調用統計、訪問日志等 ### 服務發現 * [Peer to Peer](https://books.studygolang.com/go-rpc-programming-guide/part2/registry.html#peer2peer): 客戶端直連每個服務節點。 the client connects the single service directly. It acts like the`client`type. * [Peer to Multiple](https://books.studygolang.com/go-rpc-programming-guide/part2/registry.html#multiple): 客戶端可以連接多個服務。服務可以被編程式配置。 * [Zookeeper](https://books.studygolang.com/go-rpc-programming-guide/part2/registry.html#zookeeper): 通過 zookeeper 尋找服務。 * [Etcd](https://books.studygolang.com/go-rpc-programming-guide/part2/registry.html#etcd): 通過 etcd 尋找服務。 * [Consul](https://books.studygolang.com/go-rpc-programming-guide/part2/registry.html#consul): 通過 consul 尋找服務。 * [mDNS](https://books.studygolang.com/go-rpc-programming-guide/part2/registry.html#mdns): 通過 mDNS 尋找服務(支持本地服務發現)。 * [In process](https://books.studygolang.com/go-rpc-programming-guide/part2/registry.html#inprocess): 在同一進程尋找服務。客戶端通過進程調用服務,不走TCP或UDP,方便調試使用。 ## 客戶端特性 ### 故障模式: * [Failfast](https://books.studygolang.com/go-rpc-programming-guide/part3/failmode.html#failfast):如果調用失敗,立即返回錯誤 * [Failover](https://books.studygolang.com/go-rpc-programming-guide/part3/failmode.html#failover):選擇其他節點,直到達到最大重試次數 * [Failtry](https://books.studygolang.com/go-rpc-programming-guide/part3/failmode.html#failtry):選擇相同節點并重試,直到達到最大重試次數 ### 負載均衡選擇器: * [Random](https://books.studygolang.com/go-rpc-programming-guide/part3/selector.html#random_selector): 隨機選擇節點 * [Roundrobin](https://books.studygolang.com/go-rpc-programming-guide/part3/selector.html#roundrobin_selector): 使用[roundrobin](https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E5%88%B6)算法選擇節點 * [Consistent hashing](https://books.studygolang.com/go-rpc-programming-guide/part3/selector.html#hash_selector): 如果服務路徑、方法和參數一致,就選擇同一個節點。使用了非常快的[jump consistent hash](https://arxiv.org/abs/1406.2294)算法。 * [Weighted](https://books.studygolang.com/go-rpc-programming-guide/part3/selector.html#weighted_selector): 根據元數據里配置好的權重(`weight=xxx`)來選擇節點。類似于nginx里的實現(smooth weighted algorithm) * [Network quality](https://books.studygolang.com/go-rpc-programming-guide/part3/selector.html#ping_selector): 根據`ping`的結果來選擇節點。網絡質量越好,該節點被選擇的幾率越大。 * [Geography](https://books.studygolang.com/go-rpc-programming-guide/part3/selector.html#geo_selector): 如果有多個數據中心,客戶端趨向于連接同一個數據機房的節點。 * [Customized Selector](https://books.studygolang.com/go-rpc-programming-guide/part3/selector.html#user_selector): 如果以上的選擇器都不適合你,你可以自己定制選擇器。例如一個rpcx用戶寫過它自己的選擇器,他有2個數據中心,但是這些數據中心彼此有限制,不能使用`Network quality`來檢測連接質量。 ### 廣播與群發 `Broadcast`表示向所有服務器發送請求,只有**所有**服務器正確返回時才會成功。此時FailMode 和 SelectMode的設置是無效的。請設置超時來避免阻塞。 `Fork`表示向所有服務器發送請求,只要**任意一**臺服務器正確返回就成功。此時FailMode 和 SelectMode的設置是無效的。 ``` xClient := client.NewXClient(router, conf.GetRpcFailMode(), conf.GetRpcSelectMode(), d, client.DefaultOption) xClient.Fork() xClient.Broadcast() ``` ### 擴展點 可對一下擴展點進行擴展,Client的擴展點如下: 讀取Response Header的前后 讀取Response Body的前后 寫Request的前后 ## Benchmark pcx基于Go net/rpc框架實現,它的插件機制并不會帶來多少性能的損失 ``` [root@localhost rpcx]# go test -bench . -test.benchmem PASS BenchmarkNetRPC_gob-16 100000 18742 ns/op 321 B/op 9 allocs/op BenchmarkNetRPC_jsonrpc-16 100000 21360 ns/op 1170 B/op 31 allocs/op BenchmarkNetRPC_msgp-16 100000 18617 ns/op 776 B/op 35 allocs/op BenchmarkRPCX_gob-16 100000 18718 ns/op 320 B/op 9 allocs/op BenchmarkRPCX_json-16 100000 21238 ns/op 1170 B/op 31 allocs/op BenchmarkRPCX_msgp-16 100000 18635 ns/op 776 B/op 35 allocs/op BenchmarkRPCX_gencodec-16 100000 18454 ns/op 4485 B/op 17 allocs/op BenchmarkRPCX_protobuf-16 100000 17234 ns/op 733 B/op 13 allocs/op ``` ## 安裝 安裝 rpcx: `go get -u -v github.com/smallnest/rpcx/... ` 如果你想要使用 etcd 作為注冊中心,加上etcd這個標簽。 `go get -u -v -tags "etcd" github.com/smallnest/rpcx/... ` 如果你想要使用 quic `go get -u -v -tags "quic etcd" github.com/smallnest/rpcx/... ` 方便起見,我推薦你安裝所有的tags,即使你現在并不需要他們: `go get -u -v -tags "reuseport quic kcp zookeeper etcd consul ping" github.com/smallnest/rpcx/... ` tags 對應: * quic: 支持 quic 協議 * kcp: 支持 kcp 協議 * zookeeper: 支持 zookeeper 注冊中心 * etcd: 支持 etcd 注冊中心 * consul: 支持 consul 注冊中心 * ping: 支持 網絡質量負載均衡 * reuseport: 支持 reuseport ## 問題 ### undefined: resolver.BuildOption undefined: resolver.ResolveNowOption [參考](http://54wcs.com/post/%E5%A4%84%E7%90%86go1.13%E4%B8%8Betcd.v3%E9%94%99%E8%AF%AF%E9%97%AE%E9%A2%98/) 1. 修改 go.mod ``` replace github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0 replace google.golang.org/grpc => google.golang.org/grpc v1.26.0 ``` `go get ./...`
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看