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

【干货】springcloud-nacos-grpc框架 实战

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

【干货】springcloud-nacos-grpc框架 实战

一.环境准备

java版本:jdk16

linux虚拟机(部署nacos)

nacos版本:2.0.3

开发工具:idea

二.新建父项目

pom文件:



    4.0.0

    com.zjlab.grpc
    grpcdemo
    1.0-SNAPSHOT
    pom
    
    
        grpc-api
        user-server
        client
    
    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.5.RELEASE
        
    
    
    
        2021.1
        2020.0.4
    
    
        
            org.projectlombok
            lombok
            1.18.20
            true
        
    

    
        
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${alibaba.version}
                pom
                import
            

            
            
                org.springframework.cloud
                spring-cloud-dependencies
                Hoxton.SR8
                pom
                import
            

            
                org.apache.commons
                commons-lang3
                3.4
            
                net.devh
                grpc-client-spring-boot-starter
                2.10.1.RELEASE
            
            
                net.devh
                grpc-server-spring-boot-starter
                2.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
        grpcdemo
        1.0-SNAPSHOT
    
    4.0.0

    com.zjlab.grpc
    grpc-api

    
        16
        16
    
    
        
            net.devh
            grpc-server-spring-boot-starter
        
    

    
        
            
                kr.motd.maven
                os-maven-plugin
                1.6.2
            
        
        
            
                org.xolstice.maven.plugins
                protobuf-maven-plugin
                0.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-plugin
                3.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里做如下配置

 
  apple-silicon
  
    osx-x86_64
  


      apple-silicon
    
四.新建user-server项目

结构:

 

pom文件:



    
        com.zjlab.grpc
        grpcdemo
        1.0-SNAPSHOT
    
    4.0.0
    user-server
    
        16
        16
    
    
        
            net.devh
            grpc-server-spring-boot-starter
        
        
            net.devh
            grpc-client-spring-boot-starter
        
        
            org.apache.commons
            commons-lang3
            3.12.0
        
        
            org.springframework.boot
            spring-boot-autoconfigure
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
            com.zjlab.grpc
            grpc-api
            1.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, StreamObserver responseObserver) {
        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

    client

    
        16
        16
    
    
        
            net.devh
            grpc-client-spring-boot-starter
        
        
            net.devh
            grpc-server-spring-boot-starter
        
        
            org.apache.commons
            commons-lang3
            3.12.0
        
        
            org.springframework.boot
            spring-boot-autoconfigure
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            com.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-api
            1.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不生效,一定要指定服务名

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

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

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