Spring Cloud Feign是一个HTTP请求调用的轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性(可以使用springmvc的注解),可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,默认实现了负载均衡的效果并且springcloud为feign添加了springmvc注解的支持。
String restTemplateForObject = restTemplate.getForObject("http://服务名/url?参数" + name, String.class);
存在问题:
一个类别服务 一个商品服务
两个服务都引入
<!--consul client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
类别服务:
server.port=8787
spring.application.name=CATEGORY
#注册到consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
商品服务:
server.port=8788
spring.application.name=PRODUCT
#注册到consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
类别服务:
商品服务:
项目结构:
由于我们是在类别服务中调用商品服务,所以给类别服务引入下面的依赖:
<!--Open Feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在类别服务中开发接口ProductClient
package com.baizhi.FeignClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
//调用商品服务接口
@FeignClient(value = "PRODUCT") //value:用来书写调用服务Id
public interface ProductClient {
//调用商品服务
@GetMapping("/product")
String product();
@GetMapping("list")
String list();
}
下面这句用来指明需要调用的服务ID(默认就是Spring.application.name的值,我们类别服务名称为CATEGORY,商品服务名称为PRODUCT)
@FeignClient(value = "PRODUCT")
注意上面接口中的方法的请求方式和访问路径要和被调用的服务保持一致,由于我么是类别服务调用商品服务,所以查看下商品服务的控制器:
可以看到,上述的路径和请求方式都保持一致
将商品服务设定为两个服务节点,两个不同端口都注册商品服务组成简单集群,顺便测试下负载均衡。
查看服务注册中心:localhost:8500
类别服务的控制器:
访问:http://localhost:8787/category
通过类别服务调用商品服务,顺便通过日志检查负载均衡。
由于默认使用的负载均衡算法是轮询,所以就会一致在8788和8799之间切换,我们多刷新几次再查看日志:
可以看到,负载均衡的算法是轮询法,由于我们是一个控制器中调用了两个商品服务,所以可以看到接收请求的服务端口一直在变。