1. 程式人生 > >Spring Boot 2+gRPC 學習系列1:搭建Spring Boot 2+gRPC本地專案

Spring Boot 2+gRPC 學習系列1:搭建Spring Boot 2+gRPC本地專案

本專案基於Spring Boot 2.0.5+yidongnan/grpc-spring-boot-starter 2.0.1.RELEASE,通過grpc-lib,grpc-server,grpc-client 3個模組來模擬grpc的服務呼叫。

主要參考自yidongnan/grpc-spring-boot-starter和LogNet/grpc-spring-boot-starter的官方example yidongnan專案的主要優點有:專案使用maven和gradle兩種方式,grpc-client連線grpc-server的channel通過註解自動注入,較優雅。缺點是文件沒LogNet的豐富。兩者功能相近,所以我使用了yidognnan的starter。

一 專案結構

1 專案結構

根專案(com.linshen:grpc-springboot-lin:1.0-SNAPSHOT)下有3個子模組:

  • grpc-lib:包含原始proto檔案,並負責將其轉換為java程式碼
  • grpc-server:grpc服務端
  • grpc-client : grpc客戶端

2 模組功能

  • 相互關係 根專案負責依賴版本管理,grpc-server和grpc-client都依賴grpc-lib的介面,其中,grpc-server提供了介面的具體實現,而grpc-client則呼叫了grpc-server的實現,他們通過grpc-lib來確定使用規範(介面即契約)
  • 對應MVC關係
    • grpc-lib就是service(介面,為提供實現)
    • grpc-server就相當於serviceImpl(service的實現類)
    • grpc-client就是controller的角色.
  • 框架依賴
    • grpc-lib需要將proto檔案轉換成java類,故需依賴於protobuf-maven-plugin外掛,另外還需要io.grpc下的grpc-all,否則生成的java類會提示缺少依賴
    • grpc-server 負責提供rpc服務,不需要spring-web支援
    • grpc-client 呼叫rpc服務

二 專案搭建

0 編寫根專案pom檔案

