搭建spring-cloud项目并使用nacos作为注册中心

0.github地址

raven-springcloud-nacos

1.项目目录结构

  • 各模块基本结构
|--spring-cloud-nacos目录结构
|  |--raven-common
|  |  |--utils
|  |  |--constant
|  |--raven-nacos
|  |--raven-service
|  |  |--raven-driver-service
|  |  |--raven-order-service
|  |--raven-service-api
|  |  |--raven-driver-service-api
|  |  |--raven-order-service-api

2.各模块责任及maven依赖、yml、重要注解

2.0.spring-cloud-nacos

2.0.1.pom.xml

<!--继承spring-boot-starter-parent,确定springboot版本号-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>

<!--项目描述信息-->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.raven</groupId>
    <artifactId>spring-cloud-nacos</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version
    <modules>
        <module>raven-common</module>
        <module>raven-nacos</module>
        <module>raven-service</module>
        <module>raven-service-api</module>
    </modules>
    
     <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!--打包的时候跳过测试-->
        <skipTests>true</skipTests>
    </properties>

<!--声明项目springcloud依赖版本信息-->
    <dependencyManagement>
        <dependencies>
            <!-- 声明依赖 springCloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 声明依赖 springCloudAlibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


2.1.raven-common

2.1.1.存放整个项目公共文件,如utils工具类、contant常量等等

2.1.2.管理整个项目公共依赖,如mysql数据库、redis、mq等等

2.1.3.pom.xml

<dependencies>
<!--数据库相关依赖 start  -->
        <!--通用mapper起步依赖-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.4</version>
        </dependency>
        <!--mybatis分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- z-orm -->
        <dependency>
            <groupId>com.zhouyutong</groupId>
            <artifactId>z-orm-jdbc</artifactId>
            <version>4.1-SNAPSHOT</version>
        </dependency>
        <!-- alibaba druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <!--数据库相关依赖 end  -->
          <!-- Spring Boot Starts -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

2.2.raven-nacos

2.2.1.nacos的配置中心服务,可以用来获取在nacos中的配置信息

2.2.2.pom.xml

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--nacos配置中心依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>0.2.1.RELEASE</version>
        </dependency>
    </dependencies>

2.2.3.bootstrap.properties

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 控制台添加配置:
# Data ID:example.properties
# Group:DEFAULT_GROUP
# 配置内容:useLocalCache=true
spring.application.name=config-server
# 指定配置的后缀,支持 properties、yaml、yml,默认为 properties
spring.cloud.nacos.config.file-extension=properties
#spring.cloud.nacos.config.file-extension=yaml

2.2.4.ConfigController

@RestController
@RequestMapping("/config")
// 动态的刷新config数据
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    /**
     * http://localhost:8080/config/get
     */
    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}

2.3.raven-service

2.3.1.管理整个项目业务相关微服务服务文件,如order服务,driver服务

2.3.2.各业务服务可以基于nacos进行注册发现,通过feign远程调用

2.3.3.各业务服务pom.xml

    <dependencies>
    <!--注册发现到nacos的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    <!--driver微服务远程调用接口、实体类-->
        <dependency>
            <groupId>com.raven</groupId>
            <artifactId>raven-driver-service-api</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

2.3.4.各业务服务application.yml

server:
  port: 38943
spring:
  application:
    name: consumer
  profiles:
    active: dev
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/nacos?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false
    username: dipao
    password: dipao123
    # nacos注册中心地址信息
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
feign:
  hystrix:
    enabled: true

mybatis:
  configuration:
    map-underscore-to-camel-case: true
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.edaijia.edipao.driver.entity

2.3.4.各业务服务启动类Application

@SpringBootApplication
//扫描Mapper
@MapperScan("com.raven.consumer.mapper")
/**
 * 项目是多模块,包名不同,所以扫描不到 需要加basePackages
 */
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.raven.driver.feign"})
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

2.3.5.各业务服务feign远程注入

@RestController()
@RequestMapping("/consumer")
public class ConsumerController 
    @Autowired
    private DriverFeign driverFeign;
}

2.4.raven-service-api

2.4.1.管理整个项目业务相关各微服务远程调用接口、实体类,如orderFeign、orderEntity、orderAddReq等等

2.4.2.各远程调用接口、实体类微服务pom.xml

    <!--通用的common-->
    <dependencies>
        <dependency>
            <groupId>com.raven</groupId>
            <artifactId>raven-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--远程服务调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

2.4.3.各远程调用接口feign

/**
 * @PackageName: com.raven.driver.feign
 * @ClassName: DriverFeign
 * @Blame: raven
 * @Date: 2021-07-07 17:19
 * @Description:
 * FeignClient注解: 该接口对外提供远程调用,远程调用服务名称为driver
 * 调用地址为类上的RequestMapping + 方法上的GetMapping
 */
@FeignClient("driver")
@RequestMapping("/driver")
public interface DriverFeign {
    @GetMapping("/get/{id}")
    public DriverEntity getOne(@PathVariable(value = "id") int id);
}

3.需要注意可能会踩坑的地方:

3.1.nacos config配置文件bootstrap.properties

指定配置的后缀,支持 properties、yaml、yml,默认为 properties

spring.cloud.nacos.config.file-extension=properties
  • 配置中心存储配置的格式必须和bootstrap.properties 中配置的一致,否则会出现配置中心更新数据成功,但是远程接口调用配置,数据并没有动态更新

3.2.@EnableFeignClients注解 basePackages

  • EnableFeignClients注解: 允许服务远程调用其他服务(开启服务远程调用功能)
    项目是多模块时,包名不同,所以扫描不到,需要在注解中指定 basePackages
    ---------------------------------------------- 2021-07-15更新----------------------------------------------
    @EnableFeignClients(basePackages = {“com.raven.driver.feign”})
    必须指定其他服务名称,否则引入自己服务feign会报错
