首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springcloud集成grpc(一)

springcloud集成grpc(一)

作者头像
一笠风雨任生平
发布2019-08-02 11:09:10
3K0
发布2019-08-02 11:09:10
举报
文章被收录于专栏:服务化进程服务化进程

GRPC简介

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

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

springcloud与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),并且可以支持异构语言调用。

后面会介绍只有java语言调用,但是不用每次都编写proto文件的集成方式。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GRPC简介
  • springcloud与grpc
  • springboot2集成net.devh.grpc
    • grpc-server
      • grpc-client
      • 总结
      相关产品与服务
      负载均衡
      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档