一.环境准备java版本:jdk16
linux虚拟机(部署nacos)
nacos版本:2.0.3
开发工具:idea
二.新建父项目pom文件:
4.0.0 com.zjlab.grpc grpcdemo1.0-SNAPSHOT pom grpc-api user-server client org.springframework.boot spring-boot-starter-parent2.3.5.RELEASE 2021.1 2020.0.4 org.projectlombok lombok1.18.20 true com.alibaba.cloud spring-cloud-alibaba-dependencies${alibaba.version} pom import org.springframework.cloud spring-cloud-dependenciesHoxton.SR8 pom import org.apache.commons commons-lang33.4 net.devh grpc-client-spring-boot-starter2.10.1.RELEASE net.devh grpc-server-spring-boot-starter2.10.1.RELEASE 可以看到分布式项目中主要分为三个模块
1.grpc-api 提供grpc能力,主要用来将proto生成相应的java代码
2.user-server模块 用户模块,主要提供grpc-server能力
3.client模块 对外提供http接口,调用grpc-server,此模块作为grpc-client
注意:lombok的版本要在1.18.20以上,否则编译报错(踩了坑)
三.新建grpc-api项目pom文件:
com.zjlab.grpc grpcdemo1.0-SNAPSHOT 4.0.0 com.zjlab.grpc grpc-api16 16 net.devh grpc-server-spring-boot-starterkr.motd.maven os-maven-plugin1.6.2 org.xolstice.maven.plugins protobuf-maven-plugin0.6.1 com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:1.34.1:exe:${os.detected.classifier} ${project.basedir}/src/main/java false compile compile-custom org.codehaus.mojo build-helper-maven-plugin3.0.0 add-source generate-sources add-source ${project.basedir}/src/main/gen ${project.basedir}/src/main/java 编写proto:
syntax = "proto3"; option java_multiple_files = true; package com.zjlab.grpc.proto; // 问好类 service Greeter { // 问候方法 rpc SayHello (HelloRequest) returns (HelloReply); } // 请求类 message HelloRequest { string name = 1; } // 回应类 message HelloReply { string message = 1; }指定了将proto编译成java代码的输出路径和proto中的package相同
接下来就是安装proto的idea插件:
执行完compile命令即可生成文件
注意:如果编译报以下错误(mac电脑m1芯片,又是踩坑):
需要在maven里做如下配置
四.新建user-server项目apple-silicon apple-silicon osx-x86_64 结构:
pom文件:
com.zjlab.grpc grpcdemo1.0-SNAPSHOT 4.0.0 user-server16 16 net.devh grpc-server-spring-boot-starternet.devh grpc-client-spring-boot-starterorg.apache.commons commons-lang33.12.0 org.springframework.boot spring-boot-autoconfigureorg.springframework.boot spring-boot-starter-webcom.alibaba.cloud spring-cloud-starter-alibaba-nacos-configcom.alibaba.cloud spring-cloud-starter-alibaba-nacos-discoverycom.zjlab.grpc grpc-api1.0-SNAPSHOT compile GreetImpl:package com.zjlab.grpc.user.impl; import com.zjlab.grpc.proto.GreeterGrpc; import com.zjlab.grpc.proto.HelloReply; import com.zjlab.grpc.proto.HelloRequest; import io.grpc.stub.StreamObserver; import net.devh.boot.grpc.server.service.GrpcService; @GrpcService public class GreetImpl extends GreeterGrpc.GreeterImplBase { @Override public void sayHello(HelloRequest req, StreamObserverresponseObserver) { HelloReply reply = HelloReply.newBuilder().setMessage(("Hello " + req.getName())).build(); responseObserver.onNext(reply); responseObserver.onCompleted(); System.out.println("Message from gRPC-Client:" + req.getName()); } } ServerApplication:package com.zjlab.grpc.user; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } }yml:
grpc: client: GLOBAL: negotiation-type: plaintext enable-keep-alive: true keep-alive-without-calls: true server: port: 7777 server: port: 8081 spring: application: name: springcloud-nacos-grpc-server profiles: active: dev cloud: nacos: discovery: server-addr: 10.101.116.3:8999 enabled: true namespace: grpc config: enabled: false五.新建client项目结构:
pom文件:
grpcdemo com.zjlab.grpc 1.0-SNAPSHOT 4.0.0 client16 16 net.devh grpc-client-spring-boot-starternet.devh grpc-server-spring-boot-starterorg.apache.commons commons-lang33.12.0 org.springframework.boot spring-boot-autoconfigureorg.springframework.boot spring-boot-starter-webcom.alibaba.cloud spring-cloud-starter-alibaba-nacos-config${alibaba.version} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery${alibaba.version} com.zjlab.grpc grpc-api1.0-SNAPSHOT compile controller:
package com.zjlab.client.controller; import com.zjlab.grpc.proto.GreeterGrpc; import com.zjlab.grpc.proto.HelloReply; import com.zjlab.grpc.proto.HelloRequest; import lombok.extern.slf4j.Slf4j; import net.devh.boot.grpc.client.inject.GrpcClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class GreetController { @GrpcClient("springcloud-nacos-grpc-server") GreeterGrpc.GreeterBlockingStub greeterStub; @GetMapping(value="greet") public String greet( String str) { HelloReply helloReply = null; System.out.println(str); try { helloReply = greeterStub.sayHello( HelloRequest.newBuilder().setName(str).build() ); return helloReply.toString(); } catch (Exception e) { log.info("ex{}",e); } return helloReply.toString(); } }
注意:最好不要在controller里写业务代码,这里是偷懒
ClientApplication:
package com.zjlab.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
yml:
grpc:
server:
port: 7778
client:
springcloud-nacos-grpc-server:
negotiation-type: plaintext
enable-keep-alive: true
keep-alive-without-calls: true
server:
port: 8089
spring:
application:
name: springcloud-nacos-grpc-client
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 10.101.116.3:8999
namespace: grpc
config:
enabled: false
六.调试
启动user-server和client服务
可以看到nacos上注册了这两个服务
接下来调用接口:http://localhost:8089/greet?str=1
服务端打印日志:
困惑:不知道为什么 negotiation-type: plaintext 这个配置用GLOBAL不生效,一定要指定服务名



