千家信息网

springcloud集成grpc是怎样的

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,springcloud集成grpc是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。GRPC简介是谷歌开源的一个高性能的、通用的RP
千家信息网最后更新 2025年01月25日springcloud集成grpc是怎样的

springcloud集成grpc是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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、增加依赖

    io.protostuff    protostuff-core    1.6.0    io.protostuff    protostuff-runtime    1.6.0    io.grpc    grpc-all    ${grpc.version}    org.springframework.boot    spring-boot-configuration-processor    true    org.projectlombok    lombok    true    net.devh    grpc-server-spring-boot-starter

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

@GrpcServicepublic class HelloGrpcService extends HelloServiceGrpc.HelloServiceImplBase {    private static Logger logger = LoggerFactory.getLogger(UserProfileGrpcService.class);    @Override    public void hello(Hello.HelloRequest request, StreamObserver 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、增加启动类

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

5、增加yml配置

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

1、依赖包

    io.protostuff    protostuff-core    1.6.0    io.protostuff    protostuff-runtime    1.6.0    io.grpc    grpc-all    ${grpc.version}    org.springframework.boot    spring-boot-configuration-processor    true            org.springframework.boot            spring-boot-starter-web            org.projectlombok    lombok    true    net.devh    grpc-client-spring-boot-starter

2、增加调用service

@Servicepublic 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-clientserver:  port: 8012      grpc:  client:    hello-grpc-server:      enableKeepAlive: true      keepAliveWithoutCalls: true      negotiationType: plaintext

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

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

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

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

看完上述内容,你们掌握springcloud集成grpc是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0