gRPC SkyLB.md

gRPC SkyLB

gRPC 作為一款高性能悲雳、通用的 RPC 框架殿怜,相比傳統(tǒng)的RPC框架有著自己天然的優(yōu)勢:

  1. protobuf二進制消息坠韩,性能好/效率高(空間和時間效率都很不錯);
  2. proto文件生成目標代碼右犹,簡單易用急侥;
  3. 序列化反序列化直接對應(yīng)程序中的數(shù)據(jù)類砌滞,不需要解析后在進行映射(XML,JSON都是這種方式)侮邀;
  4. 支持向前兼容(新加字段采用默認值)和向后兼容(忽略新加字段)坏怪,簡化升級;
  5. 支持多種語言(可以把proto文件看做IDL文件)绊茧;
  6. Netty等一些框架集成铝宵;

服務(wù)注冊/發(fā)現(xiàn) 是RPC框架的核心組件,但是gRPC 作為企業(yè)級框架华畏,他的開源組件官方并未直接提供服務(wù)注冊與發(fā)現(xiàn)的功能實現(xiàn)鹏秋。而是在設(shè)計文檔(load-balancing.md)中提供了實現(xiàn)的思路,并在不同語言的gRPC代碼API中提供了命名解析和負載均衡接口供擴展亡笑。

關(guān)于gRPC 服務(wù)發(fā)現(xiàn)&負載均衡的介紹侣夷,可以參見我之前寫的一篇文章 gRPC服務(wù)發(fā)現(xiàn)&負載均衡

Overview

gRPC SkyLB 采用獨立LB進程(External Load Balancing Service)負載均衡方式,支持輪詢仑乌、一致性哈希兩種負載均衡策略百拓,并支持服務(wù)端權(quán)重琴锭。采用etcd作為注冊中心。

項目地址:

https://github.com/binchencoder/grpc-skylb

Architecture of SkyLB

architecture.png

服務(wù)提供者起來后向注冊中心(SkyLB) 注冊自己的信息衙传,ip决帖、端口、權(quán)重等蓖捶,并保持心跳地回。客戶端監(jiān)聽注冊中心俊鱼,獲取服務(wù)器列表刻像,一旦服務(wù)器發(fā)生變化,客戶端馬上更新本地的服務(wù)器列表并闲∫锼伲客戶端每個請求都通過負載均衡策略選擇一個合適的服務(wù)器去訪問。

Usage

  1. Dependency

    Install skylb-client local repository

    chenbindeMacBook-Pro:grpc-skylb chenbin$ mvn clean install
    
    <dependency>
     <groupId>com.binchencoder.skylb</groupId>
     <artifactId>skylb-client</artifactId>
     <version>1.0-SNAPSHOT</version>
    </dependency>
    
  2. Implements gRPC API

    public class DemoGrpcImpl extends DemoGrpc.DemoImplBase {
      private final Logger LOGGER = LoggerFactory.getLogger(DemoGrpcImpl.class);
    
      private Random rand = new Random(System.currentTimeMillis());
      private int port;
      public DemoGrpcImpl(int port_) {
        this.port = port_;
      }
    
      @Override
      public void greeting(GreetingProtos.GreetingRequest request,
          StreamObserver<GreetingProtos.GreetingResponse> responseObserver) {
        LOGGER.info("Got req: {}", request);
    
        // 隨機耗時350~550毫秒.
        int elapse = 350 + rand.nextInt(200);
        try {
          TimeUnit.MILLISECONDS.sleep(elapse);
        } catch (InterruptedException ie) {
          LOGGER.warn("sleep interrupted");
        }
    
        GreetingResponse reply = GreetingResponse.newBuilder().setGreeting(
            "Hello " + request.getName() + ", from :" + port + ", elapse " + elapse + "ms").build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
      }
    
      @Override
      public void greetingForEver(GreetingProtos.GreetingRequest request,
          StreamObserver<GreetingProtos.GreetingResponse> responseObserver) {
        super.greetingForEver(request, responseObserver);
      }
    }
    
  3. Register gRPC Server to SkyLB Server

    Server server = ServerTemplate.create(
             {port} 9090, 
             {bindableService} new DemoGrpcImpl(), 
             {serviceName} "shared-test-client-service")
      .build()
      .start();
    
    SkyLBServiceReporter reporter = ServerTemplate.reportLoad(
             {skylbUri} "skylb://127.0.0.1:1900/",
             {serviceName} ServiceNameUtil.toString(ServiceId.CUSTOM_EASE_GATEWAY_TEST),
             {portName} "grpc",
             {port} 9090);
    
  4. Call gRPC Server

    Create gRPC Stub

    ManagedChannel channel = ClientTemplate.createChannel(
             {skylbAddr} "skylb://127.0.0.1:1900/",
             {calleeServiceName} ServiceNameUtil.toString(ServiceId.CUSTOM_EASE_GATEWAY_TEST),
             {calleePortName} "grpc", 
             {calleeNamespace} null,                                   
             {callerServiceName} ServiceNameUtil.toString(ServiceId.SERVICE_NONE)).getOriginChannel();
    
    DemoGrpc.DemoBlockingStub blockingStub = DemoGrpc.newBlockingStub(channel);
    
    GreetingRequest request = GreetingRequest.newBuilder()
      .setName("GC " + Calendar.getInstance().get(Calendar.SECOND))
      .build();
    GreetingResponse response = blockingStub
      .withDeadlineAfter(2000, TimeUnit.MILLISECONDS)
      .greeting(request);
    

