星语课程网
新建服务
来源:本站编辑
2023-06-15 21:31
73
## 新建服务 本章节,将介绍如何新建名字为 `yudao-module-demo` 的示例服务,并添加 RESTful API 接口。 虽然内容看起来比较长,是因为艿艿写的比较详细,大量截图,保姆级教程!其实只有 6 个步骤,保持耐心,跟着艿艿一点点来。? 完成之后,你会对整个 [项目结构](/project-intro/) 有更充分的了解。 [#](#?-相关视频教程) ? 相关视频教程 ------------------------- * [从零开始 06:如何 5 分钟,创建一个新模块? (opens new window)](https://t.zsxq.com/07EUrZrNV) 【该视频是 Boot 单体版,Cloud 待录制】 [#](#_1-新建-demo-模块) 1. 新建 demo 模块 --------------------------------- ① 选择 File -> New -> Module 菜单,如下图所示:  ② 选择 Maven 类型,选择父模块为 `yudao`,输入名字为 `yudao-module-demo`,并点击 Create 按钮,如下图所示:  ③ 打开 `yudao-module-demo` 模块,删除 src 文件,如下图所示:  ④ 打开 `yudao-module-demo` 模块的 `pom.xml` 文件,修改内容如下: 提示 `` 部分,只是注释,不需要写到 XML 中。
yudao
cn.iocoder.cloud
${revision}
4.0.0
yudao-module-demo
pom
${project.artifactId}
demo 模块,主要实现 XXX、YYY、ZZZ 等功能。
[#](#_2-新建-demo-api-子模块) 2. 新建 demo-api 子模块 ------------------------------------------- ① 新建 `yudao-module-demo-api` 子模块,整个过程和“新建 demo 模块”是一致的,如下图所示:   ② 打开 `yudao-module-demo-api` 模块的 `pom.xml` 文件,修改内容如下:
yudao-module-demo
cn.iocoder.cloud
${revision}
4.0.0
yudao-module-demo-api
jar
${project.artifactId}
demo 模块 API,暴露给其它模块调用
cn.iocoder.cloud
yudao-common
③ 【可选】新建 `cn.iocoder.yudao.module.demo` **基础**包,其中 `demo` 为模块名。之后,新建 `api` 和 `enums` 包。如下图所示:  [#](#_3-新建-demo-biz-子模块) 3. 新建 demo-biz 子模块 ------------------------------------------- ① 新建 `yudao-module-demo-biz` 子模块,整个过程和“新建 demo 模块”也是一致的,如下图所示:   ② 打开 `yudao-module-demo-biz` 模块的 `pom.xml` 文件,修改成内容如下:
yudao-module-demo
cn.iocoder.cloud
${revision}
4.0.0
jar
yudao-module-demo-biz
${project.artifactId}
demo 模块,主要实现 XXX、YYY、ZZZ 等功能。
org.springframework.cloud
spring-cloud-starter-bootstrap
cn.iocoder.cloud
yudao-spring-boot-starter-env
cn.iocoder.cloud
yudao-module-system-api
${revision}
cn.iocoder.cloud
yudao-module-infra-api
${revision}
cn.iocoder.cloud
yudao-module-demo-api
${revision}
cn.iocoder.cloud
yudao-spring-boot-starter-banner
cn.iocoder.cloud
yudao-spring-boot-starter-biz-operatelog
cn.iocoder.cloud
yudao-spring-boot-starter-biz-dict
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-error-code
cn.iocoder.cloud
yudao-spring-boot-starter-web
cn.iocoder.cloud
yudao-spring-boot-starter-security
cn.iocoder.cloud
yudao-spring-boot-starter-mybatis
cn.iocoder.cloud
yudao-spring-boot-starter-redis
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-job
cn.iocoder.cloud
yudao-spring-boot-starter-mq
cn.iocoder.cloud
yudao-spring-boot-starter-test
cn.iocoder.cloud
yudao-spring-boot-starter-excel
cn.iocoder.cloud
yudao-spring-boot-starter-monitor
${project.artifactId}
org.springframework.boot
spring-boot-maven-plugin
${spring.boot.version}
true
repackage
③ 【必选】新建 `cn.iocoder.yudao.module.demo` **基础**包,其中 `demo` 为模块名。之后,新建 `controller.admin` 和 `controller.user` 等包。如下图所示:  其中 SecurityConfiguration 的 Java 代码如下: package cn.iocoder.yudao.module.demo.framework.security.config; import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer; import cn.iocoder.yudao.module.system.enums.ApiConstants; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; /** * Demo 模块的 Security 配置 */ @Configuration(proxyBeanMethods = false) public class SecurityConfiguration { @Bean public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { return new AuthorizeRequestsCustomizer() { @Override public void customize(ExpressionUrlAuthorizationConfigurer
.ExpressionInterceptUrlRegistry registry) { // Swagger 接口文档 registry.antMatchers("/v3/api-docs/**").permitAll() // 元数据 .antMatchers("/swagger-ui.html").permitAll(); // Swagger UI // Druid 监控 registry.antMatchers("/druid/**").anonymous(); // Spring Boot Actuator 的安全配置 registry.antMatchers("/actuator").anonymous() .antMatchers("/actuator/**").anonymous(); // RPC 服务的安全配置 registry.antMatchers(ApiConstants.PREFIX + "/**").permitAll(); } }; } } 其中 DemoServerApplication 的 Java 代码如下: package cn.iocoder.yudao.module.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 项目的启动类 * * @author 芋道源码 */ @SpringBootApplication public class DemoServerApplication { public static void main(String[] args) { SpringApplication.run(DemoServerApplication.class, args); } } ④ 打开 Maven 菜单,点击刷新按钮,让引入的 Maven 依赖生效。如下图所示:  ⑤ 在 `resources` 目录下,新建配置文件。如下图所示:  其中 `application.yml` 的配置如下: spring: main: allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Dubbo 或者 Feign 等会存在重复定义的服务 # 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 小时 --- #################### 接口文档配置 #################### springdoc: api-docs: enabled: true # 1. 是否开启 Swagger 接文档的元数据 path: /v3/api-docs swagger-ui: enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面 path: /swagger-ui.html knife4j: enable: true # 2.2 是否开启 Swagger 文档的 Knife4j UI 界面 setting: language: zh_cn # MyBatis Plus 的配置项 mybatis-plus: configuration: map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 global-config: db-config: # 重要说明:如果将配置放到 Nacos 时,请注意将 id-type 设置为对应 DB 的类型,否则会报错;详细见 https://gitee.com/zhijiantianya/yudao-cloud/issues/I5W2N0 讨论 id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库 # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解 logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) type-aliases-package: ${yudao.info.base-package}.dal.dataobject --- #################### RPC 远程调用相关配置 #################### dubbo: scan: base-packages: ${yudao.info.base-package}.api # 指定 Dubbo 服务实现类的扫描基准包 protocol: name: dubbo # 协议名称 port: -1 # 协议端口,-1 表示自增端口,从 20880 开始 registry: address: spring-cloud://localhost # 设置使用 Spring Cloud 注册中心 --- #################### MQ 消息队列相关配置 #################### --- #################### 定时任务相关配置 #################### xxl: job: executor: appname: ${spring.application.name} # 执行器 AppName logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN --- #################### 芋道相关配置 #################### yudao: info: version: 1.0.0 base-package: cn.iocoder.yudao.module.demo web: admin-ui: url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址 swagger: title: 管理后台 description: 提供管理员管理的所有功能 version: ${yudao.info.version} base-package: ${yudao.info.base-package} tenant: # 多租户相关配置项 enable: true debug: false * `yudao.info.version.base-package` 配置项:可以改成你的项目的基准包名。 其中 `application-local.yml` 的配置如下: --- #################### 数据库相关配置 #################### spring: # 数据源配置项 autoconfigure: exclude: - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 datasource: druid: # Druid 【监控】相关的全局配置 web-stat-filter: enabled: true stat-view-servlet: enabled: true allow: # 设置白名单,不填则允许所有访问 url-pattern: /druid/* login-username: # 控制台管理用户名和密码 login-password: filter: stat: enabled: true log-slow-sql: true # 慢 SQL 记录 slow-sql-millis: 100 merge-sql: true wall: config: multi-statement-allow: true dynamic: # 多数据源配置 druid: # Druid 【连接池】相关的全局配置 initial-size: 5 # 初始连接数 min-idle: 10 # 最小连接池数量 max-active: 20 # 最大连接池数量 max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 test-while-idle: true test-on-borrow: false test-on-return: false primary: master datasource: master: name: ruoyi-vue-pro url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 username: root password: 123456 # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W slave: # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 username: root password: 123456 # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 port: 6379 # 端口 database: 0 # 数据库索引 # password: 123456 # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### spring: cloud: stream: rocketmq: # RocketMQ Binder 配置项,对应 RocketMQBinderConfigurationProperties 类 binder: name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址 --- #################### 定时任务相关配置 #################### xxl: job: admin: addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址 --- #################### 服务保障相关配置 #################### # Lock4j 配置项 lock4j: acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 --- #################### 监控相关配置 #################### # Actuator 监控端点的配置项 management: endpoints: web: base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator exposure: include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 # Spring Boot Admin 配置项 spring: boot: admin: # Spring Boot Admin Client 客户端的相关配置 client: instance: service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] # 日志文件配置 logging: level: # 配置自己写的 MyBatis Mapper 打印日志 cn.iocoder.yudao.module.demo.dal.mysql: debug --- #################### 芋道相关配置 #################### # 芋道配置项,设置当前项目所有自定义的配置 yudao: env: # 多环境的配置项 tag: ${HOSTNAME} security: mock-enable: true xss: enable: false exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 access-log: # 访问日志的配置项 enable: false error-code: # 错误码相关配置项 enable: false demo: false # 关闭演示模式 * `logging.level.cn.iocoder.yudao.module.demo.dal.mysql` 配置项:可以改成你的项目的基准包名。 其中 `bootstrap.yml` 的配置如下: spring: application: name: demo-server profiles: active: local server: port: 48099 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件 logging: file: name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 * `spring.application.name` 配置项:可以改成你想要的服务名。 * `server.port` 配置项:可以改成你想要的端口号。 其中 `bootstrap-local.yml` 的配置如下: --- #################### 注册中心相关配置 #################### spring: cloud: nacos: server-addr: 127.0.0.1:8848 discovery: namespace: dev # 命名空间。这里使用 dev 开发环境 metadata: version: 1.0.0 # 服务实例的版本号,可用于灰度发布 --- #################### 配置中心相关配置 #################### spring: cloud: nacos: # Nacos Config 配置项,对应 NacosConfigProperties 配置属性类 config: server-addr: 127.0.0.1:8848 # Nacos 服务器地址 namespace: dev # 命名空间。这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP name: # 使用的 Nacos 配置集的 dataId,默认为 spring.application.name file-extension: yaml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties 其中 `logback-spring.xml` 的配置如下:
${PATTERN_DEFAULT}
${PATTERN_DEFAULT}
${LOG_FILE}
${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}
${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}
${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}
${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}
${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}
0
256
${PATTERN_DEFAULT}
[#](#_4-新建-restful-api-接口) 4. 新建 RESTful API 接口 ----------------------------------------------- ① 在 `controller.admin` 包,新建一个 DemoTestController 类,并新建一个 `/demo/test/get` 接口。代码如下: package cn.iocoder.yudao.module.demo.controller.admin; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - Test") @RestController @RequestMapping("/demo/test") @Validated public class DemoTestController { @GetMapping("/get") @Operation(summary = "获取 test 信息") public CommonResult
get() { return success("true"); } } **注意**,`/demo` 是该模块所有 RESTful API 的基础路径,`/test` 是 Test 功能的基础路径。 ① 在 `controller.app` 包,新建一个 AppDemoTestController 类,并新建一个 `/demo/test/get` 接口。代码如下: package cn.iocoder.yudao.module.demo.controller.app; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "用户 App - Test") @RestController @RequestMapping("/demo/test") @Validated public class AppDemoTestController { @GetMapping("/get") @Operation(summary = "获取 test 信息") public CommonResult
get() { return success("true"); } } 在 Controller 的命名上,额外增加 **App** 作为前缀,一方面区分是管理后台还是用户 App 的 Controller,另一方面避免 Spring Bean 的名字冲突。 可能你会奇怪,这里我们定义了两个 `/demo/test/get` 接口,会不会存在重复导致冲突呢?答案,当然是并不会。原因是: * `controller.admin` 包下的接口,默认会增加 `/admin-api`,即最终的访问地址是 `/admin-api/demo/test/get` * `controller.app` 包下的接口,默认会增加 `/app-api`,即最终的访问地址是 `/app-api/demo/test/get` [#](#_5-启动-demo-服务) 5. 启动 demo 服务 --------------------------------- ① 运行 SystemServerApplication 类,将 `system` 服务启动。运行 InfraServerApplication 类,将 `infra` 服务启动。 ② 运行 DemoServerApplication 类,将新建的 `demo` 服务进行启动。启动完成后,使用浏览器打开 [http://127.0.0.1:48099/doc.html (opens new window)](http://127.0.0.1:48099/doc.html) 地址,进入该服务的 Swagger 接口文档。 ③ 打开“管理后台 - Test”接口,进行 `/admin-api/demo/test/get` 接口的调试,如下图所示:  ④ 打开“用户 App - Test”接口,进行 `/app-api/demo/test/get` 接口的调试,如下图所示:  [#](#_6-网关配置) 6. 网关配置 --------------------- ① 打开 `yudao-gateway` 网关项目的 `application.yml` 配置文件,增加 `demo` 服务的路由配置。代码如下:  - id: demo-admin-api # 路由的编号 uri: grayLb://demo-server predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - Path=/admin-api/demo/** filters: - RewritePath=/admin-api/demo/v2/api-docs, /v2/api-docs # 配置,保证转发到 /v2/api-docs - id: demo-app-api # 路由的编号 uri: grayLb://demo-server predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - Path=/app-api/demo/** filters: - RewritePath=/app-api/demo/v2/api-docs, /v2/api-docs - name: demo-server service-name: demo-server url: /admin-api/demo/v3/api-docs ② 运行 GatewayServerApplication 类,将 `gateway` 网关服务启动。 ③ 使用浏览器打开 [http://127.0.0.1:48080/doc.html (opens new window)](http://127.0.0.1:48080/doc.html) 地址,进入网关的 Swagger 接口文档。然后,选择 `demo-server` 服务,即可进行 `/admin-api/demo/test/get` 和 `/app-api/demo/test/get` 接口的调试,如下图所示: 
点赞
热门评论
最新评论
匿名用户
+1
-1
·
回复TA
暂无热门评论
相关推荐
阅读更多资讯
热门评论 最新评论
暂无热门评论