Feign服务调用
使用Feign,在服务消费者中,调用服务提供者的接口。
注册中心
此处使用 Nacos,详情见: https://www.cnblogs.com/expiator/p/17392549.html
Feign依赖
<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.6.13</spring-boot.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
服务提供者
- 服务提供者的配置文件 bootstrap.properties:
#配置文件优先级(由高到低):
#bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
server.port=8083
spring.application.name=provider
spring.profiles.active=dev
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.prefix=provider
spring.cloud.nacos.config.file-extension=yaml
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
spring.cloud.nacos.discovery.namespace=
# Nacos 服务发现与注册配置。
# 其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- 服务提供者的控制层。
其他文件详情见结尾的 GitHub。
@RestController
public class ProviderController {
/**
* 后面的 :abc 表示默认值为 abc。
*/
@Value("${config.name:abc}")
private String configName;
@GetMapping(value = "/provider/test")
public String test() {
return "Hello World~";
}
@GetMapping(value = "/provider/config")
public String getConfig() {
return configName;
}
}
服务消费者
- 服务消费者的配置文件 bootstrap.properties:
#配置文件优先级(由高到低):
#bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
server.port=8084
spring.application.name=consumer
spring.profiles.active=dev
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.prefix=consumer
spring.cloud.nacos.config.file-extension=yaml
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
spring.cloud.nacos.discovery.namespace=
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- ConsumerApplication启动类:
使用注解@EnableFeignClients启用feign客户端
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
- ConsumerController 控制层:
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Resource
private FeignDemoService feignDemoService;
@GetMapping("/test")
public String customer() {
return feignDemoService.test();
}
}
- Feign接口:
@FeignClient(value = "provider")
public interface FeignDemoService {
@GetMapping("/provider/test")
String test();
}
接口测试
启动服务提供者,以及服务消费者,通过 feign 做一次服务调用。
Feign报错
- Feign报错:
A component required a bean of type '' that could not be found.
解决方法:
在Application启动类上方,添加注解 @EnableFeignClients
- Feign报错:
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
解决方法:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
代码详情见:
https://github.com/enjoyCoding666/iSpringCloud/