SpringBoot+Nacos+OpenFeign环境搭建

本文详细介绍了如何在SpringBoot和SpringCloud环境下集成Nacos与OpenFeign。首先,提供了两种集成方式(boot方式和cloud方式)的依赖引入和配置步骤,强调了版本匹配的重要性。接着,展示了接口定义、测试以及解决Get请求带参数传递问题的方法。最后,提到了Nacos配置中心的使用和常见问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.boot方式nacos与openFeign集成

1.引入依赖

2.添加配置

3.测试接口调用

4.常见问题:

       1.版本依赖

       2.nacos客户端

2.cloud方式nacos与openFeign集成 

1.引入依赖

2.添加配置

3.接口定义

4.开启FeignClients客户端

5.远程接口测试

6.Nacos配置中心

3.常见问题

1.Get请求接口带参数无法传递


1.boot方式nacos与openFeign集成

1.引入依赖

        说明:参考下面依赖

<properties>        
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
        <spring-boot.version>2.3.6.RELEASE</spring-boot.version>
        <alibaba-fastjson.version>2.0.20</alibaba-fastjson.version>
</properties>

<dependencies>

        <!--  引入nacos配置中心依赖   -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>${com.alibaba.boot.version}</version>
        </dependency>

        <!--  引入注册中心依赖  -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-starter</artifactId>
            <version>${com.alibaba.boot.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.1.1</version>
        </dependency>

</dependencies>

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${alibaba-fastjson.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.添加配置

        

原文参考:SpringCloud-Alibaba-Nacos配置项详解_nacos配置文件详解_JavaMN的博客-CSDN博客

3.测试接口调用

4.常见问题:

       1.版本依赖

        版本如果不匹配也是会出现一些乱七八糟的问题,参照我上面的版本来问题就可以正常使用

       2.nacos客户端

说明:java.lang.NoClassDefFoundError: com/alibaba/nacos/client/utils/StringUtils

出现这个异常时候请把下面这个依赖加进去,这里需要注意版本,否则会有连接不上的情况

 <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.1.4</version>
 </dependency>

参考: springboot+openFeign+nacos开发实战_openfeign整合nacos_wh柒八九的博客-CSDN博客

2.cloud方式nacos与openFeign集成 

1.引入依赖

重要的事情说三遍。。。。

版本信息非常重要,一定要对应上!!!

版本信息非常重要,一定要对应上!!!

版本信息非常重要,一定要对应上!!!

<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>

<dependencyManagement>
		<dependencies>
			<!-- SpringCloud 微服务 -->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Hoxton.SR3</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>com.alibaba.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>${spring-cloud-alibaba.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>

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

		</dependencies>
	</dependencyManagement>

    <dependencies>
        <!-- https://segmentfault.com/q/1010000021044375?bd_source_light=4746641 -->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
			<exclusions>
				<exclusion>
					<artifactId>jackson-dataformat-xml</artifactId>
					<groupId>com.fasterxml.jackson.dataformat</groupId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>
    </dependencies>

2.添加配置

使用cloud方式需要换成bootstrap文件,我选择bootstrap.yaml

server:
  port: 9427
nacos:
  server-addr: 127.0.0.1:8848
  #local环境
  namespace: 4e335d42-4caa-49b0-b209-0363e1a2071c
  config-group: ocpx
  # 服务只能同组调用 https://developer.aliyun.com/ask/317473
  discovery-group: delivery

spring:
  application:
    name: delivery-ocpx
  profiles:
    active: ${BOOT_ENV}

  cloud:
    nacos:
      discovery:
        server-addr: ${nacos.server-addr}
        namespace: ${nacos.namespace}
        group: ${nacos.discovery-group}
        service:  ${spring.application.name}
      config:
        server-addr: ${nacos.server-addr}
        namespace: ${nacos.namespace}
        group: ${nacos.config-group}
        file-extension: yml
        extension-configs:
          - data-id: ocpx-config.yml
            group: ${nacos.config-group}
            refresh: true

3.接口定义

请保持和目标服务的请求接口一致

package com.hhmt.delivery.chain.service;

import com.hhmt.delivery.continer.ServiceMode;
import com.hhmt.delivery.core.domain.ResultVo;
import com.hhmt.delivery.core.page.TableDataInfo;
import com.hhmt.delivery.pojo.model.query.HhChainApiInfoQuery;
import com.hhmt.delivery.pojo.model.vo.HhChainApiInfoVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 链路api信息Service接口
 *
 * @author hauchun
 * @date 2023-02-09
 */
@FeignClient(name = ServiceMode.CHAIN_SERVICE_NAME, path = "/chain/HhChainApiInfo")
public interface IHhChainApiInfoService {
    /**
     * 查询链路api信息
     *
     * @param id 链路api信息主键
     * @return 链路api信息
     */
    @GetMapping(value = "/{id}")
    public ResultVo<HhChainApiInfoVo> selectHhChainApiInfoById(@PathVariable("id") Long id);

    /**
     * 查询链路api信息列表
     *
     * @param hhChainApiInfo 链路api信息
     * @return 链路api信息集合
     */
    @GetMapping("/list")
    public TableDataInfo<HhChainApiInfoVo> selectHhChainApiInfoList(@RequestParam("hhChainApiInfo") HhChainApiInfoQuery hhChainApiInfo);

}

需要注意的是这里的接口入参,虽然在目标服务中可以不使用@RequestParam去定义,但是在这里是需要带上的,否则参数绑定不上

4.开启FeignClients客户端

package com.hhmt.delivery;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class DeliveryOcpxApplication {

    public static void main(String[] args) {
        SpringApplication.run(DeliveryOcpxApplication.class, args);
    }

}

注意需要添加的注解:

在启动类添加这两个注解:
1.@EnableFeignClients 启用Feign客户端
2.@EnableDiscoveryClient 开启注册功能,可以将当前服务注册进注册中心

5.远程接口测试

在当前服务定义两个接口,通过调用feign定义接口,测试目标服务列表和详情接口是否可以正常调用

1.编写控制器

package com.hhmt.delivery.chain.controller;

import com.hhmt.delivery.chain.service.IHhChainApiInfoService;
import com.hhmt.delivery.core.domain.ResultVo;
import com.hhmt.delivery.core.page.TableDataInfo;
import com.hhmt.delivery.pojo.model.query.HhChainApiInfoQuery;
import com.hhmt.delivery.pojo.model.vo.HhChainApiInfoVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author huachun
 * @version 1.0
 * @description: TODO
 * @email huachun_w@163.com
 * @date 2023-03-01 11:40
 */
@RestController
@RequestMapping("/chain/HhChainApiInfo")
public class HhChainApiInfoController {

    @Autowired
    private IHhChainApiInfoService hhChainApiInfoService;

    @GetMapping("/list")
    public TableDataInfo<HhChainApiInfoVo> chainApiList() {
        TableDataInfo<HhChainApiInfoVo> chainApiInfoVoTableDataInfo = hhChainApiInfoService.selectHhChainApiInfoList(new HhChainApiInfoQuery());
        return chainApiInfoVoTableDataInfo;
    }

    @GetMapping("/{id}")
    public ResultVo<HhChainApiInfoVo> byId(@PathVariable("id") Long id) {
        ResultVo<HhChainApiInfoVo> chainApiInfoVoResultVo = hhChainApiInfoService.selectHhChainApiInfoById(id);
        return chainApiInfoVoResultVo;
    }

}

2.接口调用测试

列表接口测试

 详情接口测试

至此,openFeign远程调用功能已经完成

6.Nacos配置中心

1.需要指定当前类使用的是哪个配置(如果配置文件与规则不相匹配)

@NacosConfigurationProperties(dataId = "delivery-ocpx.yml", groupId = "ocpx")
2.使用value注解替换NacosValue注解
@Value

示例如下图所示:

3.常见问题

1.Get请求接口带参数无法传递

我在客户端定义了feign接口,想要调用服务端接口

这是客户端feign接口,此时和服务端接口保持了一致

服务端接口 

 此时虽然接口可以正常调用,但是用来过滤的条件参数却无法传递

此时调用客户端接口测试

服务端此时接受不到参数

解决办法:在客户端使用 @SpringQueryMap注解

更换注解后问题完美解决

参考原文:Spring Cloud使用OpenFeign调用接口各种问题 - 简书

<think>好的,我现在需要向用户介绍Spring BootNacos的服务注册与发现机制。首先,我得确保自己正确理解了这两个组件的核心概念以及它们是如何协同工作的。 首先,Spring Boot是一个用于简化Spring应用初始搭建和开发的框架,它提供了自动配置和快速启动的能力。而Nacos是阿里巴巴开源的动态服务发现、配置管理和服务管理平台,支持服务注册与发现、配置管理等功能。结合使用时,Nacos可以作为服务注册中心,帮助Spring Boot应用实现服务的自动注册与发现。 接下来,我需要明确服务注册与发现的基本流程。当服务提供者启动时,会将自己的信息(如IP地址、端口、服务名等)注册到Nacos Server。服务消费者则通过查询Nacos Server来获取可用服务实例的列表,并通过负载均衡策略选择其中一个实例进行调用。这个过程需要确保各个步骤的准确性和可行性。 然后,我需要考虑如何具体在Spring Boot项目中集成Nacos。用户可能需要知道必要的依赖配置,比如在pom.xml中添加Spring Cloud Alibaba的相关依赖,特别是spring-cloud-starter-alibaba-nacos-discovery。同时,配置文件中需要设置Nacos Server的地址、应用名称、端口等信息。这部分内容需要详细说明,避免用户配置错误。 另外,服务注册与发现的实现细节也很重要。例如,@EnableDiscoveryClient注解的作用是启用服务发现客户端,使得应用能够与Nacos Server交互。服务消费者可能需要使用RestTemplate或OpenFeign来进行服务调用,这里需要解释如何结合Ribbon实现负载均衡。 我还需要考虑用户可能遇到的常见问题,例如Nacos Server未启动导致的连接失败,或者服务名称配置不正确导致无法发现服务。提供一些排查建议会增强回答的实用性,比如检查Nacos Server的运行状态、网络连通性、日志信息等。 此外,可能需要比较Nacos与其他服务注册中心(如Eureka、Consul)的优缺点,帮助用户理解选择Nacos的理由。Nacos的优势包括支持动态配置管理、更灵活的健康检查机制,以及更好的中文文档支持,这对于国内开发者来说可能更为友好。 最后,需要总结整个流程,确保用户能够清晰地理解从服务注册到发现的每个步骤,并能够按照指导进行操作。如果有必要,可以提供一个简单的示例项目结构,说明各个配置文件的位置和关键代码片段,帮助用户更直观地理解实现方式。 在整理这些内容时,要确保语言简洁明了,逻辑清晰,避免使用过于专业的术语,或者在必要时进行解释。同时,按照用户的要求,正确使用Markdown格式中的数学表达式规范,不过在这个主题中可能涉及较少,但需注意代码块和配置项的正确排版。总之,目标是让用户能够通过我的介绍,顺利地在Spring Boot项目中集成Nacos,实现服务注册与发现功能。</think>以下是Spring Boot集成Nacos实现服务注册与发现的详细说明: ### 一、基本架构 ``` [服务提供者] --> 注册 --> [Nacos Server] [服务消费者] --> 拉取列表 --> [Nacos Server] ``` ### 二、环境准备 1. 安装Nacos Server(建议1.4.x+版本) ```bash # 下载地址 https://github.com/alibaba/nacos/releases ``` ### 三、Spring Boot集成步骤 #### 1. 添加依赖(pom.xml) ```xml <!-- Spring Cloud Alibaba 依赖管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2022.0.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- Nacos服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` #### 2. 配置参数(application.yml) ```yaml spring: application: name: user-service # 服务名称 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # Nacos服务地址 namespace: public # 命名空间(默认public) group: DEFAULT_GROUP # 分组(默认DEFAULT_GROUP) ``` #### 3. 启动类配置 ```java @SpringBootApplication @EnableDiscoveryClient // 开启服务发现 public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } } ``` ### 四、服务调用示例 #### 方式1:使用RestTemplate ```java @Bean @LoadBalanced // 开启负载均衡 public RestTemplate restTemplate() { return new RestTemplate(); } // 调用示例 String url = "http://order-service/api/orders"; String result = restTemplate.getForObject(url, String.class); ``` #### 方式2:使用OpenFeign 1. 添加依赖 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 声明接口 ```java @FeignClient(name = "order-service") public interface OrderClient { @GetMapping("/api/orders") String getOrders(); } ``` 3. 启用Feign ```java @EnableFeignClients public class Application { ... } ``` ### 五、Nacos控制台验证 访问 http://localhost:8848/nacos 可以看到: - 服务列表显示注册的服务实例 - 健康检查状态(默认心跳检测) ### 六、核心原理 1. **服务注册**:应用启动时通过心跳机制(默认5秒)向Nacos Server注册实例信息 2. **服务发现**:消费者定时(默认10秒)从Nacos Server拉取服务实例列表 3. **健康检查**:Nacos通过客户端主动上报心跳(默认15秒超时)判断服务健康状态 ### 七、常见问题排查 1. **服务无法注册** - 检查Nacos Server是否正常启动 - 确认网络连通性(telnet 8848) - 查看应用日志是否有注册错误 2. **服务发现失败** - 确认服务名称是否一致 - 检查消费者和服务提供者的namespace/group配置 - 查看Nacos控制台是否存在对应服务 ### 八、高级特性 1. **权重配置**:通过控制台调整实例流量权重 2. **元数据管理**:为实例添加自定义metadata 3. **临时/持久化实例**:ephemeral参数控制(默认临时实例) > 建议开发环境使用Nacos的`standalone`模式,生产环境建议使用集群部署(至少3节点)保证高可用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值