介绍:

Feign是一个声明式WebService客户端。

使用Feign能让编写Web Service客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。

Spring Cloud对Feign进行了封装, .使其支持了Spring MVC标准注解和HttpMessageConverters,

Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

 

说的简单点就是:Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易.

只需要创建一个接口,然后在上面添加注解即可.

Feign能干什么?

Feign旨在使编写Java Http客户端变得更容易。

前面在使用Ribbon+ RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。

所以, Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量.

Feign集成了Ribbon

用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是通过feign只需要定义服务绑定接口目以声明式的方法,优雅而简单的实现了服务调用,

 

理论和套路说到这,现在具体来弄弄代码操作:

Feign的使用很简单,只要你定义好接口,然后打好注解@FeignClients基本就能使用了

贴上pom文件支持:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

贴上公共使用的api模块定义接口: 等于是说我们在公共模块上定义好接口,然后调用方会调用这里的接口来使用方法,而这些方法会通过Eureka然后去具体的被调用方的服务中找对应的实现,因为Feign集成了Ribbon所以也默认是轮询的负载均衡.

@FeignClient(value = "MICROSERVICECLOUD-DEPT")//被调用方的服务名
public interface DeptClientService {
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id);

@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list();

@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(Dept dept);
}

上面是公共接口,然后贴上测试用的Feign模块的主启动类:

package com.hw;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@EnableEurekaClient //eureka客户端
@EnableFeignClients(basePackages = {"com.hw"}) //扫描Feign包
@ComponentScan("com.hw") //扫描包
public class DeptConsumer80_Feign_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer80_Feign_App.class);
}
}

贴上调用方的controller层的代码:

@RestController
public class DeptController_Consumer {
@Autowired //直接面向接口编程
private DeptClientService service;

@RequestMapping(value = "/consumer/dept/add")
public boolean add(Dept dept) {
return this.service.add(dept);
}

@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id) {
return this.service.get(id);
}

@RequestMapping(value = "/consumer/dept/list")
public List<Dept> list() {
return this.service.list();
}
}

贴上调用方的配置文件:

server:
port: 80

#调用方配置eureka,做负载均衡
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

效果图示例:

SpringCloud之Feign负载均衡的使用_springcloud

SpringCloud之Feign负载均衡的使用_封装_02

SpringCloud之Feign负载均衡的使用_springcloud_03

 

Feign通过接口的方法调用Rest服务(之前是Ribbon +RestTemplate)

该请求发送给Eureka服务器(http://MICROSERVICECLOUD-DEPT/dept/list))

通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。

关于Feign和Ribbon的使用区别大家可以看我上一篇博客,里面详细介绍了Ribbon的使用,结合两篇博客就可以得知两者之间的区别