SpringCloud-声明式服务调用 Feign

Fegin 是一个声明式的 web 服务客户端,它使得编写 web 服务客户端变得更加容易。使用 Fegin 创建一个接口并对它进行注解。它具有可插拔的注解支持包括 Feign 注解与 JAX-RS 注解,Feign 还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC 的注解,Spring Web 默认使用了 HttpMessageConverters。Fegin 还可以集成 Ribbon 和 Hystrix 来提供负载均衡和网络断路器的功能。

本篇将使用 Fegin + eureka client 来完成服务发现和调用。

环境准备

类别
JDK
1.8.0_162
SOFABoot/SpringBoot
3.0.0/2.0.x.RELEASE
SpringCloud
Finchley.RC1
IDE
IDEA

工程背景

本节将会创建一个 sofa-eureka-consumer-feign 工程,使用 Feign 提供的 web 客户端来访问 sofa-eureka-provider 发布的服务。同时也基于此工程验证基于 Feign 实现的负载均衡。

新建 sofa-eureka-consumer-feign

本工程继续使用《SpringCloud-Eureka 服务注册》中的父工程来构建。

右击 sofa-eureka-parent 父工程 -> New -> Module,这里选择 Maven 工程;

  • artifactId:sofa-eureka-consumer-feign

修改pom文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<parent>
<artifactId>sofa-eureka-parent</artifactId>
<groupId>com.alipay.sofa</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>sofa-eureka-server-center</artifactId>
<dependencys>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencys>

修改配置文件

1
2
3
server.port=8888
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
spring.application.name=eureka-consumer-feign

启动类

这里需要添加 @EnableEurekaClient 和 @EnableFeignClients 两个注解。

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SofaEurekaConsumerFeignApplication {
public static void main(String[] args) {
SpringApplication.run(SofaEurekaConsumerFeignApplication.class, args);
}
}

资源类

  • com.alipay.sofa.cloud.service 包下新建 HelloSOFAService
1
2
3
4
5
@FeignClient("helloSOFAService")
public interface HelloSOFAService {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String hello();
}
  • com.alipay.sofa.cloud.controller 包下新建 FeignController
1
2
3
4
5
6
7
8
9
10
11
@RestController
public class FeignController {
@Autowired
private HelloSOFAService helloSOFAService;

@RequestMapping("/hello")
public String hello(){
return helloSOFAService.hello();
}
}

启动 & 验证

启动当前工程,在此之前请以此启动 注册中心 sofa-eureka-server-center 和 sofa-eureka-provider 两个工程。

注:这里我启动了两个 provider 工程

浏览器输入:http:localhost:8888/hello,观察到浏览器中依次展示:

1
2
3
4
Hello SOFA! Now Port is 8081 And hostname is HelloSOFAService
Hello SOFA! Now Port is 8082 And hostname is HelloSOFAService
Hello SOFA! Now Port is 8081 And hostname is HelloSOFAService
Hello SOFA! Now Port is 8082 And hostname is HelloSOFAService

这里可以看待 通过 feign 提供的客户端能力已经访问到了远程服务,由于 feign 集成了 ribbon 因此也就默认实现了负载均衡的能力。从结果来看,默认的负载均衡策略是轮询。

作者

卫恒

发布于

2018-12-31

更新于

2022-04-23

许可协议

评论