SpringCloud之openFeign和ribbon
Feign
OpenFeign是Netflix 开发的声明式、模板化的HTTP请求客户端。可以更加便捷、优雅地调用http api。
OpenFeign会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign会将函数的参数值设置到这些请求模板中。
feign主要是构建微服务消费端。只要使用OpenFeign提供的注解修饰定义网络请求的接口类,就可以使用该接口的实例发送RESTful的网络请求。还可以集成Ribbon和Hystrix,提供负载均衡和断路器。
英文表意为“假装,伪装,变形”, 是一个 Http 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 Http 请求,而不用像 Java 中通过封装 HTTP 请求报文的方式直接调用。通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。Feign 封装 了HTTP 调用流程,面向接口编程。
Feign和OpenFeign的关系
Feign本身不支持Spring MVC的注解,它有一套自己的注解
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient
可以解析SpringMVC的@RequestMapping注解下的接口,
并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
SpringCloud从2020版本后就从OpenFeign中移除ribbon,如果要使用openfeign+ribbon,SpringCloud的版本可以选择Hoxton.SR9。
例子
此例子中SpringCloud版本是Hoxton.SR9,SpringBoot版本是2.3.2.RELEASE。
在ConsumerByRibbon模块(端口是8003)中加入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
依赖。并在启动类上加入@EnableFeignClients注解开启对feign客户端的支持。
新建feign包,在包下新建HelloFeign接口:
@FeignClient(value = "producer")
public interface HelloFeign {
@RequestMapping("/hello")
public String hello(@RequestParam String name);
}
@FeignClient里面的value表示要调用的服务名。@RequestMapping是SpringMVC的注解。
在controller中引入:
@Autowired
private HelloFeign helloFeign;
@RequestMapping("/helloByFeign")
public String helloByFeign() {
return helloFeign.hello("张三");
}
服务提供方(端口是8000):
@RequestMapping("/hello")
public String hello(String name) {
return "hello," + name + "," + port;
}
访问http://localhost:8003/helloByFeign,看到
hello,张三,8000
又新启动一个服务提供方(端口是8002),访问http://localhost:8003/helloByFeign,重复几次看到hello,张三,8000和hello,张三,8002交替出现。这是feign使用了ribbon做了负载均衡。