公司使用Feig+Nacos作为微服务架构,之前没有学习过,最近学习了一下踩了很多坑,记录一下
服务提供者的代码放在github上了,有需要的可以参考。
github地址
首先Nacos是阿里开源的注册中心与配置中心,具体的学习与安装可以查看官方文档,Nacos官方中文文档
Fegin是一种Springcloud提供的服务调用的实现,具体学习可以查看官网或者中文社区
这里只有入门实现,没有原理,想看原理的朋友可以跳了
服务提供者
父工程
pom依赖
这里有第一个坑,springboot与springcloud有版本对应关系,不能乱用,具体对应关系可以 官网介绍
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<revision>1.0.0-SNAPSHOT</revision>
<spring-cloud.version>2021.0.1</spring-cloud.version>
<spring.boot.version>2.6.6</spring.boot.version>
<lombok.version>1.18.22</lombok.version>
<nacos.version>2021.1</nacos.version>
</properties>
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>com.fancy</groupId>
<artifactId>SpringCloud-feign</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.fancy</groupId>
<artifactId>SpringCloud-feign-impl</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
API定义工程
接口定义module,这个module专门用来定义feign,方便提供者与消费者引用。
pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
定义一个feign接口,需要注意name不能乱写,feign在进行调用时如果我们没有指定url会根据注册中心通过这个name获取提供服务的机器进行负载均衡然后调用,这个name应该就是提供服务的服务名
由于我们定义出来的feign当别人引入时,如果这样写是加载不到spring容器中的,我们不应该让引用我们服务的人自己去手动扫描这个包,可以使用springboot的机制来自己加载我们想要加载的类
添加配置文件spring.factories放字资源目录META-INF下
写一个配置类去帮引用我们服务的人加载我们的服务
feign定义层就写完了,feign的入参出参应该也定义在这个module中。
业务逻辑工程
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> // 这个是我们自己的jar 写的名字不太规范
<groupId>com.fancy</groupId>
<artifactId>SpringCloud-feign</artifactId>
</dependency>
启动类上写个注解将自己注册到Nacos即可
@EnableDiscoveryClient
写一个实现feign接口的具体逻辑层,
- 注意一定要将它交给spring管理,如果不给spring管理找不到这个类,那么会认为服务没有实现,返回的结果一直是null
- 并且我们定义的这User类一定要有空构造方法!
yml
server:
port: 8081
spring:
application:
name: feign-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
服务提供者就写完啦
服务消费者
这个我们就建一个简单的module就行
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
<nacos.version>2021.1</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<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>
</dependency>
<dependency> // 引入我们定义的api包 注意需要将这个包install一下 下载到我们本地仓库
<groupId>com.fancy</groupId>
<artifactId>SpringCloud-feign</artifactId>
<version>1.0.0-SNAPSHOT</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>
</dependencies>
</dependencyManagement>
启动类上加个注解将自己注册到Nacos上
@EnableDiscoveryClient
写个测试类
yml
server:
port: 8082
spring:
application:
name: feign-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
然后就搞定啦 调用下即可
由于我们在API定义层已经完成了feign的扫描操作,所以在提供者消费者都不需要在启动类上加注解
@EnableFeignClients 加了反而会报错哦