nacos:从安装部署到生产实现(基于SpringCloud)
文章目录
前言:为什么要学nacos
一句话概括:因为好用,因为旧的(Eureka+Config)将来可能没得用。
众所周知,由于网飞的奇妙自信,Eureka闭源、Hystrix等一系列工具停更,使得入手nacos、sentinel等更新更强大的工具有了更充分的理由。
nacos(Naming and Configuration Service)的功能相当丰富,分:服务发现和服务健康监测、动态配置服务、动态DNS服务、服务及其元数据管理四部分,这里我们先从前两(三)个功能开始。
nacos和Eureka不同,配置一开始就很少侵入性,注册中心是直接独立出来的——从开发阶段独立调试到后期独立部署,这一点对Eureka重度使用者可能是全新的体验。也因为这个原因,nacos需要独立下载而不是单纯引入依赖,独立下载的nacos也提供了一套网页GUI供使用。
一句话概括就是,突然舒适到不太适应。
与其说是从0开始,不如说是技术栈从网飞向阿里的迁移,从这边的0.1向那边的0迁移。
本文标题其实改了好多次,一直找不到恰当的概括,按照学术论文的命名方案又显得雷声大雨点小,想了想还是以半教程半学习笔记的方式贴出罢。项目源码托管在gitee,地址见文末。
常用本地dashboard地址:
nacos:http://169.254.67.104:8848/nacos/index.html
(端口可自定义,需要注意的是nacos的服务地址在127.0.0.1,而dashboard并不在localhost。用户名密码默认都是nacos)
swagger:http://localhost:{服务端口}/swagger-ui/index.html
Druid:http://localhost:{服务端口}/{项目名}/druid/login.html
0.环境搭建
如上文所说,nacos本身也是一个springcloud项目,想要使用是需要直接下载的。下面提供两种下载途径
-
nacos官方GitHub页面:https://github.com/alibaba/nacos
-
大陆分流:
SSH:git@gitee.com:mirrors/Nacos.git
http:https://gitee.com/mirrors/Nacos.git
关于springboot、springcloud、springcloud alibaba三者版本对应关系,可参照下文,或查阅官方文档:
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
0.1Spring Cloud Alibaba组件版本对应关系
Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Dubbo Version | Seata Version |
---|---|---|---|---|---|
2.2.7.RELEASE* | 1.8.1 | 2.0.3 | 4.6.1 | 2.7.13 | 1.3.0 |
2.2.6.RELEASE | 1.8.1 | 1.4.2 | 4.4.0 | 2.7.8 | 1.3.0 |
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE | 1.8.0 | 1.4.1 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE | 1.8.0 | 1.3.3 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE | 1.7.1 | 1.2.1 | 4.4.0 | 2.7.6 | 1.2.0 |
2.2.0.RELEASE | 1.7.1 | 1.1.4 | 4.4.0 | 2.7.4.1 | 1.0.0 |
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE | 1.7.0 | 1.1.4 | 4.4.0 | 2.7.3 | 0.9.0 |
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE | 1.6.3 | 1.1.1 | 4.4.0 | 2.7.3 | 0.7.1 |
0.2毕业版本依赖关系(推荐使用)
下表为按时间顺序发布的 Spring Cloud Alibaba 以及对应的适配 Spring Cloud 和 Spring Boot 版本关系(由于 Spring Cloud 版本命名有调整,所以对应的 Spring Cloud Alibaba 版本号也做了对应变化)
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2.2.7.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2021.1 (项目源码fhadmin.cn) | Spring Cloud 2020.0.1 | 2.4.2 |
2.2.6.RELEASE | Spring Cloud Hoxton.SR9 | 2.3.2.RELEASE |
2.1.4.RELEASE | Spring Cloud Greenwich.SR6 | 2.1.13.RELEASE |
2.2.1.RELEASE | Spring Cloud Hoxton.SR3 | 2.2.5.RELEASE |
2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE | 2.2.X.RELEASE |
2.1.2.RELEASE | Spring Cloud Greenwich | 2.1.X.RELEASE |
2.0.4.RELEASE(停止维护,建议升级) | Spring Cloud Finchley | 2.0.X.RELEASE |
1.5.1.RELEASE(停止维护,建议升级) | Spring Cloud Edgware | 1.5.X.RELEASE |
依赖管理
Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本。
RELEASE 版本
Spring Cloud 2020
如果需要使用 Spring Cloud 2020 版本,请在 dependencyManagement 中添加如下内容
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Spring Cloud Hoxton
如果需要使用 Spring Cloud Hoxton 版本,请在 dependencyManagement 中添加如下内容
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Spring Cloud Greenwich
如果需要使用 Spring Cloud Greenwich 版本,请在 dependencyManagement 中添加如下内容
<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>
Spring Cloud Finchley
如果需要使用 Spring Cloud Finchley 版本,请在 dependencyManagement 中添加如下内容
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.0.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
孵化器版本依赖关系(不推荐使用)
Spring Cloud Version | Spring Cloud Alibaba Version | Spring Boot Version |
---|---|---|
Spring Cloud Greenwich | 0.9.0.RELEASE | 2.1.X.RELEASE |
Spring Cloud Finchley | 0.2.X.RELEASE | 2.0.X.RELEASE |
Spring Cloud Edgware | 0.1.X.RELEASE | 1.5.X.RELEASE |
1.nacos初步配置
下载上方提供的源码(个人推荐GitHub版,更新更及时),解压后丢到环境目录,启动前注意配置好java路径变量。
nacos本地默认访问路径:http://127.0.0.1:8848/nacos
用户名:nacos
密码:nacos
在bin目录下启动,命令为:
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
登入,验证部署成功。后面也可以修改startup.cmd,把"cluster"改成"standalone",即可满足不带参直接单机模式启动。
2.动态配置(Nacos Config)
2.0项目建立
父项目依赖如下
(加入了lombok、dev-tools、springdoc等辅助开发)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zjy</groupId>
<artifactId>sys</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>sys</name>
<url>http://maven.apache.org</url>
<modules>
<module>DataProvider8000</module>
</modules>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
<mybatis.version>2.1.4</mybatis.version>
<springdoc.version>1.6.11</springdoc.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId>
</dependency>
<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>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-ui -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>${springdoc.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.zjy.dataprovider8000.DataProvider8000Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.1依赖导入
由于spring-cloud-alibaba-dependencies内置的nacos最高只支持到0.8.0,实际建议自己导入官网推荐的版本,这里笔者实际选用了2.0.3.RELEASE。
<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>
2.2环境测试
那么,先写一个helloworld好了:
package com.zjy.dataprovider8000.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "测试用例")
@RestController
@RefreshScope
public class TestController {
@Value(value="${my.name:goodBye}")
private String value;
@Operation(summary = "测试配置读取")
@GetMapping("/test")
public String test(){
return value;
}
}
bootstrap.yaml(这里要注意的是,必须引入SpringCloud的bootstrap依赖,否则不会识别)
spring:
application:
name: dataProvider8000
#名字很重要,nacos要根据名字来找到对应的配置文件
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: properties
#从源代码可以看到,这一项默认就是properties,现版本仅支持properties和yaml
group: DEFAULT_GROUP
#默认分组就是DEFAULT_GROUP
username: nacos
password: nacos
server:
port: 8000
在nacos的dashboard添加如下配置,注意:Data ID需要带应用名后缀!
Data ID:
dataProvider8000.properties
Group:
DEFAULT_GROUP
配置内容:
my.name=helloworld
运行项目,直接访问或通过swagger后台测试,得到输出
helloworld
如果刻意将配置的key修改成my.name1,则访问时输出:
goodBye
此时未取到值,上面设置的缺省值发挥了作用
如果将配置的value修改成seeYou,无需重启项目,直接访问,得到输出:
seeYou
说明@RefreshScope的即时刷新功能发挥了作用
附:Data ID命名规范
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
2.3生产环境测试
这一点官方文档好像并没有提及,实际上在bootstrap.yaml里面可以用${}表达式直接拉取到nacos端的配置(类加载在nacos登录之前完成的不能拉取,如mybatis.mapper-locations,否则报错)。
搭建一个较真实的服务提供者
DATAPROVIDER8000
├─.mvn
│ └─wrapper
└─src
└─main
├─java
│ └─com
│ └─zjy
│ └─dataprovider8000
│ ├─config
│ ├─controller
│ ├─mapper
│ └─service
└─resources
├─mybatis
│ └─mapper
├─static
└─templates
其中三层架构:
Mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zjy.dataprovider8000.mapper.DepartmentMapper">
<select id="getDepartmentList" resultType="com.zjy.pojo.Department" useCache="true">
select * from `myemployees`.`departments`;
</select>
<select id="getDepartmentById" resultType="com.zjy.pojo.Department" >
select * from myemployees.departments where `department_id`=#{departmentId};
</select>
<select id="getDepartmentByName" resultType="com.zjy.pojo.Department" >
select * from myemployees.departments where `department_name`=#{departmentName};
</select>
<insert id="insert">
insert into myemployees.departments
values (#{departmentId},#{departmentName},#{managerId},#{locationId});
</insert>
<delete id="deleteDepartmentById">
delete *from myemployees.departments where `department_id`=#{departmentId};
</delete>
<update id="update">
update `departments`
set `department_name`=#{departmentName},`manager_id`=#{managerId},`location_id`=#{locationId})
WHERE `department_id`=#{departmentId};
</update>
</mapper>
package com.zjy.dataprovider8000.mapper;
import com.zjy.pojo.Department;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface DepartmentMapper {
List<Department> getDepartmentList();
Department getDepartmentById(Integer departmentId);
List<Department> getDepartmentByName(String departmentName);
void insert(Department department);
void deleteDepartmentById(Integer departmentId);
void update(Department department);
}
Service
package com.zjy.dataprovider8000.service;
import com.zjy.dataprovider8000.mapper.DepartmentMapper;
import com.zjy.pojo.Department;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class DepartmentService {
@Resource
private DepartmentMapper departmentMapper;
public List<Department> getDepartmentList(){
System.err.println("Service:getDepartmentList...");
return departmentMapper.getDepartmentList();
}
public Department getDepartmentById(Integer departmentId){
return departmentMapper.getDepartmentById(departmentId);
}
public List<Department> getDepartmentByName(String departmentName){
return departmentMapper.getDepartmentByName(departmentName);
}
public void insert(Department department){
departmentMapper.insert(department);
}
public void deleteDepartmentById(Integer departmentId){
departmentMapper.deleteDepartmentById(departmentId);
}
public void update(Department department){
departmentMapper.update(department);
}
}
Controller
package com.zjy.dataprovider8000.controller;
import com.zjy.dataprovider8000.service.DepartmentService;
import com.zjy.pojo.Department;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@Tag(name="部门")
@RequestMapping("/dept")
public class DepartmentController {
@Resource
DepartmentService departmentService;
@Operation(summary = "获取部门列表")
@GetMapping("/list")
public List<Department> getAll(){
return departmentService.getDepartmentList();
}
@Operation(summary = "通过id查找部门")
@GetMapping("/query/id/{departmentId}")
public Department queryById(@PathVariable Integer departmentId){
return departmentService.getDepartmentById(departmentId);
}
@Operation(summary = "通过名称查找部门")
@GetMapping("/query/name/{departmentName}")
public List<Department> queryByName(@PathVariable String departmentName){
return departmentService.getDepartmentByName(departmentName);
}
}
数据库结构
myemployees
.departments
Field Type Null Key Default Extra
department_id int NO PRI (NULL) auto_increment
department_name varchar(3) YES (NULL)
manager_id int YES (NULL)
location_id int YES MUL (NULL)
nacos端配置文件
mybatis:
type-aliases-package: com.zjy.pojo
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath:mappers/*.xml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306?useUnicode=true&chractorEncoding=utf-8&serverTimezone=UTC
username: root
password: 123456
application:
name: actor-provider-application
bootstrap.yaml
spring:
datasource:
type: ${spring-config.datasource.type}
driver-class-name: ${spring-config.datasource.driver-class-name}
url: ${spring-config.datasource.url}
username: ${spring-config.datasource.username}
password: ${spring-config.datasource.password}
application:
name: dataProvider8000
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: DEFAULT_GROUP
username: nacos
password: nacos
enabled: true
server:
port: 8000
mybatis:
type-aliases-package: ${mybatis-config.type-aliases-package:}
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath:mybatis/mapper/*.xml
验证同上。
3.服务发现(Nacos Discovery)
3.0项目建立
consumer建立
这里我们沿用上面的项目,再新建一个consumer,配置如下:
application.yaml
spring:
application:
name: consumer9000
cloud:
nacos:
discovery:
enabled: true
server-addr: 127.0.0.1:8848
server:
port: 9000
启动器加入注解@EnableDiscoveryClient
provider配置
yaml加入以下配置
spring:
application:
name: consumer8000
cloud:
nacos:
discovery:
enabled: true
server-addr: 127.0.0.1:8848
server:
port: 8000
启动器加入注解@EnableDiscoveryClient
环境验证
在进一步配置consumer访问provider的controller前,先启动两个服务,在nacos后台查看服务。
如显示两个服务都成功注册到了nacos,证明环境无误。
3.1Feign均衡负载(客户端)的consumer配置
(用于服务器均衡负载的Nginx等方案我们会在之后介绍)
consumer引入依赖,springdoc为可选,笔者为了方便调试引入
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
</dependency>
<!--openfeign服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
编写FeignService层
package com.zjy.consumer9000.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
import java.util.Map;
@FeignClient("dataProvider8000")//和Eureka+Feign一样,根据服务名找到服务,简单优雅
@Component
public interface FeignService {
@GetMapping("/dept/list")
List<Map> getAll();
@GetMapping("/dept/query/id/{departmentId}")
Map queryById(@PathVariable("departmentId") Integer departmentId);
@GetMapping("/dept/query/name/{departmentName}")
List<Map> queryByName(@PathVariable("departmentName") String departmentName);
}
ConsumerController
package com.zjy.consumer9000.controller;
import com.zjy.consumer9000.service.FeignService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
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;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@RestController
@Tag(name="consumer for dept")
@RequestMapping("/dept")
public class DeptConsumerController {
@Resource
private FeignService feignService;
@Operation(summary="本地测试")
public String test(){
return "OK";
}
@Operation(summary = "获取部门列表")
@GetMapping("/list")
public List<Map> getAll(){
System.err.println("listing all departments...");
return feignService.getAll();
}
@Operation(summary = "通过id查找部门")
@GetMapping("/query/id/{departmentId}")
public Map queryById(@PathVariable Integer departmentId){
return feignService.queryById(departmentId);
}
@Operation(summary = "通过名称查找部门")
@GetMapping("/query/name/{departmentName}")
public List<Map> queryByName(@PathVariable String departmentName){
return feignService.queryByName(departmentName);
}
}
启动类记得加上注解@EnableFeignClients
假如启动consumer提示获取不到FeignService的Bean,那么大概率需要检查一下是否忘记加上@FeignClient和@EnableFeignClients注解!
3.2功能验证
同上,进入swagger后台,逐个测试有参无参接口。