如下,根專案主要負責定義專案子模組,全域性屬性和版本管理

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.linshen</groupId>
    <artifactId>grpc-springboot-lin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <!--引入的子模組-->
    <modules>
        <module>grpc-lib</module>
        <module>grpc-server</module>
        <module>grpc-client</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-boot.version>2.0.5.RELEASE</spring-boot.version>
        <net-devh-grpc.version>2.0.1.RELEASE</net-devh-grpc.version>

    </properties>

    <dependencyManagement>
        <dependencies>
            <!--依賴維護平臺,在新增第三方依賴的時候,不需要寫版本號,它能夠自動幫我們挑選一個最優的版本-->
            <dependency>
                <groupId>io.spring.platform</groupId>
                <artifactId>platform-bom</artifactId>
                <version>Cairo-RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--公共grpc模組-->
            <dependency>
                <groupId>com.linshen</groupId>
                <artifactId>grpc-lib</artifactId>
                <version>${project.version}</version>
            </dependency>
            <!--核心grpc-spring-boot依賴-->
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-client-spring-boot-starter</artifactId>
                <version>${net-devh-grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-server-spring-boot-starter</artifactId>
                <version>${net-devh-grpc.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

1 建立grpc-lib模組

建立maven管理的java專案,pom檔案如下 proto檔案目錄是${project.basedir}/src/main/proto 生成的java程式碼在${project.basedir}/src/main/java 使用maven指令compile可完成程式碼生成,或直接在IDE裡用proto外掛執行compilecompile-custom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>grpc-lib</artifactId>
    <packaging>jar</packaging>

    <name>grpc-lib</name>

    <parent>
        <groupId>com.linshen</groupId>
        <artifactId>grpc-springboot-lin</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <properties>
        <os.plugin.version>1.6.0</os.plugin.version>
        <grpc.version>1.15.1</grpc.version>
        <protoc.version>3.6.1</protoc.version>
        <protobuf.plugin.version>0.6.1</protobuf.plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>${grpc.version}</version>
        </dependency>
    </dependencies>

    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>${os.plugin.version}</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>${protobuf.plugin.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
                    <!--預設值-->
                    <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                    <!--預設值-->
                    <!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>-->
                    <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                    <!--設定是否在生成java檔案之前清空outputDirectory的檔案,預設值為true,設定為false時也會覆蓋同名檔案-->
                    <clearOutputDirectory>false</clearOutputDirectory>
                    <!--更多配置資訊可以檢視https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html-->
                </configuration>
                <executions>
                    <execution>
                        <!--在執行mvn compile的時候會執行以下操作-->
                        <phase>compile</phase>
                        <goals>
                            <!--生成OuterClass類-->
                            <goal>compile</goal>
                            <!--生成Grpc類-->
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2 建立grpc-server模組

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>grpc-server</artifactId>
    <packaging>jar</packaging>

    <name>grpc-server</name>

    <parent>
        <groupId>com.linshen</groupId>
        <artifactId>grpc-springboot-lin</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.linshen</groupId>
            <artifactId>grpc-lib</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-server-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>  
</project>

3 建立grpc-client模組

可以看到,這裡比grpc-server多了spring-web依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>grpc-client</artifactId>
    <packaging>jar</packaging>

    <name>grpc-client</name>

    <parent>
        <groupId>com.linshen</groupId>
        <artifactId>grpc-springboot-lin</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.linshen</groupId>
            <artifactId>grpc-lib</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-client-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

三 功能實現

1 在grpc-lib模組利用proto檔案生成java程式碼

(1) 編寫proto檔案

這裡用的greeter.proto內容如下

syntax = "proto3";

option java_package = "com.linshen.grpc.lib";

// The greeter service definition.
service Greeter {
    // Sends a greeting
    rpc SayHello ( HelloRequest) returns (  HelloReply) {}

}
// The request message containing the user's name.
message HelloRequest {
    string name = 1;
}
// The response message containing the greetings
message HelloReply {
    string message = 1;
}

(2) 生成java程式碼

根據上文pom檔案的設定,將proto檔案放到src/main/proto目錄下,執行protobuf外掛的compile和compile-custom功能,生成java程式碼到src/main/java目錄下。 生成後文件目錄如下 grpc

2 在grpc-server模組實現介面

(1) 編寫application檔案

首先在application.yml檔案指定應用名和grpc埠,如下

spring:
  application:
    name: local-grpc-server
grpc:
  server:
    port: 9898

(2) 編寫GreeterService類

@Slf4j
@GrpcService(GreeterOuterClass.class)
public class GreeterService extends GreeterGrpc.GreeterImplBase {
    @Override
    public void sayHello(GreeterOuterClass.HelloRequest request, StreamObserver<GreeterOuterClass.HelloReply> responseObserver) {
        String message = "Hello " + request.getName();
        final GreeterOuterClass.HelloReply.Builder replyBuilder = GreeterOuterClass.HelloReply.newBuilder().setMessage(message);
        responseObserver.onNext(replyBuilder.build(
            
           

相關推薦

Spring Boot 2+gRPC 學習系列1:搭建Spring Boot 2+gRPC本地專案

本專案基於Spring Boot 2.0.5+yidongnan/grpc-spring-boot-starter 2.0.1.RELEASE,通過grpc-lib,grpc-server,grpc-client 3個模組來模擬grpc的服務呼叫。 主要參考自y

Spring Boot 2+gRPC 學習系列2:搭建Spring Cloud +gRPC叢集專案

本專案基於Spring Boot 2.0.5+yidongnan/grpc-spring-boot-starter 2.0.1.RELEASE+SpringCloud Finchley.SR1,通過2個grpc-eureka-server模擬Eureka叢集,

Spring Boot學習筆記1——搭建一個簡單的Spring Boot專案

1.建立一個Maven專案匯入相應的依賴 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio

Jmeter學習系列----1 環境搭建

注:在安裝Jmeter之前,請先檢查下電腦有沒有裝JDK:開始->執行->然後輸入cmd->進入命令列介面,輸入java -version , 出現以下資訊就是此電腦已安裝了JDK。 下載Jmeter 下載地址:http://jmeter.apache.org/download_jm

大資料學習系列8-Centos6.7 hadoop-2.6.5下sqoop-1.4.6的安裝部署

安裝sqoop的前提是已經具備java和hadoop的環境 1、下載並解壓 2、修改配置檔案 $ cd $SQOOP_HOME/conf $ mv sqoop-env-template.sh sqoop-env.sh 開啟sqoop-env.sh並編輯下面幾

Spring Cloud 2.1 搭建Spring Cloud

1.開發環境: 1. JDK 1.8 2. IntelliJ IDEA  2.開發步驟: 1. IDEA 中 新建Maven專案 2. pom.xml 新增依賴 spring-boot-starter-web <dependencies> <

spring-boot問題1:搭建spring-boot專案報錯 Error parsing lifecycle processing instructions

操作環境 系統:windows10 jdk:1.7 開發工具:eclipse4.6 springboot版本:1.5.3 構建工具:maven 問題及其產生背景 剛開始學習搭建spring-boot專案,遇到的問題。 新建完maven專案之後,在向pom

Docker學習-Kubernetes 叢集搭建 - Spring Boot 應用

  Docker學習 Docker學習-VMware Workstation 本地多臺虛擬機器互通,主機網路互通搭建 Docker學習-Docker搭建Consul叢集 Docker學習-簡單的私有DockerHub搭建 Docker學習-Spring Boot on Docker Docker學習

Spring框架學習1Spring簡介

校驗和 遵從 直接 特定 cto 適合 配置 有意 允許 內容源自:Spring 框架簡介 Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框

Mybatis學習系列(1) –– 入門簡介

connector ring cti 行操作 底層 數據庫連接 lean lose style MyBatis簡介 Mybatis是Apache的一個Java開開源項目,是一個支持動態Sql語句的持久層框架。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語

Nginx學習系列搭建環境

1、Win10下安裝vmware14虛擬機器軟體 官方下載地址 全程next,輸入key,啟用即可.   2、在虛擬機器中安裝Linux伺服器環境,作業系統為Centos7 繼續下一步,安裝完成!   3、下載Centos映象 官方下載地址 編輯虛擬機器

Linux下Nginx實現負載均衡 Nginx學習系列搭建環境

關於在本地虛擬機器(VMware 14)下安裝Linux同時安裝Nginx,請參考Nginx學習系列之搭建環境 1、啟動Nginx 在Nginx安裝成功的前提下,啟動Nginx 已root模式登陸(許可權需要),接著找到Nginx的安裝目錄,啟動Nginx,並且指定Nginx啟動所需的配置檔案,該檔

Git學習系列1 安裝

一 Git是什麼? Git是目前世界上最先進的分散式版本控制系統。 二 安裝 1 Linux 如果你想在 Linux 上用二進位制安裝程式來安裝 Git,可以使用發行版包含的基礎軟體包管理工具來安裝。  Git官網地址 2 Mac 最簡單的方法是在Xc

React 部落格系列 (1) 搭建的個人部落格

React 搭建的個人部落格 github個人部落格原始碼持續更新中。。。 小白起步,搭建的個人部落格,具有前端和管理端,還未完工,會持續更新。前後端分離,前端採用Mock.js模擬資料,部分引用antd元件,後端利用MongoDB儲存,axios傳遞資料,相關技術

Jmeter學習系列----1 錄製指令碼

雖然專業的自動化測試人員都不會選擇錄製指令碼的方式來進行自動化指令碼的編寫,但是,我們作為初學者還是可以學習一下怎麼利用工具來進行指令碼的錄製,體驗一下自動化工具的效率,下面,具體講下如何使用jmeter自身以及badboy進行指令碼錄製。 Jmeter錄製:    &nbs

Hadoop-0.20.2原始碼學習1)——原始碼初窺

參考: JeffreyZhou的部落格園 《Hadoop權威指南》第四版 0. 為什麼選擇0.20.2版本 前面學習搭建的Hadoop版本是2.7.6,可是這裡為什麼要學習0.20.2這麼老的版本呢?

ExtJs2.0學習系列(1)--Ext.MessageBox

1 .animEl:對話方塊彈出和關閉時的動畫效果,比如設定為“id1”,則從id1處彈出併產生動畫,收縮則相反 2 .buttons:彈出框按鈕的設定,主要有以下幾種:Ext.Msg.OK,                                        Ext.Msg.OKCANC

機器學習系列1 PCA(主成分分析法)

1.PCA的應用    1.降維    2.去除資料相關性,對資料特徵進行抽取 2.主成分選擇原則   (1)主成分是原來變數的線性組合;   (2)各主成分之間互不相關;   (3)主成分分析的實質就是找到一個正交變換,即有正交陣U,使得一個?維向量    

Quartz_2.2.X學習系列二十:Example 8

Demonstrates how a Holiday calendar can be used to exclude execution of jobs on a holiday ---------------------------------------------

Servlet學習系列1

一.引言: 1.什麼是Servlet? JavaWeb 開發規範中的一個組成部分。 伺服器端的一段小程式(程式碼)   2.什麼是伺服器?→ 安裝了伺服器軟體的計算機。 硬體:電腦 --->高效能的電腦 cpu  記憶體  硬碟 伺服器軟體:Tomcat&nb