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

本文档详细介绍了基于Spring Cloud Nacos搭建配置中心和微服务的步骤,包括项目模块结构、依赖管理、配置文件设置、Nacos配置中心的使用,以及可能遇到的问题和解决策略,如配置文件格式、Feign客户端配置、服务注册与发现等。
摘要由CSDN通过智能技术生成

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
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值