在前面的文章中,我们讲了使用Eureka
作为服务注册中心,在服务启动后,各个微服务会将自己注册到Eureka server
。那么服务之间是如何调用?又是如何进行负载均衡的呢?
目前,在Spring cloud 中服务之间通过restful方式调用有两种方式
- restTemplate+Ribbon
- feign
从实践上看,采用feign的方式更优雅(feign内部也使用了ribbon做负载均衡)。
1.Feign简介
Feign是一种声明式、模板化的HTTP客户端,也是netflix公司组件。使用feign可以在远程调用另外服务的API,如果调用本地API一样。
我们知道,阿里巴巴的doubbo采用二进制的RPC协议进行底层通讯,客户端可以使用类似本地方法一样调用。那么,虽然Feign同样可以有这种效果,但是底层还是通过HTTP协议调取restful的API的方式。
通过Feign, 我们能把HTTP远程调用对开发者完全透明,得到与调用本地方法一致的编码体验。
Feign具有如下特性:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解
- 支持可插拔的HTTP编码器和解码器
- 支持Hystrix和它的Fallback
- 支持Ribbon的负载均衡
- 支持HTTP请求和响应的压缩
2.如何使用
下面的例子,我们将利用之前构建的eureka-server
作为服务注册中心、eureka-client
作为服务提供者作为基础。而基于Spring Cloud Ribbon实现的消费者,我们可以根据eureka-consumer
实现的内容进行简单改在就能完成,具体步骤如下:
- 根据
eureka-consumer
复制一个服务消费者工程,命名为:eureka-consumer-feign
。在pom.xml
中增加下面的依赖:
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
- 修改应用主类。通过
@EnableFeignClients
注解开启扫描Spring Cloud Feign客户端的功能:
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
- 创建一个Feign的客户端接口定义。使用
@FeignClient
注解来指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口,比如下面就是绑定eureka-client
服务的/dc
接口的例子:
@FeignClient("eureka-client")
public interface DcClient {
@GetMapping("/dc")
String consumer();
}
- 修改Controller。通过定义的feign客户端来调用服务提供方的接口:
@RestController
public class DcController {
@Autowired
DcClient dcClient;
@GetMapping("/consumer")
public String dc() {
return dcClient.consumer();
}
}
在完成了上面你的代码编写之后,读者可以将eureka-server、eureka-client、eureka-consumer-feign都启动起来,然后访问http://localhost:2101/consumer ,来跟踪观察eureka-consumer-feign服务是如何消费eureka-client服务的/dc
接口的,并且也可以通过启动多个eureka-client服务来观察其负载均衡的效果。