什么是Feign?
1.Feign是基于Ribbon实现的,是一个声明式、模板化的Web Service客户端,实现负载均衡。
2.相比较于Ribbon+RestTemplate的方式,Feign大大简化了代码的开发,开发者可以通过简单的接口和注解来调用HTTP API。支持Feign注解、JAX-RS注解、Spring MVC注解。
3.Feign集成了Hystrix,具备服务熔断的功能。具有可插拔、基于注解、负载均衡、服务
熔断的一系列便捷功能。
代码实现
1.创建Module 名字叫feign , pom.xml添加依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies>
2.resources文件夹下创建配置文件application.yml
server: port: 8050 spring: application: name: feign eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true
3.创建启动类 com.example.FeignApplication
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableFeignClients public class FeignApplication { public static void main(String[] args) { SpringApplication.run(FeignApplication.class,args); } }
5创建entity实体类Student
package com.example.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Student { private long id; private String name; private int age; }
6.创建声明式接口com.example.feign.FeignProviderClient
import com.example.entity.Student; import com.example.feign.impl.FeignError; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import java.util.Collection; @FeignClient(value = "provider") public interface FeignProviderClient { @GetMapping("/student/findAll") public Collection<Student> findAll(); @GetMapping("/student/port") public String port(); }
7.创建类com.example.controller.FeignHandler实现接口方法
package com.example.controller; import com.example.entity.Student; import com.example.feign.FeignProviderClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Collection; @RestController @RequestMapping("/feign") public class FeignHandler { @Autowired private FeignProviderClient feignProviderClient; @GetMapping("/findAll") public Collection<Student> findAll(){ return feignProviderClient.findAll(); } @GetMapping("/port") public String port(){ return feignProviderClient.port(); } }
8.启动eurekaserver模块,启动eurekaclient模块,在eurekaclient添加第二个启类ProviderApplication2
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ProviderApplication2 { public static void main(String[] args) { SpringApplication.run(ProviderApplication2.class,args); } }
修改eurekaclient的application.yml 的server.port: 8011,启动eurekaclient的第二个启动类,
启动Feign模块。启动后如下
9.浏览器中输入http://localhost:8050/feign/port 验证负载均衡,刷新页面会交替访问两个provider的getPort
10.服务熔断,feign模块的application.yml添加熔断机制
feign: hystrix: enabled: true
属性说明:feign.hystrix.enabled:是否开启熔断器。
11.创建FeignProviderClient接口的实现类FeignError
package com.example.feign.impl; import com.example.entity.Student; import com.example.feign.FeignProviderClient; import org.springframework.stereotype.Component; import java.util.Collection; @Component public class FeignError implements FeignProviderClient { @Override public Collection<Student> findAll() { return null; } @Override public String port() { return "服务器维护中..."; } }
12.在接口FeignProviderClient,添加注解属性fallback = FeignError.class
@FeignClient(value = "provider",fallback = FeignError.class)
13.关闭eurekaclient模块,重启feign模块,访问localhost:8050/feign/port