文档章节

gRPC 小记

從此迷花粉
 從此迷花粉
发布于 2018/09/04 11:48
字数 937
阅读 178
收藏 0
  1. 创建一个maven项目demo-grpc 包含三个子模块:
    grpc-common:公共模块定义proto及生成java代码;
    grpc-server:grpc 服务端;
    grpc-client:grpc客户端。
    其中grpc-server、grpc-client 为spring-boot项目
  2. 在grcp-common的pom.xml文件中引入依赖jar,定义proto,生成java代码
    pom.xml:
    <?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">
        <parent>
            <artifactId>demo-grpc</artifactId>
            <groupId>com.cherrish</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>grpc-common</artifactId>
    
        <properties>
            <jackson.version>2.9.6</jackson.version>
            <grpc.version>1.14.0</grpc.version>
            <os.plugin.version>1.5.0.Final</os.plugin.version>
            <protobuf.plugin.version>0.5.0</protobuf.plugin.version>
            <protoc.version>3.3.0</protoc.version>
            <netty-common.version>4.1.29.Final</netty-common.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-netty</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-protobuf</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-stub</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-common</artifactId>
                <version>${netty-common.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
    
    
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.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>
                    <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>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>compile-custom</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>


    在java同目录下创建proto文件夹,并创建.proto文件

    user.proto:
     

    syntax = "proto3";
    
    option java_multiple_files = true;
    option java_package = "com.cherrish";
    option java_outer_classname = "UserProto";
    option objc_class_prefix = "CHL";
    
    package user;
    
    service UserService{
        rpc addUser (User) returns (BooleanReply){}
        rpc updateUser (User) returns (BooleanReply){}
        rpc removeUser (ConditionsRequest) returns (BooleanReply){}
        rpc findUser (ConditionsRequest) returns (User){}
    }
    
    message ConditionsRequest{
        string id = 1;
    }
    
    message User {
        string id = 1;
        string username = 2;
        string address = 3;
        int32 age = 4;
        int32 sex = 5;
        string createtime = 6;
        string updatetime = 7;
    }
    
    message BooleanReply{
        bool reply = 1;
    }
    
    message ObjectReply{
        bool reply = 1;
    }


    使用maven命令生成java文件:
    mvn protobuf:compile
    mvn protobuf:compile-custom

  3. 编写grpc-server 和 grpc-client代码
    grpc-server 添加maven依赖:

    <?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">
        <parent>
            <artifactId>demo-grpc</artifactId>
            <groupId>com.cherrish</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>grpc-server</artifactId>
    
        <properties>
            <grpc.stater.version>1.3.0-RELEASE</grpc.stater.version>
        </properties>
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-server-spring-boot-starter</artifactId>
                <version>2.0.1.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>com.cherrish</groupId>
                <artifactId>grpc-common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
        </dependencies>
    </project>

    grpc-server端代码:

    /*********************************UserGrpcService.java*****************************************/
    package com.cherrish;
    
    import io.grpc.stub.StreamObserver;
    import net.devh.springboot.autoconfigure.grpc.server.GrpcService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author cherrish
     * @time 2018-09-03 15:55
     * @name UserGrpcService
     * @desc:
     */
    @GrpcService(UserServiceGrpc.class)
    public class UserGrpcService extends UserServiceGrpc.UserServiceImplBase {
    
        private Logger logger = LoggerFactory.getLogger(UserGrpcService.class);
    
        @Override
        public void addUser(User request, StreamObserver<BooleanReply> responseObserver) {
            logger.info("User={id={}, username={}, address={}, age={}, sex={}, createtime={}, updatetime={}}",
                    request.getId(), request.getUsername(), request.getAddress(), request.getAge(), request.getSex(), request.getCreatetime(), request.getUpdatetime());
    
            //TODO 可以自定义实现
            BooleanReply replay = BooleanReply.newBuilder().setReply(true).build();
            responseObserver.onNext(replay);
            responseObserver.onCompleted();
        }
    }
    /*********************************GrpcServerApp.java*****************************************/
    package com.cherrish;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author cherrish
     * @time 2018-09-04 10:16
     * @name GrpcServerApp
     * @desc:
     */
    @SpringBootApplication
    public class GrpcServerApp {
        public static void main(String[] args) {
            SpringApplication.run(GrpcServerApp.class, args);
        }
    }
    

    grpc-server.properties

    spring.application.name=grpc-server
    server.port=8080
    grpc.server.port=7070

    ################################
    grpc-client 添加maven依赖:
     

    <?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">
        <parent>
            <artifactId>demo-grpc</artifactId>
            <groupId>com.cherrish</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>grpc-client</artifactId>
    
    
    
        <properties>
            <grpc.stater.version>1.3.0-RELEASE</grpc.stater.version>
        </properties>
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-client-spring-boot-starter</artifactId>
                <version>2.0.1.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>com.cherrish</groupId>
                <artifactId>grpc-common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
        </dependencies>
    </project>

    grpc-client端代码:
     

    /***************************UserGrpcService.java**********************************/
    package com.cherrish;
    
    import io.grpc.Channel;
    import net.devh.springboot.autoconfigure.grpc.client.GrpcClient;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    
    /**
     * @author cherrish
     * @time 2018-09-03 17:10
     * @name UserGrpcService
     * @desc:
     */
    @Service
    public class UserGrpcService {
        private Logger logger = LoggerFactory.getLogger(UserGrpcService.class);
        @GrpcClient("user-grpc-server")//名称须在配置文件中注明
        private Channel serverChannel;
    
        public String addUser( ){
            UserServiceGrpc.UserServiceBlockingStub stub = UserServiceGrpc.newBlockingStub(serverChannel);
            BooleanReply response = stub.addUser(
                    User.newBuilder()
                            .setId("10001")
                            .setUsername("grpc-test-user")
                            .setAddress("SHENZHEN")
                            .setAge(18)
                            .setSex(1)
                            .setCreatetime(System.currentTimeMillis() + "")
                            .setUpdatetime(System.currentTimeMillis() + "")
                            .build());
            logger.info("grpc-client received: ---> "+response.getReply());
            if(response.getReply()){
                return "success";
            }else{
                return "fail";
            }
        }
    }
    
    /***************************TestController.java**********************************/
    package com.cherrish;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author cherrish
     * @time 2018-09-04 10:12
     * @name TestController
     * @desc:
     */
    @RestController
    public class TestController {
        @Autowired
        private UserGrpcService userGrpcService;
    
        @GetMapping(value = "/add")
        public String add(){
            return userGrpcService.addUser();
        }
    
        @GetMapping(value = "/test")
        public String test(String name){
            return name;
        }
    }
    
    
    /***************************GrpcClientApp.java**********************************/
    package com.cherrish;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author cherrish
     * @time 2018-09-04 10:17
     * @name GrpcClientApp
     * @desc:
     */
    @SpringBootApplication
    public class GrpcClientApp {
        public static void main(String[] args) {
            SpringApplication.run(GrpcClientApp.class, args);
        }
    }
    

    grpc-client application.properties
     

    spring.application.name=grpc-client
    
    server.port=8081
    
    grpc.client.user-grpc-server.host=127.0.0.1
    grpc.client.user-grpc-server.port=7070

     

  4. 测试 

© 著作权归作者所有

從此迷花粉

從此迷花粉

粉丝 7
博文 175
码字总数 64022
作品 0
海淀
程序员
私信 提问
进行API开发选gRPC还是HTTP APIs?

上一篇文章我带着大家体验了一把《ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)》,如果有兴趣的可以点击链接进行查看,相信跟着做的你,也是可以跑起来的。这篇文章我们将一起来探讨下g...

