1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      SpringBoot集成gRPC微服務(wù)工程搭建的示例

      這篇文章將為大家詳細(xì)講解有關(guān)SpringBoot集成gRPC微服務(wù)工程搭建的示例,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

      創(chuàng)新互聯(lián)建站溝通電話:028-86922220,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)建站網(wǎng)頁(yè)制作領(lǐng)域十年,包括成都服務(wù)器租用等多個(gè)領(lǐng)域擁有豐富設(shè)計(jì)經(jīng)驗(yàn),選擇創(chuàng)新互聯(lián)建站,為企業(yè)保駕護(hù)航。

      前言

      將使用Maven、gRPC、Protocol buffers、Docker、Envoy等工具構(gòu)建一個(gè)簡(jiǎn)單微服務(wù)工程,筆者所使用的示例工程是以前寫的一個(gè)Java后端工程,因?yàn)樽罱荚?學(xué)習(xí)微服務(wù)相關(guān)的知識(shí),所以利用起來(lái)慢慢的把這個(gè)工程做成微服務(wù)化應(yīng)用。在實(shí)踐過(guò)程踩過(guò)很多坑,主要是經(jīng)驗(yàn)不足對(duì)微服務(wù)還是停留在萌新階段,通過(guò)本文 記錄創(chuàng)建微服務(wù)工程碰到一些問(wèn)題,此次實(shí)踐主要是解決以下問(wèn)題:

      • 如何解決、統(tǒng)一服務(wù)工程依賴管理

      • SpringBoot集成gRPC

      • 管理Protocol buffers文件

      • 使用Envoy代理訪問(wèn)gRPC

      • 部署到Docker

      本文假設(shè)讀者已經(jīng)了解以下相關(guān)知識(shí):

      • Maven

      • Envoy

      • gRPC

      • Protocol buffers

      • SpringBoot

      • Docker

      由于是初步實(shí)現(xiàn)微服務(wù),不會(huì)考慮過(guò)多的細(xì)節(jié),現(xiàn)階段只需要能夠使用gRPC正常通信,后續(xù)計(jì)劃會(huì)發(fā)布到k8s中,使用istio實(shí)現(xiàn)來(lái)服務(wù)網(wǎng)格。

      使用Maven

      現(xiàn)在比較流行的構(gòu)建工具有Maven和Gradle,現(xiàn)階段后端開(kāi)發(fā)大多數(shù)都是用的Maven所以本工程也使用Maven來(lái)構(gòu)建項(xiàng)目,當(dāng)然使用Gradle也可以兩者概念大都想通,不同的地方大多是實(shí)現(xiàn)和配置方式不一致。

      使用項(xiàng)目繼承

      根據(jù)Maven的POM文件繼承特性,將工程分不同的模塊,所有的模塊都繼承父pom.xml的依賴、插件等內(nèi)容,這樣就可以實(shí)現(xiàn)統(tǒng)一管理,并方便以后管理、維護(hù)。先看一下大概的項(xiàng)目結(jié)構(gòu):

      AppBubbleBackend   (1)
      ├── AppBubbleCommon
      ├── AppBubbleSmsService  (2)
      ├── AppBubbleUserService
      ├── docker-compose.yaml  (3)
      ├── pom.xml
      ├── protos     (4)
      │ ├── sms
      │ └── user
      └── scripts     (5)
       ├── docker
       ├── envoy
       ├── gateway
       └── sql

      以下是各個(gè)目錄的用處簡(jiǎn)述,詳細(xì)的用處文章后面都會(huì)提到,先在這里列出個(gè)大概:

      1. 工程主目錄

      2. 單個(gè)服務(wù)工程目錄(模塊)

      3. docker-compose發(fā)布文件

      4. 存放.proto文件

      5. 發(fā)布、編譯時(shí)用到的腳本文件

      知道大概的項(xiàng)目工程結(jié)構(gòu)后我們創(chuàng)建一個(gè)父pom.xml文件,放在AppBubbleBackend目錄下面:

      
      
       4.0.0
       
        org.springframework.boot
        spring-boot-starter-parent
        2.1.2.RELEASE
         
       
      
       com.bubble
       bubble
       0.0.1-SNAPSHOT
       pom
       
       
        AppBubbleSmsService
        AppBubbleCommon
        AppBubbleUserService
       
      
       
      

      因?yàn)槭褂肧pringBoot構(gòu)架,所以主pom.xml文件繼承自SpringBoot的POM文件。 有了主pom.xml后然后使每個(gè)模塊的pom.xml都繼承自 主pom.xml文件:

      
      
       4.0.0
       
       com.bubble
       bubble
       0.0.1-SNAPSHOT
       
       sms
       0.0.1-SNAPSHOT
      
       
      

      經(jīng)過(guò)上面的配置后,所有的模塊都會(huì)繼承AppBubbleBackend中的pom.xml文件,這樣可以很方便的更改依賴、配置等信息。

      依賴管理

      Maven提供依賴中心化的管理機(jī)制,通過(guò)項(xiàng)目繼承特性所有對(duì)AppBubbleBackend/pom.xml所做的更改都會(huì)對(duì)其他模塊產(chǎn)生影響,詳細(xì)的依賴管理 內(nèi)容可查看官方文檔。

       
        
         
         
          io.grpc
          grpc-netty-shaded
          ${grpc.version}
         
        
      

      通過(guò)dependencyManagement標(biāo)簽來(lái)配置依賴,這樣可以就可以實(shí)現(xiàn)統(tǒng)一依賴的管理,并且還可以添加公共依賴。

      插件管理

      使用pluginManagement可以非常方便的配置插件,因?yàn)轫?xiàng)目中使用了Protocol buffers需要集成相應(yīng)的插件來(lái)生成Java源文件:

      
         
          
           org.xolstice.maven.plugins
           protobuf-maven-plugin
           0.5.1
           
            
             
              compile
              compile-custom
             
            
           
          
         
      

      Protocol buffers插件的完整配置參數(shù),可以這這里找到。

      Profile

      使用Profile的目的是為了區(qū)分生成Docker鏡像時(shí)的一些特殊配置,示例工程只配置了一個(gè)docker-build的profile:

       
        
         docker-build
         
          app
         
        
       
      
        
        ${project.artifactId}-${project.version}
       
       
       
        ${jarName}
       

      如果使用mvn package -P docker-build命令生成jar包時(shí),相應(yīng)的輸出文件名是app.jar這樣可以方便在Dockerfile中引用文件,而不需要使用${project.artifactId}-${project.version}的形式來(lái)查找輸出的jar這樣可以省去了解析pom.xml文件。如果還需要特殊的參數(shù)可以或者不同的行為,可以添加多個(gè)Profile,這樣配置起來(lái)非常靈活。

      Protocol buffers文件管理

      因?yàn)槭鞘褂梦⒎?wù)開(kāi)發(fā),而且RPC通信框架是使用的gRPC,所以每個(gè)服務(wù)工程都會(huì)使用.proto文件。服務(wù)工程之間又會(huì)有使用同一份.proto文件的需求,比如在進(jìn)行RPC通信時(shí)服務(wù)提供方返回的消息Test定義在a.proto文件中,那么在使用方在解析消息時(shí)也同樣需要a.proto文件來(lái)將接收到的消息轉(zhuǎn)換成Test消息,因此管理.proto文件也有一些小麻煩。關(guān)于Protocol buffers的使用可參考 官方文檔。

      Protocol buffers文件管理規(guī)約

      在我們的示例項(xiàng)目中使用集中管理的方式,即將所有的.proto文件放置在同一個(gè)目錄(AppBubbleBackend/protos)下并按服務(wù)名稱來(lái)劃分:

      ├── sms
      │ ├── SmsMessage.proto
      │ └── SmsService.proto
      └── user
       └── UserMessage.proto

      還可以將整個(gè)目錄放置在一個(gè)單獨(dú)的git倉(cāng)庫(kù)中,然后在項(xiàng)目中使用git subtree來(lái)管理文件。

      Protocol buffers 插件配置

      有了上面的目錄結(jié)構(gòu)后,就需要配置一下Protocol buffers的編譯插件來(lái)支持這種.proto文件的組織結(jié)構(gòu)。在講解如何配置插件解決.proto文件的編譯問(wèn)題之前,推薦讀者了解一下插件的配置文檔:Xolstice Maven Plugins。在我們的工程中使用如下配置:

      
        org.xolstice.maven.plugins
        protobuf-maven-plugin
        0.5.1
        
         com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}
         grpc-java
         io.grpc:protoc-gen-grpc-java:1.17.1:exe:${os.detected.classifier}
         
          ${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis
          ${GOPATH}/src
         
         ${protos.basedir}
         true
         true
        
        
       

      首先上面的插件配置使用protoSourceRoot標(biāo)簽將Protocol buffers的源文件目錄更改成AppBubbleBackend/protos目錄,因?yàn)楣こ讨惺褂昧薵oogleapis來(lái)定義服務(wù)接口,所以需要使用添加additionalProtoPathElement標(biāo)簽添加額外的依賴文件。注意這個(gè)插件的配置是在AppBubbleBackend/pom.xml文件中的,服務(wù)工程都是繼承此文件的。在父POM文件配置好以后,再看一下服務(wù)工程的插件配置:

      
       
       org.xolstice.maven.plugins
       protobuf-maven-plugin
       
        
        ${project.artifactId}/*.proto
        user/*.proto
        
       
       
       

      服務(wù)工程主要使用includes標(biāo)簽,將需要的.proto文件包含在編譯腳本中,includes標(biāo)簽中的include只是一個(gè)指定匹配.proto文件的匹配模式,${project.artifactId}/*.proto意思是AppBubbleBackend/protos/${project.artifactId}目錄下的所有以.proto文件結(jié)尾的文件,如果服務(wù)工程有多個(gè)依賴可以將需要依賴的文件也添加到編譯服務(wù)中,如上面的user/*.proto就將AppBubbleBackend/protos/user中的.proto文件添加進(jìn)來(lái),然后進(jìn)行整體的編譯。

      gRPC

      gRPC是由Google開(kāi)源的RPC通信框架,gRPC使用Protocol buffers定義服務(wù)接口并自動(dòng)生成gRPC相關(guān)代碼,有了這些代碼后就可以非常方便的實(shí)現(xiàn)gRPC服務(wù)端和gPRC客戶端,過(guò)多的細(xì)節(jié)就不細(xì)說(shuō)了先看一下如何使用在SpringBoot中使用gRPC。

      運(yùn)行g(shù)RPC服務(wù)

      利用ApplicationRunner接口,在SprintBoot中運(yùn)行g(shù)RPC服非常方便,只需要像下面代碼一樣就可以運(yùn)行一個(gè)簡(jiǎn)單的gRPC服務(wù)。

      package com.bubble.sms.grpc;
      
      @Component
      public class GrpcServerInitializer implements ApplicationRunner {
      
      
       @Autowired
       private List services;
      
       @Value("${grpc.server.port:8090}")
       private int port;
      
       @Override
       public void run(ApplicationArguments args) throws Exception {
      
        ServerBuilder serverBuilder = ServerBuilder
          .forPort(port);
      
        if (services != null && !services.isEmpty()) {
         for (BindableService bindableService : services) {
          serverBuilder.addService(bindableService);
         }
        }
        Server server = serverBuilder.build();
        serverBuilder.intercept(TransmitStatusRuntimeExceptionInterceptor.instance());
        server.start();
        startDaemonAwaitThread(server);
       }
      
      
       private void startDaemonAwaitThread(Server server) {
        Thread awaitThread = new Thread(() -> {
         try {
          server.awaitTermination();
         } catch (InterruptedException ignore) {
          
         }
        });
        awaitThread.setDaemon(false);
        awaitThread.start();
       }
      }

      Envoy代理

      gRPC服務(wù)運(yùn)行起來(lái)后就需要進(jìn)行調(diào)試了,比如使用curl、chrome等工具向gRPC服務(wù)發(fā)起Restful請(qǐng)求,實(shí)際上gRPC的調(diào)試并沒(méi)有那么簡(jiǎn)單。一開(kāi)始的方案是使用了gRPC-gateway,為每個(gè)服務(wù)都啟動(dòng)一個(gè)網(wǎng)關(guān)將Http 1.x請(qǐng)求轉(zhuǎn)換并發(fā)送到gRPC服務(wù)。然而gRPC-gateway只有g(shù)o語(yǔ)言的版本,并沒(méi)有Java語(yǔ)言的版本,所有在編譯和使用中比較困難,后來(lái)發(fā)現(xiàn)了Envoy提供了envoy.grpc_json_transcoder這個(gè)http過(guò)濾器,可以很方便的將RESTful JSON API轉(zhuǎn)換成gRPC請(qǐng)求并發(fā)送給gRPC服務(wù)器

      envoy的相關(guān)配置都放置在AppBubbleBackend/scripts/envoy目錄中,里面的envoy.yaml是一份簡(jiǎn)單的配置文件:

      static_resources:
       listeners:
       - name: grpc-8090
       address:
        socket_address: { address: 0.0.0.0, port_value: 8090 }
       filter_chains:
       - filters:
        - name: envoy.http_connection_manager
        config:
         stat_prefix: sms_http
         codec_type: AUTO
         # 省略部分配置
         http_filters:
         - name: envoy.grpc_json_transcoder
         config:
          proto_descriptor: "/app/app.protobin"
          services: ["sms.SmsService"]
          match_incoming_request_route: true
          print_options:
          add_whitespace: true
          always_print_primitive_fields: true
          always_print_enums_as_ints: false
          preserve_proto_field_names: false
      # 省略部分配置

      使用envoy.grpc_json_transcoder過(guò)濾器的主要配置是proto_descriptor選項(xiàng),該選項(xiàng)指向一個(gè)proto descriptor set文件。AppBubbleBackend/scripts/envoy/compile-descriptor.sh是編譯proto descriptor set的腳本文件, 運(yùn)行腳本文件會(huì)在腳本目錄下生成一個(gè)app.protobin的文件,將此文件設(shè)置到envoy.grpc_json_transcoder就可大致完成了envoy的代理配置。

      使用Docker發(fā)布

      經(jīng)過(guò)上面的一系統(tǒng)準(zhǔn)備工作之后,我們就可以將服務(wù)發(fā)布到docker中了,Docker相關(guān)的文件都放置中AppBubbleBackend/scripts/docker和一個(gè)AppBubbleBackend/docker-compose.yaml文件。在發(fā)布時(shí)使用單個(gè)Dockerfile文件來(lái)制作服務(wù)鏡像:

      FROM rcntech/ubuntu-grpc:v0.0.5
      EXPOSE 8080
      EXPOSE 8090
      
      #將當(dāng)前目錄添加文件到/bubble
      ARG APP_PROJECT_NAME
      #復(fù)制父pom.xml
      ADD /pom.xml /app/pom.xml
      ADD /protos /app/protos
      ADD $APP_PROJECT_NAME /app/$APP_PROJECT_NAME
      ADD scripts/gateway /app/gateway
      ADD scripts/docker/entrypoint.sh /app/entrypoint.sh
      RUN chmod u+x /app/entrypoint.sh
      
      ENTRYPOINT ["/app/entrypoint.sh"]

      有了Dockerfile文件后,在docker-compose.yaml里面做一些配置就能將服務(wù)打包成鏡像:

       sms:
       build:
       context: ./
       dockerfile: scripts/docker/Dockerfile
       args:
        APP_PROJECT_NAME: "AppBubbleSmsService"
       environment:
       APOLLO_META: "http://apollo-configservice-dev:8080"
       APP_PROJECT_NAME: "AppBubbleSmsService"
       ENV: dev

      同時(shí)編寫了一個(gè)通用的entrypoint.sh腳本文件來(lái)啟動(dòng)服務(wù)器:

      #!/bin/bash
      
      export GOPATH=${HOME}/go
      export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
      
      rootProjectDir="/app"
      projectDir="${rootProjectDir}/${APP_PROJECT_NAME}"
      
      cd ${rootProjectDir}/AppBubbleCommon
      ./mvnw install
      
      cd $projectDir
      #打包app.jar
      ./mvnw package -DskipTests -P docker-build
      #編譯proto文件
      ./mvnw protobuf:compile protobuf:compile-custom -P docker-build
      
      
      # Run service
      java -jar ${projectDir}/target/app.jar

      entrypoint.sh腳本中將服務(wù)工程編譯成app.jar包再運(yùn)行服務(wù)。還有envoy代理也要啟動(dòng)起來(lái)這樣我們就可以使用curl或其他工具直接進(jìn)行測(cè)試了。

      關(guān)于“SpringBoot集成gRPC微服務(wù)工程搭建的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


      本文標(biāo)題:SpringBoot集成gRPC微服務(wù)工程搭建的示例
      標(biāo)題來(lái)源:http://www.ef60e0e.cn/article/ieccgi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        关岭| 庆阳市| 青州市| 新沂市| 林芝县| 大名县| 湄潭县| 贵港市| 田阳县| 松阳县| 大城县| 卢氏县| 北票市| 曲麻莱县| 黄陵县| 宜都市| 乐至县| 盘山县| 大竹县| 体育| 睢宁县| 嫩江县| 布拖县| 柳州市| 平舆县| 孝昌县| 黎城县| 洛宁县| 永丰县| 龙山县| 渑池县| 甘南县| 循化| 肥东县| 神农架林区| 和顺县| 桑日县| 出国| 辉县市| 无棣县| 林周县|