SpringCloud之客户端调用
# 1、什么是Feign
Feign是由Netflix开发出来的另外一种实现负载均衡的开源框架,它封装了Ribbon和RestTemplate,实现了WebService的 面向接口编程,进一步的减低了项目的耦合度,因为它封装了Riboon和RestTemplate,所以它具有这两种框架的功能,可以 实现负载均衡和Rest调用。
# 2、为什么需要Feign
多个微服务是互相隔离的,那么微服务和微服务之间如何互相调用呢?
显然两个微服务都可以采用http通信,可以通过restTemplate+Ribbon组合进行互相访问,并实现负载均衡。但是这种方式对参数传递和使用都不是很方便,我们需要配置请求head、body,获得响应体后,还需解析等操作,十分繁琐。采用Feign进行服务之间的调用,可以简化调用流程,真正感觉到是在同一个项目中调用另一个类的方法的欢快感。本文主要讲解Feign的方式调用。
# 3、如何使用
- 第一步 :引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2
3
4
第二步: 在启动类上面加上注解:@EnableFeignClients,开启Feign
第三步: 然后编写一个service接口加上@FeignClient()注解 参数就是你的微服务服务名
服务我使用上篇中的cloud-client =》SpringCloud之服务注册与发现(下)
/**
* @Author Mr.Fire
* @Desc Feign调用代理
* @Date 2021/12/5
*/
@FeignClient("cloud-client")
public interface FeignCilentProxy {
@RequestMapping("/order")
public String feignTest();
}
2
3
4
5
6
7
8
9
10
11
- 第五步:调用
直接引入写好的Feign代理接口,调用对应方法,跟调用本地方法一样。
@RestController
public class TestController {
@Autowired
FeignCilentProxy feignCilentProxy;
@GetMapping("/getOrder")
public String orderTest(){
String order = feignCilentProxy.feignTest();
System.out.println(order);
return "success";
}
}
2
3
4
5
6
7
8
9
10
11
12
- 第四步:测试
由于我只写了一个服务cloud-client,因此我通过不同端口启动四个服务来测试负载均衡的效果。
测试效果:可以看到Feign已经实现了负载均衡
# 4、负载均衡
负载均衡就是将请求分摊给多个实例进行进行处理。根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。客户端负载均衡指的是发生在服务请求的一方,也就是在服务请求之前已经选好了由哪个实例进行处理。
我们在微服务中一般会选择客户端负载均衡,Ribbon就是在客户端进行了负载。Feign默认继承了Ribbon,所以自带负载均衡效果,默认轮询策略。
Ribbon支持的负载均衡策略
如何修改策略:
#cloud-client为服务名称,指明对哪个服务进行配置
cloud-client.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
2
# 5、总结
目前,在Spring cloud 中服务之间通过restful方式调用有两种方式 restTemplate+Ribbon 或者feign。Feign 是一个使用起来更加方便的 HTTP 客戶端, 使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法,写起来更加思路清晰和方便,采用注解方式进行配置,配置熔断等方式方便。