初识SpringCloud|第三篇|Feign

​ 服务消费者还有一种落地实现是Feign,Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果,并且整合了Hystrix,具有熔断的能力。

创建Feign服务

​ 新建一个SpringBoot模块,取名:eureka-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
30
31
32
33
34
35
<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.kn</groupId>
<artifactId>eureka-feign</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-feign</name>
<description>Demo project for Spring Boot</description>


<parent>
<groupId>com.kn</groupId>
<artifactId>springcloud</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的注册地址依然是http://localhost:8761/eureka/,端口号为 8765,具体代码如下:

1
2
3
4
5
6
7
8
9
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8765
spring:
application:
name: eureka-feign

​ 在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能:

1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaFeignApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaFeignApplication.class, args);
}

}

​ 定义一个Feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务(声明式调用)。比如在代码中调用了eureka-service服务的“/hi”接口,代码如下:

1
2
3
4
5
6
7
8
9
10
/**
* @ClassName: FeignServiceClient
* @Description TODO: 调用EurekaClient的服务,Feign采用声明式调用,
* 且接口会利用动态代理实现(类似于JPA)
*/
@FeignClient(value = "eureka-client")
public interface FeignServiceClient {
@GetMapping( "/hi")
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

​ 写一个Controller类进行测试,对外暴露一个”/hi”的API接口,调用Feign客户端的FeignServiceClient来消费服务。

1
2
3
4
5
6
7
8
9
10
@RestController
public class HiController {
@Autowired
FeignServiceClient feignServiceClient;

@GetMapping("/hi")
public String sayHi(@RequestParam String name) {
return feignServiceClient.sayHiFromClientOne( name );
}
}

启动服务

1
2
hi kn,i am from port:8762
hi kn,i am from port:8763

结尾

​ 这一篇的操作并没有遇到什么问题,根据Fegin的使用情况比较rest+Ribbon,总体感觉上Feign的声明式调用操作起来更加舒服。大牛的原文链接地址:http://blog.csdn.net/forezp/article/details/81040965

0%