栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java版gRPC实战之二:服务发布和调用,微信聊天实战案例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java版gRPC实战之二:服务发布和调用,微信聊天实战案例

spring:

application:

name: local-server

gRPC有关的配置,这里只需要配置服务端口号

grpc:

server:

port: 9898

  • 新建拦截类LogGrpcInterceptor.java,每当gRPC请求到来后该类会先执行,这里是将方法名字在日志中打印出来,您可以对请求响应做更详细的处理:

package com.bolingcavalry.grpctutorials;

import io.grpc.metadata;

import io.grpc.ServerCall;

import io.grpc.ServerCallHandler;

import io.grpc.ServerInterceptor;

import lombok.extern.slf4j.Slf4j;

@Slf4j

public class LogGrpcInterceptor implements ServerInterceptor {

@Override

public ServerCall.Listener interceptCall(ServerCall serverCall, metadata metadata,

ServerCallHandler serverCallHandler) {

log.info(serverCall.getMethodDescriptor().getFullMethodName());

return serverCallHandler.startCall(serverCall, metadata);

}

}

  • 为了让LogGrpcInterceptor可以在gRPC请求到来时被执行,需要做相应的配置,如下所示,在普通的bean的配置中添加注解即可:

package com.bolingcavalry.grpctutorials;

import io.grpc.ServerInterceptor;

import net.devh.boot.grpc.server.interceptor.GrpcGlobalServerInterceptor;

import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)

public class GlobalInterceptorConfiguration {

@GrpcGlobalServerInterceptor

ServerInterceptor logServerInterceptor() {

return new LogGrpcInterceptor();

}

}

  • 应用启动类很简单:

package com.bolingcavalry.grpctutorials;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class LocalServerApplication {

public static void main(String[] args) {

SpringApplication.run(LocalServerApplication.class, args);

}

}

  • 接下来是最重要的service类,gRPC服务在此处对外暴露出去,完整代码如下,有几处要注意的地方稍后提到:

package com.bolingcavalry.grpctutorials;

import com.bolingcavalry.grpctutorials.lib.HelloReply;

import com.bolingcavalry.grpctutorials.lib.SimpleGrpc;

import net.devh.boot.grpc.server.service.GrpcService;

import java.util.Date;

@GrpcService

public class GrpcServerService extends SimpleGrpc.SimpleImplbase {

@Override

public void sayHello(com.bolingcavalry.grpctutorials.lib.HelloRequest request,

io.grpc.stub.StreamObserver responseObserver) {

HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + request.getName() + ", " + new Date()).build();

responseObserver.onNext(reply);

responseObserver.onCompleted();

}

}

  • 上述GrpcServerService.java中有几处需要注意:
  1. 是使用@GrpcService注解,再继承SimpleImplbase,这样就可以借助grpc-server-spring-boot-starter库将sayHello暴露为gRPC服务;

  2. SimpleImplbase是前文中根据proto自动生成的java代码,在grpc-lib模块中;

  3. sayHello方法中处理完毕业务逻辑后,调用HelloReply.onNext方法填入返回内容;

  4. 调用HelloReply.onCompleted方法表示本次gRPC服务完成;

  • 至此,gRPC服务端编码就完成了,咱们接着开始客户端开发;
调用gRPC
  • 在父工程grpc-turtorials下面新建名为local-client的模块,其build.gradle内容如下,注意要使用spingboot插件、依赖grpc-client-spring-boot-starter库:

plugins {

id ‘org.springframework.boot’

}

dependencies {

implementation ‘org.projectlombok:lombok’

implementation ‘org.springframework.boot:spring-boot-starter’

implementation ‘org.springframework.boot:spring-boot-starter-web’

implementation ‘net.devh:grpc-client-spring-boot-starter’

implementation project(’:grpc-lib’)

}

  • 应用配置文件grpc-tutorials/local-client/src/main/resources/application.yml,注意address的值就是gRPC服务端的信息,我这里local-server和local-client在同一台电脑上运行,请您根据自己情况来设置:

