diff --git a/pom.xml b/pom.xml index b81b6ae35..c64d3e3e9 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,8 @@ yudao-module-system yudao-module-infra - + yudao-module-grpc + @@ -30,6 +31,13 @@ 2.3.0-jdk8-SNAPSHOT + + + + + + + 1.8 ${java.version} diff --git a/yudao-module-grpc/pom.xml b/yudao-module-grpc/pom.xml new file mode 100644 index 000000000..94466dbe1 --- /dev/null +++ b/yudao-module-grpc/pom.xml @@ -0,0 +1,25 @@ + + + + cn.iocoder.cloud + yudao + ${revision} + + 4.0.0 + + yudao-module-grpc-api + yudao-module-grpc-biz + yudao-module-grpc-lib + + + yudao-module-grpc + pom + + ${project.artifactId} + + grpc 模块下,与机器人接口调用。 + + + \ No newline at end of file diff --git a/yudao-module-grpc/yudao-module-grpc-api/pom.xml b/yudao-module-grpc/yudao-module-grpc-api/pom.xml new file mode 100644 index 000000000..f135df12d --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-api/pom.xml @@ -0,0 +1,48 @@ + + + + cn.iocoder.cloud + yudao-module-grpc + ${revision} + + 4.0.0 + yudao-module-grpc-api + jar + + ${project.artifactId} + + grpc 模块 API,暴露给其它模块调用 + + + + + cn.iocoder.cloud + yudao-common + + + + + org.springdoc + springdoc-openapi-ui + provided + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + true + + + + + \ No newline at end of file diff --git a/yudao-module-grpc/yudao-module-grpc-biz/pom.xml b/yudao-module-grpc/yudao-module-grpc-biz/pom.xml new file mode 100644 index 000000000..026a7d4c9 --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-biz/pom.xml @@ -0,0 +1,195 @@ + + + + cn.iocoder.cloud + yudao-module-grpc + ${revision} + + 4.0.0 + yudao-module-grpc-biz + jar + + ${project.artifactId} + + grpc 模块下,与机器人通信。 + + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + cn.iocoder.cloud + yudao-spring-boot-starter-env + + + + + cn.iocoder.cloud + yudao-module-grpc-api + ${revision} + + + cn.iocoder.cloud + yudao-module-grpc-lib + ${revision} + + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-biz-data-permission + + + cn.iocoder.cloud + yudao-spring-boot-starter-biz-tenant + + + + cn.iocoder.cloud + yudao-spring-boot-starter-biz-ip + + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-websocket + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-mybatis + + + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-rpc + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-mq + + + + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-excel + + + + + + org.springframework.boot + spring-boot-starter-mail + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-monitor + + + + + + + net.devh + grpc-client-spring-boot-starter + 1.4.0.RELEASE + + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + org.apache.maven.pluginsmaven-compiler-plugin88 + + + + diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/GrpcServerApplication.java b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/GrpcServerApplication.java new file mode 100644 index 000000000..11965baef --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/GrpcServerApplication.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.grpc; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GrpcServerApplication { + public static void main(String[] args) { + // 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章 + // 如果你碰到 启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章 + // 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章 + + SpringApplication.run(GrpcServerApplication.class, args); + System.out.println("启动了"); + + // 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章 + // 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章 + // 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章 + } +} diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/controller/GeometryController.java b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/controller/GeometryController.java new file mode 100644 index 000000000..f8c05b260 --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/controller/GeometryController.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.grpc.controller; + + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.grpc.service.geometry.GeometryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "测试demo") +@RestController +@RequestMapping("/grpc/robot") +//@Validated +public class GeometryController { + + @Resource + private GeometryService geometryService; + + @PostMapping("/onVehiclePoseUpdated") + //@Operation(summary = "测试GRPC调用") +// @PermitAll + public CommonResult onVehiclePoseUpdated() { + return success(geometryService.onVehiclePoseUpdated()); + } +} diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryService.java b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryService.java new file mode 100644 index 000000000..c86580005 --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryService.java @@ -0,0 +1,5 @@ +package cn.iocoder.yudao.module.grpc.service.geometry; + +public interface GeometryService { + String onVehiclePoseUpdated(); +} diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryServiceImpl.java b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryServiceImpl.java new file mode 100644 index 000000000..76a8153f8 --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryServiceImpl.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.grpc.service.geometry; + +import io.grpc.Channel; +import net.devh.boot.grpc.examples.lib.HelloRequest; +import net.devh.boot.grpc.examples.lib.MyServiceGrpc; +import net.devh.springboot.autoconfigure.grpc.client.GrpcClient; +import org.springframework.stereotype.Service; + +@Service +public class GeometryServiceImpl implements GeometryService{ + + @GrpcClient("zn-robot") + private Channel serverChannel; + + @Override + public String onVehiclePoseUpdated() { + return receiveGreeting("test"); + } + + public String receiveGreeting(String name) { + MyServiceGrpc.MyServiceBlockingStub myServiceStub = MyServiceGrpc.newBlockingStub(this.serverChannel); + HelloRequest request = HelloRequest.newBuilder() + .setName(name) + .build(); + return myServiceStub.sayHello(request).getMessage(); + } + +} diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application-local.yaml b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application-local.yaml new file mode 100644 index 000000000..cb9e98834 --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application-local.yaml @@ -0,0 +1,41 @@ +--- #################### 数据库相关配置 #################### +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 6379 # 端口 + database: 0 # 数据库索引 + password: yhtkj@2024! # 密码,建议生产环境开启 + + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoints: + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + + +# 日志文件配置 +logging: + level: + # 配置自己写的 MyBatis Mapper 打印日志 + cn.iocoder.yudao.module.system.dal.mysql: debug + cn.iocoder.yudao.module.system.dal.mysql.sensitiveword.SensitiveWordMapper: INFO # 配置 SensitiveWordMapper 的日志级别为 info + cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 配置 SmsChannelMapper 的日志级别为 info + + diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application.yaml b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application.yaml new file mode 100644 index 000000000..e1ee0334b --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application.yaml @@ -0,0 +1,103 @@ +# grpc配置 +grpc: + # grpc clienT相关配置 + client: + # 服务名(不同服务名可对应不同配置) + # zn-zeu是服务端配置的名字,GrpcClient注解会用到 + zn-robot: + # gRPC服务端地址 + # address: 'dns://127.0.0.1:19898' + address: 'static://192.168.10.211:6914' + # 是否开启保持连接(长连接) + enableKeepAlive: true + # 保持连接时长(默认20s) + keepAliveTimeout: 10 + # 没有RPC调用时是否保持连接(默认false,可禁用避免额外消耗CPU) + keepAliveWithoutCalls: false + # 客户端负载均衡策略(round_robin(默认), pick_first) + defaultLoadBalancingPolicy: round_robin + # 通信类型 + # plaintext | plaintext_upgrade | tls + # 明文通信且http/2 | 明文通信且升级http/1.1为http/2 | 使用TLS(ALPN/NPN)通信 + negotiationType: plaintext + + + +spring: + application: + name: grpc-server + main: + allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 + allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务 + + profiles: + active: local + + # Servlet 配置 + servlet: + # 文件上传相关配置项 + multipart: + max-file-size: 16MB # 单个文件大小 + max-request-size: 32MB # 设置总上传的文件大小 + mvc: + pathmatch: + matching-strategy: ANT_PATH_MATCHER # 解决 SpringFox 与 SpringBoot 2.6.x 不兼容的问题,参见 SpringFoxHandlerProviderBeanPostProcessor 类 + + # Jackson 配置项 + jackson: + serialization: + write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳 + write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 + fail-on-empty-beans: false # 允许序列化无属性的 Bean + + # Cache 配置项 + cache: + type: REDIS + redis: + time-to-live: 1h # 设置过期时间为 1 小时 + +server: + port: 48082 + + +--- #################### 接口文档配置 #################### + +springdoc: + api-docs: + enabled: true # 1. 是否开启 Swagger 接文档的元数据 + path: /v3/api-docs + swagger-ui: + enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面 + path: /swagger-ui.html + default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 + +knife4j: + enable: true # 2.2 是否开启 Swagger 文档的 Knife4j UI 界面 + setting: + language: zh_cn + +yudao: + info: + version: 1.0.0 + base-package: cn.iocoder.yudao.module.pay + web: + admin-ui: + url: http://sys.znkjfw.com # Admin 管理后台 UI 的地址 + swagger: + title: 管理后台 + description: 提供管理员管理的所有功能 + version: ${yudao.info.version} + base-package: ${yudao.info.base-package} + error-code: # 错误码相关配置项 + constants-class-list: + - cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants + tenant: # 多租户相关配置项 + enable: true + ignore-urls: + - /admin-api/pay/notify/** # 支付回调通知,不携带租户编号 + + +debug: false + + diff --git a/yudao-module-grpc/yudao-module-grpc-lib/pom.xml b/yudao-module-grpc/yudao-module-grpc-lib/pom.xml new file mode 100644 index 000000000..c489da83b --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-lib/pom.xml @@ -0,0 +1,77 @@ + + + + cn.iocoder.cloud + yudao-module-grpc + ${revision} + + 4.0.0 + yudao-module-grpc-lib + jar + + ${project.artifactId} + + grpc 模块 LIB,生成GRPC的proto文件 + + + + + 1.10.0 + + 3.0.0 + + + + + io.grpc + grpc-stub + ${grpc.version} + + + io.grpc + grpc-protobuf + ${grpc.version} + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + + + + + kr.motd.maven + os-maven-plugin + 1.5.0.Final + + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.5.1 + + com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} + + + + + compile + compile-custom + + + + + + + + \ No newline at end of file diff --git a/yudao-module-grpc/yudao-module-grpc-lib/src/main/proto/Greeter.proto b/yudao-module-grpc/yudao-module-grpc-lib/src/main/proto/Greeter.proto new file mode 100644 index 000000000..8798cb9f2 --- /dev/null +++ b/yudao-module-grpc/yudao-module-grpc-lib/src/main/proto/Greeter.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package net.devh.boot.grpc.example; + +option java_multiple_files = true; +option java_package = "net.devh.boot.grpc.examples.lib"; +option java_outer_classname = "HelloWorldProto"; + +// The greeting service definition. +service MyService { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) { + } +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; +} \ No newline at end of file