错误如下:
IllegalStateException: Ambiguous mapping. Cannot map 'xxx.XxxClient' method

Spring Feign 注入失败问题排查思路

3.3.spring-cloud-starter-alibaba-nacos-config 依赖 版本

  • 根据官网文档配置相应的nacos-config版本依赖
    spring-cloud版本说明,一直无法成功引入,最后发现上述文档仅仅只是springcloud-springboot-springCloudAlibaba的版本指引,并非nacos-config,下面是nacos-config的版本依赖。
<!--版本号只有0.2.X-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>0.2.1.RELEASE</version>
    </dependency>

------------------------------------2021-07-12更新-----------------------------
也可使用com.alibaba.cloud下的nacos config 依赖

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
   <version>2.2.1.RELEASE</version>
</dependency>

3.4.springcloud maven依赖无法导入

项目中使用springcloud maven依赖无法导入

3.5.springcloud 项目启动后,无法找到其他XXX服务

排查后发现,服务提供方和服务消费方采用了不同的分组配置,导致服务注册成功,但找不到

# 消费者
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 08c3e74b-5b7c-4924-a593-e4cf2712317f # 使用的 Nacos 的命名空间,默认为 null
        group: raven-consumer-service

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 08c3e74b-5b7c-4924-a593-e4cf2712317f # 使用的 Nacos 的命名空间,默认为 null
        group: raven-producer-service

3.6 Method has too many Body parameters的处理办法
feign书写时不通过@PathVariable拼接参数时,需要通过@RequestParam + @RequestBody拼接参数,RequestBody有且只能有一个 (可以省略不写)

// 正确书写方式如下:
// 1.
    @ApiOperation(value = "根据条件构造器修改司机信息")
    @RequestMapping(path = "/updateByCriteria")
    public void updateByCriteria(BaseCriteriaDTO criteriaDTO);
// 2.
    @ApiOperation(value = "根据司机手机号获取司机信息(指定查询字段)")
    @RequestMapping(path = "/getByPhone/includeFields")
    public DriverInfoEntity getByPhone(@RequestParam(value = "phone") String phone, List<String> includeFields);	

// 错误书写方式1:
    @ApiOperation(value = "根据条件构造器修改司机信息")
    @RequestMapping(path = "/updateByCriteria")
    public void updateByCriteria(Criteria criteria, Update update);

3.6 spring cloud 多次启动报错,找不到指定配置?

nacos会根据 namespace->group->dataId 找到唯一的配置文件,并进行加载。

当没有配置spring-cloud–nacos-config-name时,dataId = spring.application.name + file-extension(默认为properties)

当配置name后 dataId = name + file-extension = nacosConfig.yaml

如果在指定的namespace - group - dataId 中没有找到对应的配置 springboot就会报错

3.7Nacos配置中心,项目拉取配置报错

错误信息:
NACOS SocketTimeoutException httpGet] currentServerAddr:http://localhost:8848, err : connect timed out

原因:
bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等;
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

bootstrap.yml 先于 application.yml 加载

处理方案:
application.yml 更改为bootstrap.yml即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用Spring Cloud搭建Nacos的简要步骤: 1. 在`pom.xml`文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` 2. 在`application.yml`文件中添加以下配置: ``` spring: application: name: YOUR_APPLICATION_NAME cloud: nacos: config: server-addr: YOUR_NACOS_SERVER_ADDRESS discovery: server-addr: YOUR_NACOS_SERVER_ADDRESS ``` 其中,`YOUR_APPLICATION_NAME`为你的应用程序名称,`YOUR_NACOS_SERVER_ADDRESS`为你的Nacos服务器地址。 3. 在启动类中添加`@EnableDiscoveryClient`注解,启用服务注册与发现功能。 4. 在需要动态配置的类中使用`@Value`注解注入Nacos配置中心中的值,例如: ``` @Value("${your-config-key}") private String yourConfigValue; ``` 其中,`your-config-key`为Nacos配置中心中的配置项名称。 以上就是使用Spring Cloud搭建Nacos的基本步骤,具体操作细节可以参考官方文档或者相关教程。好的,我来回答关于Spring Cloud项目集成Nacos的问题。 Nacos是一个用于动态服务发现、配置管理和服务管理的平台,它可以提供服务注册与发现、动态配置管理、流量管理等一系列功能。在Spring Cloud项目中,Nacos可以作为注册中心和配置中心来使用,可以实现服务的注册、发现和配置的动态管理。 以下是集成Nacos的步骤: 1.添加依赖 在项目中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.3.RELEASE</version> </dependency> ``` 2.配置Nacos地址 在Spring Cloud项目中,需要配置Nacos的地址,可以在`application.properties`文件中添加以下配置: ```properties # Nacos配置中心地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 ``` 3.开启服务注册和发现 在Spring Cloud项目中,需要使用`@EnableDiscoveryClient`注解开启服务注册和发现功能,例如: ```java @SpringBootApplication @EnableDiscoveryClient public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 4.配置动态配置管理 可以使用`@NacosValue`注解实现动态配置管理,例如: ```java @RestController public class DemoController { @NacosValue(value = "${config.key:default_value}", autoRefreshed = true) private String configValue; @GetMapping("/config") public String getConfig() { return configValue; } } ``` 上述代码中,`${config.key:default_value}`表示从Nacos中获取`config.key`配置项的值,如果获取不到,则返回默认值`default_value`。 至此,你已经了解了Spring Cloud项目集成Nacos的基本步骤。希望这些信息对你有所帮助。如果你有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值