server:

port: 8080

spring:

application:

name: local-grpc-client

grpc:

client:

gRPC配置的名字,GrpcClient注解会用到

local-grpc-server:

gRPC服务端地址

address: ‘static://127.0.0.1:9898’

enableKeepAlive: true

keepAliveWithoutCalls: true

negotiationType: plaintext

-接下来要创建下图展示的类,按序号顺序创建:

  • 首先是拦截类LogGrpcInterceptor,与服务端的拦截类差不多,不过实现的接口不同:

package com.bolingcavalry.grpctutorials;

import io.grpc.*;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class LogGrpcInterceptor implements ClientInterceptor {

private static final Logger log = LoggerFactory.getLogger(LogGrpcInterceptor.class);

@Override

public ClientCall interceptCall(MethodDescriptor method,

CallOptions callOptions, Channel next) {

log.info(method.getFullMethodName());

return next.newCal

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

l(method, callOptions);

}

}

  • 为了让拦截类能够正常工作,即发起gRPC请求的时候被执行,需要新增一个配置类:

package com.bolingcavalry.grpctutorials;

import io.grpc.ClientInterceptor;

import net.devh.boot.grpc.client.interceptor.GrpcGlobalClientInterceptor;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.Ordered;

import org.springframework.core.annotation.Order;

@Order(Ordered.LOWEST_PRECEDENCE)

@Configuration(proxyBeanMethods = false)

public class GlobalClientInterceptorConfiguration {

@GrpcGlobalClientInterceptor

ClientInterceptor logClientInterceptor() {

return new LogGrpcInterceptor();

}

}

  • 启动类:

package com.bolingcavalry.grpctutorials;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class LocalGrpcClientApplication {

public static void main(String[] args) {

SpringApplication.run(LocalGrpcClientApplication.class, args);

}

}

  • 接下来是最重要的服务类GrpcClientService,有几处要注意的地方稍后会提到:

package com.bolingcavalry.grpctutorials;

import com.bolingcavalry.grpctutorials.lib.HelloReply;

import com.bolingcavalry.grpctutorials.lib.HelloRequest;

import com.bolingcavalry.grpctutorials.lib.SimpleGrpc;

import io.grpc.StatusRuntimeException;

import net.devh.boot.grpc.client.inject.GrpcClient;

import org.springframework.stereotype.Service;

@Service

public class GrpcClientService {

@GrpcClient(“local-grpc-server”)

private SimpleGrpc.SimpleBlockingStub simpleStub;

public String sendMessage(final String name) {

try {

final HelloReply response = this.simpleStub.sayHello(HelloRequest.newBuilder().setName(name).build());

return response.getMessage();

} catch (final StatusRuntimeException e) {

return "FAILED with " + e.getStatus().getCode().name();

}

}

}

  • 上述GrpcClientService类有几处要注意的地方:
  1. 用@Service将GrpcClientService注册为spring的普通bean实例;

  2. 用@GrpcClient修饰SimpleBlockingStub,这样就可以通过grpc-client-spring-boot-starter库发起gRPC调用,被调用的服务端信息来自名为local-grpc-server的配置;

  3. SimpleBlockingStub来自前文中根据helloworld.proto生成的java代码;

  4. SimpleBlockingStub.sayHello方法会远程调用local-server应用的gRPC服务;

  • 为了验证gRPC服务调用能否成功,再新增个web接口,接口内部会调用GrpcClientService.sendMessage,这样咱们通过浏览器就能验证gRPC服务是否调用成功了:

package com.bolingcavalry.grpctutorials;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class GrpcClientController {

@Autowired

private GrpcClientService grpcClientService;

@RequestMapping("/")

public String printMessage(@RequestParam(defaultValue = “will”) String name) {

return grpcClientService.sendMessage(name);

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489814.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号