溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springcloud集成grpc是怎樣的

發(fā)布時間:2021-10-19 15:55:26 來源:億速云 閱讀:223 作者:柒染 欄目:大數據

springcloud集成grpc是怎樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

GRPC簡介

是谷歌開源的一個高性能的、通用的RPC框架。和其他RPC一樣,客戶端應用程序可以直接調用遠程服務的方法,就好像調用本地方法一樣。它隱藏了底層的實現細節(jié),包括序列化(XML、JSON、二進制)、數據傳輸(TCP、HTTP、UDP)、反序列化等,開發(fā)人員只需要關自業(yè)務本身,而不需要關注RPC的技術細節(jié)。

與其他RPC框架一樣,gRPC也遵循定義服務(類似于定義接口的思想)。gRPC客戶端通過定義方法名、方法參數和返回類型來聲明一個可以被遠程調用的接口方法。由服務端實現客戶端定義的接口方法,并運行一個gRPC服務來處理gPRC 客戶端調用。注意,gRPC客戶端和服務端共用一個接口方法。

springcloud與grpc

springcloud使用restful api進行內部通信,使用的是http1,而grpc使用http2來作為通信協議

至于http2的優(yōu)勢就不說了,對于很多電商服務內部調用鏈很復雜,使用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接口文件并自動生成代碼,客戶端和服務端都需要另外組裝參數。

不過優(yōu)勢是,有詳細的接口規(guī)范(protobuf),并且可以支持異構語言調用。

后面會介紹只有java語言調用,但是不用每次都編寫proto文件的集成方式。

看完上述內容,你們掌握springcloud集成grpc是怎樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI