Feign其实就是restTemplate和Ribbon的结合版本。
Feign默认负载均衡策略就是轮询方式。
创建一个接口,然后使用@FeignClient指定集群的服务名称,去修饰接口,该接口中的方法全部都使用抽象方法,然后使用@RequestMapping修饰,就可以采用像Mybatis的那种面向接口访问的方式访问了。
搭建流程:
1、导入pom依赖
<dependencies>
<!--springboot启动默认需要的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!--springboot 支持web开发-->
<dependency>
<!-- 对全栈web开发的支持,包括Tomcat和 spring-webmvc -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!--spring与mybatis整合的jar-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!--让tomcat支持jsp页面-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
<!--自定义模块然后再其他模块中引用-->
<dependency>
<groupId>com.syzw</groupId>
<artifactId>com.syzw.common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- mybatis的框架包 -->
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!--连接mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!--eureka-client 客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<!--feign的依赖,feign其实就是把Ribbon和RestTemplate整合起来了,形成了一种像mytabis的dao接口层的访问方式-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<!--
配置服务的熔断和降级
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--监控的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
2、主启动类中开启Feign接口风格访问模式
/**
* feign风格的消费者
*/
@SpringBootApplication
//因为要向eureka-server消费服务,所以自己这个服务要作为客户端
@EnableEurekaClient
//启用Feign风格的接口访问模式
@EnableFeignClients(basePackages= "com.syzw.feign.consumer")
@EnableHystrix
public class FeignConsumerAppStart {
public static void main(String[] args) {
SpringApplication.run(FeignConsumerAppStart.class,args);
}
}
3、创建Feign接口风格服务
/**
*Feign作为消费者,Feign其实就是RestTemplate+Ribbon的结合版本。
* 因为RestTemplate不符合现在的面向接口方式定义,所以Feign就诞生了。
*
* SERVER1DEPTSERVER是集群的服务提供者的名称。
*
* fallback:就是为了解决在每个方法中需要大量的熔断注解@HystrixCommand,
* 而产生的fallback接口。
*/
@FeignClient(name="SERVER1DEPTSERVER",fallbackFactory=DeptServerFallBack.class)
public interface DeptFeignService {
@RequestMapping("/dept/getDeptList")
public List<Dept> getList();
}
4、服务熔断
这个地方是当使用Feign访问其他服务,出现服务出错,长时间未响应的情况就会采用以下的情况进行响应,也叫熔断。就像是商店临时有事挂个暂时打烊的牌子一个道理,不让用户长时间等待,造成更大的损失。在开发中这种方式被用来解决服务雪崩。
/**
*
* 服务的熔断
*
* Hystrix 是基于客户端,所有一般配置在客户端和网关上,当然也可以配置在服务端,用来做限流
*
*/
@Component
public class DeptServerFallBack implements FallbackFactory<DeptFeignService> {
@Override
public DeptFeignService create(Throwable throwable) {
return new DeptFeignService() {
@Override
public List<Dept> getList() {
ArrayList<Dept> list=new ArrayList<>();
Dept dept=new Dept();
dept.setDeptName("这是一个服务降级的接口");
list.add(dept);
return list;
}
};
}
}
5、Controller使用Feign访问其他模块的业务
@RestController
@RequestMapping
public class DeptController {
@Autowired
DeptFeignService deptFeignService;
@RequestMapping("/getList")
public List<Dept> getList(){
return deptFeignService.getList();
}
}
注意:
Feign其实就是Ribbon和RestTemplate的结合版本。
Ribbon用于在做了集群的情况下做负载均衡。
RestTemplate用于做RPC远程方法调用。