「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。
公司项目都是dubbo调用的,现在想加入feign调用,于是在项目基础上,改造下,引入feign进行调用
概念
微服务集群内部调用必然依赖一个好的RPC框架,比如:基于http协议的Feign,基于Tcp协议的dubbo。
什么是Feign
Feign是由Netflix开发出来的另外一种实现负载均衡的开源框架,它封装了Ribbon和RestTemplate,实现了WebService的 面向接口编程,进一步的减低了项目的耦合度, 因为它封装了Riboon和RestTemplate,所以它具有这两种框架的功能,可以 实现负载均衡和Rest调用。
为什么需要Feign
微服务是互相隔离的,那么微服务和微服务之间如何互相调用呢? 显然两个微服务都可以采用http通信,之前也通过代码来实现restTemplate进行互相访问,但是这种方式对参数传递和使用都不是很方便,我们需要配置请求head、body, 然后才能发起请求。获得响应体后,还需解析等操作,十分繁琐。采用Feign进行服务之间的调用,可以简化调用流程,真正感觉到是在同一个项目中调用另一个类的方法的欢快感。
Feign优点
- Feign旨在使编程java Http客户端变得更容易
- 服务调用的时候融合了 Ribbon 技术,所以也支持负载均衡作用
代码实战
服务提供方
@RestController
public class TestController {
@GetMapping("test")
public String test() {
return "本地Feign 调用成功";
}
}
服务调用方
项目版本:
- spring boot:
2.4.2; - spring cloud:
2020.0.1; - spring cloud alibaba:
2121.1
- gradle引入依赖
api 'org.springframework.cloud:spring-cloud-starter-openfeign'
api 'org.springframework.cloud:spring-cloud-loadbalancer'
-
启动类增加注解
@EnableFeignClients开启feign
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class RunLearning {
public static void main(String[] args) {
SpringApplication.run(RunLearning.class, args);
}
}
- 具体调用代码
// controller
@GetMapping("/note/test")
public Result<String> test() {
String test = testService.test();
return ResultUtil.success(test);
}
//value指是你要调的服务应用名称
@FeignClient(value = "note")
public interface TestService {
@GetMapping("/test")
String test();
}
- 演示
这里启动了2个note实例
访问http://localhost:20000/note/test
返回
第一次
{
"code": 200,
"msg": "操作成功",
"data": "Feign 调用成功"
}
第二次
{
"code": 200,
"msg": "操作成功",
"data": "本地Feign 调用成功"
}
说明是轮询策略进行调用的
总结
通过上面,我们发现,使用feign调用十分简单。也不需要和dubbo一样强依赖。需要注意,如果你使用nacos进行服务注册的,需要保证2个服务在同一个group下。否则调用不成功。