美文网首页spring cloud学习
Spring Cloud集成gRPC

Spring Cloud集成gRPC

作者: 梅西爱骑车 | 来源:发表于2021-04-02 10:25 被阅读0次

    通过SpringCloud进行搭建微服务应用,服务间得通信往往采用的是Feign中间件形式,实现简单快捷的调用,底层采用的http形式,相对于gRPC协议或者RPC协议的调用来说,性能相对低下,因此,可以切换开源技术框架gRPC实现。
    在微服务开发中,服务间的调用一般有两种方式:Feign、RestTemplate,但在实际使用过程中,尤其是Feign,存在各种限制及局限性,如:HTTP请求方式、返回类型等限制,有时会让你觉得那那都别扭。在微服务项目中,服务间的调用,是非常普遍频繁的,其性能也不是很理想。

    为了解决上述问题,进行反复对比,最终服务间的调用方式采取了gRPC方式,其显著特点就是性能之高(通信采用Netty),通过proto文件定义的接口也是非常清晰而又灵活。本文主要就gRPC在Spring Cloud项目中的使用进行说明实战。

    gRPC简介

    是谷歌开源的一个高性能的、通用的RPC框架。和其他RPC一样,客户端应用程序可以直接调用远程服务的方法,就好像调用本地方法一样。它隐藏了底层的实现细节,包括序列化(XML、JSON、二进制)、数据传输(TCP、HTTP、UDP)、反序列化等,开发人员只需要关自业务本身,而不需要关注RPC的技术细节。

    与其他RPC框架一样,gRPC也遵循定义服务(类似于定义接口的思想)。gRPC客户端通过定义方法名、方法参数和返回类型来声明一个可以被远程调用的接口方法。由服务端实现客户端定义的接口方法,并运行一个gRPC服务来处理gPRC 客户端调用。注意,gRPC客户端和服务端共用一个接口方法。

    Spring Cloud与gRPC

    springcloud使用restful api进行内部通信,使用的是http1,而grpc使用http2来作为通信协议

    至于http2的优势就不说了,对于很多电商服务内部调用链很复杂,使用grpc能有效的缩短通信时长。

    springboot2集成net.devh.grpc

    这里序列化框架使用protobuf

    grpc-server

    1、增加依赖

    <dependency>
        <groupId>io.protostuff</groupId>
        <artifactId>protostuff-core</artifactId>
        <version>1.6.0</version>
    </dependency>
    
    <dependency>
        <groupId>io.protostuff</groupId>
        <artifactId>protostuff-runtime</artifactId>
        <version>1.6.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-all</artifactId>
        <version>${grpc.version}</version>
    </dependency>
    <!-- Spring Boot 配置处理 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>net.devh</groupId>
        <artifactId>grpc-server-spring-boot-starter</artifactId>
    </dependency>
    
    

    2、增加protobuf配置文件

    在src/main/proto下增加配置文件hello.proto

    syntax = "proto3";
    package com.demo;
    option java_package = "com.demo";
    
    message HelloRequest {
        string name = 1;
    }
    
    message HelloResponse {
        string name = 1;
        string status = 1;
    }
    
    // rpc 服务
    service HelloService {
        rpc hello(HelloRequest) returns(HelloResponse) {}
    }
    
    

    3、通过proto自动生成java代码并增加grpcservice

    @GrpcService
    public class HelloGrpcService extends HelloServiceGrpc.HelloServiceImplBase {
        private static Logger logger = LoggerFactory.getLogger(UserProfileGrpcService.class);
    
        @Override
        public void hello(Hello.HelloRequest request, StreamObserver<Hello.HelloResponse> responseObserver) {
            logger.info("hello start");
            final Hello.HelloResponse.Builder replyBuilder = Hello.HelloResponse.newBuilder().setName(request.getName()).setStatus("success");
            responseObserver.onNext(replyBuilder.build());
            responseObserver.onCompleted();
        }
    }
    
    

    4、增加启动类

    @EnableDiscoveryClient
    public class GrpcServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GrpcServerApplication.class, args);
        }
    
    }
    
    

    5、增加yml配置

    server:
      port: 8011
    grpc:
      server:
        port: 6000
    spring:
      application:
        name: hello-grpc-server
    
    

    grpc-client

    1、依赖包

    <dependency>
        <groupId>io.protostuff</groupId>
        <artifactId>protostuff-core</artifactId>
        <version>1.6.0</version>
    </dependency>
    
    <dependency>
        <groupId>io.protostuff</groupId>
        <artifactId>protostuff-runtime</artifactId>
        <version>1.6.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-all</artifactId>
        <version>${grpc.version}</version>
    </dependency>
    <!-- Spring Boot 配置处理 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>net.devh</groupId>
        <artifactId>grpc-client-spring-boot-starter</artifactId>
    </dependency>
    
    

    2、增加调用service

    @Service
    public class GrpcClientService {
    
        @GrpcClient("hello-grpc-server")
        private Channel serverChannel;
    
        public String hello(String name) {
            HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(serverChannel);
            Hello.HelloRequest.Builder builder= Hello.HelloRequest.newBuilder().
                    setName("xiaoli");
            Hello.HelloResponse response = stub.hello(builder.build());
            return "{'responseStatus':'"+response.getStatus()+"','result':[]}";
    
        }
    }
    
    

    其中这里已经增加了负载均衡,grpc官网推荐的负载均衡方案就是在应用层管理http2长连接池。

    增加controller

    @RestController
    @RequestMapping("/test")
    public class HelloController {
        private static Logger logger = LoggerFactory.getLogger(HelloController.class);
        @Autowired
        private GrpcClientService grpcClientService;
    
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String hello() {
            try {
                String result = grpcClientService.hello(“aa”);
                logger.debug(" respString : {}",result);
                return result;
            } catch (Throwable e) {
                logger.error("hello error", e);
            }
            return null;
        }
    
    

    增加yml配置

    info:
      version: 1.0
      name: hello-grpc-client
    
    server:
      port: 8012
    
    grpc:
      client:
        hello-grpc-server:
          enableKeepAlive: true
          keepAliveWithoutCalls: true
          negotiationType: plaintext
    
    

    启动服务可以访问http://localhost:8012/test/hello?进行测试

    总结

    这种方式集成每次都需要编写proto接口文件并自动生成代码,客户端和服务端都需要另外组装参数。

    不过优势是,有详细的接口规范(protobuf),并且可以支持异构语言调用。

    相关文章

      网友评论

        本文标题:Spring Cloud集成gRPC

        本文链接:https://www.haomeiwen.com/subject/rkpfkltx.html