springcloud集成grpc是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
是谷歌开源的一个高性能的、通用的RPC框架。和其他RPC一样,客户端应用程序可以直接调用远程服务的方法,就好像调用本地方法一样。它隐藏了底层的实现细节,包括序列化(XML、JSON、二进制)、数据传输(TCP、HTTP、UDP)、反序列化等,开发人员只需要关自业务本身,而不需要关注RPC的技术细节。
与其他RPC框架一样,gRPC也遵循定义服务(类似于定义接口的思想)。gRPC客户端通过定义方法名、方法参数和返回类型来声明一个可以被远程调用的接口方法。由服务端实现客户端定义的接口方法,并运行一个gRPC服务来处理gPRC 客户端调用。注意,gRPC客户端和服务端共用一个接口方法。
springcloud使用restful api进行内部通信,使用的是http1,而grpc使用http2来作为通信协议
至于http2的优势就不说了,对于很多电商服务内部调用链很复杂,使用grpc能有效的缩短通信时长。
这里序列化框架使用protobuf
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
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文件的集成方式。
看完上述内容,你们掌握springcloud集成grpc是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。