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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。