文章目录

  • 前言
  • 一、创建一个springboot项目?
  • 二、使用步骤
    • 1.引入依赖
    • 2.要想用nacos配置,需要用bootstrap.yml
    • 3.错误汇总
  • 总结

前言

springboot项目注册到nacos`

nacos 是一个注册中心+配置中心,这也是他比consul 强大的原因,那么如何将一个springboot项目注册到noacs,然后成为它的一个子服务呢?


一、创建一个springboot项目?

二、使用步骤

1.引入依赖

build.gradle内容
代码如下(示例):

plugins {id 'java'id 'maven-publish'}repositories {mavenLocal()maven {url = uri('https://repo.spring.io/milestone')}maven {url = uri('https://repo.spring.io/snapshot')}maven {url = uri('https://repo.maven.apache.org/maven2/')}}dependencies {implementation 'org.springframework.boot:spring-boot-starter:2.6.3'implementation 'org.springframework.boot:spring-boot-starter-data-mongodb:2.6.3'implementation 'org.springframework.boot:spring-boot-starter-validation:2.6.3'implementation 'org.springframework.boot:spring-boot-starter-web:2.6.3'implementation 'org.projectlombok:lombok:1.18.22'implementation 'cn.hutool:hutool-all:5.5.4'implementation 'io.springfox:springfox-swagger2:2.7.0'implementation 'io.springfox:springfox-swagger-ui:2.7.0'implementation 'com.github.xiaoymin:knife4j-spring-boot-starter:2.0.3'implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0'implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2021.0.1.0'implementation 'com.hoteamsoft:loki-metadata:1.0.0-SNAPSHOT'implementation 'com.hoteamsoft:loki-service:1.0.0-SNAPSHOT'implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap:3.1.0'//implementation 'com.alibaba.boot:nacos-config-spring-boot-actuator:0.2.1'//implementation 'com.alibaba.nacos:nacos-client:1.2.1'implementation 'com.alibaba.cloud:spring-cloud-alibaba-dependencies:2021.0.1.0'compileOnly 'org.projectlombok:lombok:1.18.22'annotationProcessor 'org.projectlombok:lombok:1.18.22'testCompileOnly 'org.projectlombok:lombok:1.18.22'testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'testImplementation 'org.springframework.boot:spring-boot-starter-test:2.6.3'testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'}tasks.named('test') {useJUnitPlatform()}group = 'com.hoteam'version = '0.0.1-SNAPSHOT'description = 'service-custom'java.sourceCompatibility = JavaVersion.VERSION_1_8publishing {publications {maven(MavenPublication) {from(components.java)}}}test {enabled(false)}tasks.withType(JavaCompile) {options.encoding = 'UTF-8'options.compilerArgs << '-Xlint:none'options.compilerArgs << '-nowarn' // same as '-Xlint:none'// Turn them off manuallyoptions.compilerArgs << '-Xlint:-auxiliaryclass'options.compilerArgs << '-Xlint:-cast'options.compilerArgs << '-Xlint:-classfile'options.compilerArgs << '-Xlint:-deprecation'options.compilerArgs << '-Xlint:-dep-ann'options.compilerArgs << '-Xlint:-divzero'options.compilerArgs << '-Xlint:-empty'options.compilerArgs << '-Xlint:-fallthrough'options.compilerArgs << '-Xlint:-finally'options.compilerArgs << '-Xlint:-options'options.compilerArgs << '-Xlint:-overloads'options.compilerArgs << '-Xlint:-overrides'options.compilerArgs << '-Xlint:-path'options.compilerArgs << '-Xlint:-processing'options.compilerArgs << '-Xlint:-rawtypes'options.compilerArgs << '-Xlint:-serial'options.compilerArgs << '-Xlint:-static'options.compilerArgs << '-Xlint:-try'options.compilerArgs << '-Xlint:-unchecked'options.compilerArgs << '-Xlint:-varargs'}

2.要想用nacos配置,需要用bootstrap.yml

这是一个小坑,因为bootstrap.yml 的配置优先级高于 application.yml, 如果springboot项目中不改为 bootstrap.yml 的话,则启动加载的时候,某些配置会读取不到(当用nacos,作为配置中心获取配置的时候)
代码如下(示例):

server:port: 8888servlet:context-path: /customspring:data:mongodb:host: ipport: 27017database: test#username:#password:application:name: spring-custom# 页面配置mvc:path match:matching-strategy: ant_path_matchercloud:bootstrap:enabled: truenacos:discovery:server-addr: ip:28848username: nacospassword: nacosnamespace: nacos空间idconfig:server-addr: ip:28848username: nacospassword: nacosnamespace: nacos空间idfile-extension: yml

1 配置文件必须为bootstrap.yml或者 bootstrap.properties ,本文用的yml风格
2 nacos空间id出处

3 nacos配置简介
a: 我未配置分组 所以为默认分组 DEFAULT_GROUP
b: 由于我的项目名称为 spring-custom ,且 配置了 file-extension: yml 且我启动的时候,执行了dev,那么项目启动的时候寻找的配置文件id 为: spring-custom-dev.yml
c: 默认nacos 的端口为8848 ,这里自定义了

3.错误汇总

  • test 测试类中,如何指定启动环境
    在测试类上加上注解,方便快捷,但只能加在类上 @ActiveProfiles(“dev”)

  • 日志中寻找的配置文件,一直是.properties
    这就是上文说的配置优先级的问题,改为bootstrap.yml 就ok了
    SpringBoot默认支持properties和YAML两种格式的配置文件。
    bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
    application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
    bootstrap.yml 先于 application.yml 加载

  • 启动报错 nacos: 403 …
    缺少依赖 : implementation ‘com.alibaba.cloud:spring-cloud-alibaba-dependencies:2021.0.1.0’

  • 报错,大概内容为 各种配置找不到: 数据源链接等
    nacos上的配置文件名称 与 yml中的nacos 配置的寻找的 名称不对应,导致配置文件找不到
    最终dataid 的公式为 :${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

  • nacos启动报错,各种内部错误
    nacos与springboot版本不兼容 可参考
    本项目所用各个版本

implementation 'org.springframework.boot:spring-boot-starter:2.6.3'implementation 'org.springframework.boot:spring-boot-starter-validation:2.6.3'implementation 'org.springframework.boot:spring-boot-starter-web:2.6.3'implementation 'org.projectlombok:lombok:1.18.22'implementation 'cn.hutool:hutool-all:5.5.4'implementation 'io.springfox:springfox-swagger2:2.7.0'implementation 'io.springfox:springfox-swagger-ui:2.7.0'implementation 'com.github.xiaoymin:knife4j-spring-boot-starter:2.0.3'implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0'implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2021.0.1.0'implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap:3.1.0'implementation 'com.alibaba.cloud:spring-cloud-alibaba-dependencies:2021.0.1.0'

重点是:
spring-cloud-starter-alibaba-nacos-discovery
spring-cloud-starter-alibaba-nacos-config:2021.0.1.0
spring-boot-starter:2.6.3
spring-cloud-starter-bootstrap:3.1.0
spring-cloud-alibaba-dependencies:2021.0.1.0


总结

nacos 不仅是注册中心,还是一个配置中心,也就是项目中的配置都可以放到nacos中,然后启动的时候,先去nacos注册,再去nacos中找到自己的配置,再启动自己就ok了;
如果用consul 的话,一般使用阿波罗作为配置中心搭配使用;