依乐祝
04/02
0
0
Grpc介绍 — Go-Service To PHP-Client

笔者现在公司项目大部分是PHP进行开发,要完成整体微服务化必须要考虑PHP使用上的可行性,Grpc也是支持PHP作为client端发起Grpc请求,但是依赖的扩展等都相对复杂(毕竟不是亲儿子),那么本...

喵了_个咪
03/06
271
1
访问 gRPC 服务的 Web 客户端 - gRPC-Web

gRPC-Web 即 gRPC for Web Clients。顾名思义,gRPC-Web 是一个 JavaScript 库,使 Web 应用程序能够直接与后端 gRPC 服务通信,不需要 HTTP 服务器充当中介。 gRPC-Web GA 正式版已发布,稳...

匿名
2018/10/26
10.8K
1
RPC 开发框架 - python-grpc

该项目基于开发,定义了一个通用的 GRPC 服务和函数。通过反射和语法糖,客户端和服务端都可以轻松实现 RPC 服务。 项目路径 : grpc client demo : grpc server demo : python-grpc core mod...

匿名
08/20
277
0
mac下grpc(golang server + php client)实践

目前微服务这么流行,RPC框架也是百花齐放,本文讲述一下mac下grpc的开发环境搭建,其中server端使用golang,客户端使用php。 服务端 golang grpc安装 这里列出了一个参考,由于grpc在githu...

陈晓风
2018/07/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员web前端教程分享web前端入门基础知识

  好程序员web前端教程分享web前端入门基础知识,作为合格的Web前端工程师必须得掌握HTML、CSS和JavaScript。只懂其中一两个还不行,必须对这三门语言都要熟悉。下面我们一起来看一看吧! ...

好程序员官网
10分钟前
2
0
elasticsearch 中文分词插件IK-Analyze

elasticsearch 版本 7.3 安装中文分词插件 插件对应的版本需要和elasticsearch的版本一致 插件各个版本下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases 使用elastic...

kdy1994
14分钟前
3
0
只用一套解决方案,就可解决80%的交通物流行业信息难题

行业背景 新中国成立70多年来,中国交通运输总体上已经形成了多节点、全覆盖的综合运输网络,“五纵五横”综合运输大通道基本贯通,一大批综合客运、货运枢纽站场(物流园区)投入运营,取得...

朕想上头条
16分钟前
4
0
spring-boot结合AOP实现数据源动态配置

Spring-Boot+AOP方式实现多数据源切换 设计总体思路:Spring-Boot+AOP方式实现多数据源切换,继承AbstractRoutingDataSource实现数据源动态的获取,在service层使用注解指定数据源。 一、多数...

蜗牛伊
17分钟前
2
0
干货 | 京东技术中台的Flutter实践之路

在 2019 年,Flutter 推出了多个正式版本,支持的终端越来越多,使用的项目也越来越多。Flutter 正在经历从小范围尝鲜到大面积应用的过程,越来越多的研发团队加入到 Flutter 的学习热潮中,...

京东云技术新知
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部