SpringCloud --- Feign负载均衡
目录
一、Feign概述
1、Feign官网解释
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign
Feign是一个声明式WebService客户端。使用Feign能让编写WebService客户端更加简单,他的使用方法是定义一个接口,然后再上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可插拔式的编码器和解压器。SpringCloud对Feign进行了封装,使其支持了Spring MVC标准化注解和HttpMessageConverters。Feign就可以与Eureka和Ribbon组合使用以支持负载均衡。
2、Feign来源
Feign是一个声明式的Web服务客户端,使得编写Web服务端非常容易。只需要创建一个接口,然后再上面添加注解即可。
之前我们都是用Ribbon进行负载均衡,功能很强大,甚至可以之定义算法。
- 那么Feign是怎么出来的呢?
大部分的大家都可以介绍,直接调用我们的微服务来进行访问:
//private static final String REST_URL_PREFIX = “http://localhost:8001”;
修改为面向微服务编程
private static final String REST_URL_PREFIX = “http://DEPT-PROVIER”;
实际中我们都习惯面向接口编程,比如WebService接口,比如我们的DAO接口,这个已经是规范了。
(1)微服务名称获取调用地址。
(2)通过接口+注解,获取我们的调用服务。
最终目的适应社区大部分开发人员提出的,还是统一的面向接口的编程,就创建了Feign。
3、Feign能做什么
Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个服务自行封装一些客户端类来包装这些服务的调用。所以,Feign在此基础上做了进一步的封装,由它来帮助我们定义和实现依赖接口的定义。在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(以前是Dao接口上面加@Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用SpringCloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成Ribbon:
利用Ribbon维护了SPRINGCLOUD-DEMO的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务接口且以声明式的方法,优雅而简单的实现了服务调用。
二、Feign使用步骤
1、新建consumer-feign并添加feign支持
参考consumer-80,主要添加对feign的支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-demo</artifactId>
<groupId>com.lin</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-consumer-feign</artifactId>
<name>springcloud-consumer-feign</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--自己定义的api-->
<dependency>
<groupId>com.lin</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- SpringBoot 起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--ribbon相关-->
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spirng-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--添加feign客户端支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
</project>
2、修改springcloud-api工程
(1)pom.xml
天剑feign客户端服务依赖支持:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-demo</artifactId>
<groupId>com.lin</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api</artifactId>
<dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--添加feign支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
</project>
(2)新建DeptClientService接口并新增注解@FeignClient
(3)maven clean 、maven install
(4)修改consumer-feign工程controller,添加上一步新建的DeptClientService接口
(5)修改consumer-feign主启动类
添加@EnableFeignClients客户端扫描类
package com.lin;
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;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = "com.lin")
public class DeptConsumer_Feign_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_Feign_App.class,args);
}
}
(6)测试
启动3个eureka集群
启动3个部门微服务8001/8002/8003
启动Feign
http://localhost/consumer/dept/list
注意:Feign自带负载均衡配置项
(7)小总结
Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),该请求发送给Eureka服务器(http://SPRINGCLOUD-DEMO/dept/list),通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。