Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。
它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成
了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
?
简而言之:
?
Feign 采用的是基于接口的注解
Feign 整合了ribbon,具有负载均衡的能力
整合了Hystrix,具有熔断的能力
二、准备工作
继续用上一节的工程, 启动eureka-server,端口为8761; 启动service-hi 两次,端口分别为8762 、8773.
了解springcloud架构可以加求求:三五三六二四七二五九
三、创建一个feign的服务
新建一个spring-boot工程,取名为serice-feign,在它的pom文件引入Feign的起步依赖spring-cloud-starter-feign、
Eureka的起步依赖spring-cloud-starter-netflix-eureka-client、Web的起步依赖spring-boot-starter-web,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30class="xml plain" style="font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; float: none !important; line-height: 1.1em !important; overflow: visible !important; vertical-align: baseline !important; width: auto !important; font-size: 13px !important;"><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">
????<modelVersion>4.0.0</modelVersion>
????<groupId>com.forezp</groupId>
????<artifactId>service-feign</artifactId>
????<version>0.0.1-SNAPSHOT</version>
????<packaging>jar</packaging>
????<name>service-feign</name>
????<description>Demo?project?for?Spring?Boot</description>
????<parent>
????????<groupId>com.forezp</groupId>
????????<artifactId>sc-f-chapter3</artifactId>
????????<version>0.0.1-SNAPSHOT</version>
????</parent>
????<dependencies>
????????<dependency>
????????????<groupId>org.springframework.cloud</groupId>
????????????<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
????????</dependency>
????????<dependency>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-starter-web</artifactId>
????????</dependency>
????????<dependency>
????????????<groupId>org.springframework.cloud</groupId>
????????????<artifactId>spring-cloud-starter-openfeign</artifactId>
????????</dependency>
????</dependencies>
?????
????</project>
在工程的配置文件application.yml文件,指定程序名为service-feign,端口号为8765,服务注册地址为http://localhost:8761/eureka/ ,代码如下:
1 2 3 4 5 6 7 8 9eureka:
??client:
????serviceUrl:
??????defaultZone:?http://localhost:8761/eureka/
server:
??port:?8765
spring:
??application:
????name:?service-feign
在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能:
1 2 3 4 5 6 7 8 9@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public?class?ServiceFeignApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(?ServiceFeignApplication.class,?args?);
????}
}
定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了service-hi服务的“/hi”接口,代码如下:
1 2 3 4 5@FeignClient(value?=?"service-hi")
public?interface?SchedualServiceHi?{
????@RequestMapping(value?=?"/hi",method?=?RequestMethod.GET)
????String?sayHiFromClientOne(@RequestParam(value?=?"name")?String?name);
}
在Web层的controller层,对外暴露一个"/hi"的API接口,通过上面定义的Feign客户端SchedualServiceHi 来消费服务。代码如下:
1 2 3 4 5 6 7 8 9 10@RestController
public?class?HiController?{
????//编译器报错,无视。?因为这个Bean是在程序启动的时候注入的,编译器感知不到,所以报错。
????@Autowired
????SchedualServiceHi?schedualServiceHi;
????@GetMapping(value?=?"/hi")
????public?String?sayHi(@RequestParam?String?name)?{
????????return?schedualServiceHi.sayHiFromClientOne(?name?);
????}
}
启动程序,多次访问http://localhost:8765/hi?name=forezp,浏览器交替显示:
hi forezp,i am from port:8762
hi forezp,i am from port:8763