您好,登錄后才能下訂單哦!
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。