Run Demo

  1. Build SkyLB Server

    chenbindeMacBook-Pro:grpc-skylb chenbin$ cd skylb-server
    chenbindeMacBook-Pro:skylb-server chenbin$ mvn clean package
    

    最終skylb.jar 打包到 skylb-server/target 目錄下

  2. Start SkyLB Server

    Start ETCD3

    yum install etcd -y
    
    systemctl enable etcd && systemctl start etcd
    

    NOTE

    部署ETCD遇到問題可參考 https://www.cnblogs.com/shawhe/p/10640820.html

    chenbindeMacBook-Pro:skylb-server chenbin$ cd target/skylblib
    
    chenbindeMacBook-Pro:skylblib chenbin$ java -jar skylb.jar -h
     Usage: java -jar skylb.jar [options] [command] [command options]
      Options:
        --auto-disconn-timeout, -auto-disconn-timeout
          The timeout to automatically disconnect the resolve RPC. e.g. 10s(10 
          Seconds), 10m(10 Minutes)
          Default: PT5M
      Commands:
        etcd      Help for etcd options
          Usage: etcd [options]
            Options:
              --etcd-endpoints, -etcd-endpoints
                The comma separated ETCD endpoints. e.g., 
                http://etcd1:2379,http://etcd2:2379 
                Default: [http://127.0.0.1:2379]
              --etcd-key-ttl, -etcd-key-ttl
                The etcd key time-to-live. e.g. 10s(10 Seconds), 10m(10 Minutes)
                Default: PT10S
    
    chenbindeMacBook-Pro:skylblib chenbin$ java -jar skylb.jar -etcd-endpoints=http://127.0.0.1:2379
    
  3. Start gRPC Server

    https://github.com/binchencoder/grpc-skylb/blob/master/examples/demo/src/main/java/com/binchencoder/skylb/demo/grpc/server/GreetingServer.java

    Run com/binchencoder/skylb/demo/grpc/server/GreetingServer#main

  4. Start gRPC Client

    https://github.com/binchencoder/grpc-skylb/blob/master/examples/demo/src/main/java/com/binchencoder/skylb/demo/grpc/client/GreetingClient.java

    Run com/binchencoder/skylb/demo/grpc/client/GreetingClient#main

More Examples

grpc-skylb/examples/echo

該示例采用SpringBoot腳手架焙蚓,在spring-boot-grpc-common.jar中封裝好了注冊服務(wù)的邏輯纹冤,啟動方式比較簡單

@GrpcService(applyGlobalInterceptors = true) // Default use Global Interceptor
public class EchoGrpcService extends EchoServiceGrpc.EchoServiceImplBase {
}
  1. 使用@GrpcService 注解方式標示gRPC Service

  2. 在 spring-boot-grpc-common.jar 中默認配置兩個Global Interceptor(ExceptionInterceptor, AuthenticationInterceptor)

  3. 使用者可通過注解不使用Global Interceptor,實現(xiàn)自己的Interceptor

    @GrpcService(applyGlobalInterceptors = false, interceptors = ExceptionInterceptor.class)
    

Features

  • @GrpcService Annotation
  • 支持配置全局攔截器
  • 將來計劃支持skylb-client Golang版本

References

本人現(xiàn)在正在找工作购公,有合適的伯樂可隨時騷擾

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萌京,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宏浩,更是在濱河造成了極大的恐慌知残,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件比庄,死亡現(xiàn)場離奇詭異求妹,居然都是意外死亡,警方通過查閱死者的電腦和手機佳窑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門制恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人神凑,你說我怎么就攤上這事净神。” “怎么了溉委?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵鹃唯,是天一觀的道長。 經(jīng)常有香客問我瓣喊,道長坡慌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任藻三,我火速辦了婚禮洪橘,結(jié)果婚禮上絮爷,老公的妹妹穿的比我還像新娘。我一直安慰自己梨树,他們只是感情好坑夯,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抡四,像睡著了一般柜蜈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上指巡,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天淑履,我揣著相機與錄音,去河邊找鬼藻雪。 笑死秘噪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勉耀。 我是一名探鬼主播指煎,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼便斥!你這毒婦竟也來了至壤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤枢纠,失蹤者是張志新(化名)和其女友劉穎像街,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晋渺,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡镰绎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了木西。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畴栖。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖户魏,靈堂內(nèi)的尸體忽然破棺而出驶臊,到底是詐尸還是另有隱情,我是刑警寧澤叼丑,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站扛门,受9級特大地震影響鸠信,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜论寨,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一星立、第九天 我趴在偏房一處隱蔽的房頂上張望爽茴。 院中可真熱鬧,春花似錦绰垂、人聲如沸室奏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胧沫。三九已至,卻和暖如春占业,著一層夾襖步出監(jiān)牢的瞬間绒怨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工谦疾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留南蹂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓念恍,卻偏偏與公主長得像六剥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峰伙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容