前言
Fegin是Netflix发明的声明式服务调用框架
当Fegin与Ribbon和Eureka结合使用时,Fegin就有了负载均衡的功能,在实现fegin的情况下,我们只需定义一个接口通过注解的方式,即可完成服务接口的绑定。
Feign内置了Ribbon,用来做 客户端负载均衡 ,去调用服务注册中心的服务。
说明:
项目中maven及依赖的版本如下
maven | 3.8.4 |
spring-boot-starter-parent | 2.7.10 |
spring-cloud | 2021.0.6 |
jdk | 1.8 |
spring-cloud-starter-openfeign | 3.1.6 |
实验步骤
1、搭建Eureka Server
可参考博客:Eureka——服务注册与发现框架_杜小白也想的美的博客-CSDN博客
2、搭建Eureka Client提供服务
可参考博客:Eureka——服务注册与发现框架_杜小白也想的美的博客-CSDN博客
添加controller包并创建HelloController类
如下:
@RestController
public class HelloController {
@RequestMapping(value = "/hello1",method = RequestMethod.GET)
public String hello1(@RequestParam String name){
return "hello,"+name;
}
}
3、搭建Eureka Client并加入Feign依赖作为消费者
具体步骤如下:使用Spirng Initializr在创建Eureka Client的基础上添加Fegin依赖
添加依赖的方法,在上述项目中的pom.xml文件中添加如下依赖
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.6</version>
</dependency>
yml文件配置如下:
server:
port: 8764 #配置端口号
spring:
application:
name: eureka-feign-client #指定用户名
eureka:
client:
service-url:
defaultZone: http://localhost:7000/eureka
创建service层,提供服务接口FeginService,通过Fegin调用服务
说明:@FeginClient注解指定要调用的服务提供者,如果项目使用了Ribbon(显然Fegin内置了Ribbon),name属性会作为微服务的名称,用于服务发现
@Service
@FeignClient(
name = "eureka-provider"
)
public interface FeignService {
@RequestMapping(
value = {"/hello1"},
method = {RequestMethod.GET}
)
String hello(@RequestParam("name") String name);
}
创建controller层并在该层中创建FeginController类对外提供API 并调用FeginService接口查看fegin的调用效果:
@RestController
public class FeignController {
@Autowired
FeignService feignService;
@RequestMapping(value = "/helloUser",method = RequestMethod.GET)
public String hello(){
StringBuilder sb=new StringBuilder();
sb.append(feignService.hello("czbk")).append("<BR/>");
return sb.toString();
}
}
4、测试
实验效果如下:
以上就是使用fegin调用服务的简单案例,其中包括简单的参数的绑定。
总结
配置过程
1、在springboot项目中的pom.xml文件中添加spring-cloud-starter-openfegin。
2、创建service接口并添加上@FeginClient注解,并配置调用的服务实例名称。
3、添加@RequestMapper配置服务的调用,请求路径及抽象方法。
4、controller调用servicer接口。
5、启动类中添加@EnableFeginClients。
注意:
1、如果有多个实现Feginclient注解的接口,@EnableFeginClients注解需要配置clients属性或者basePackages参数,加载包含@FeginClient接口的bean对象,具体原因可参考如下链接:
2、使用@RequestParam注解时默认参数必选,可通过required参数配置,其默认值为true
3、可能会出现如下错误:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow
4、@RequestMapper中的value属性值不可以重复。