spring cloud alibaba Feign服务调用

·  阅读 204

「这是我参与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
  1. gradle引入依赖
    api 'org.springframework.cloud:spring-cloud-starter-openfeign'
    api 'org.springframework.cloud:spring-cloud-loadbalancer'
复制代码
  1. 启动类增加注解

    @EnableFeignClients 开启feign

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class RunLearning {
    public static void main(String[] args) {
        SpringApplication.run(RunLearning.class, args);
    }

}
复制代码
  1. 具体调用代码
// 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();
}
复制代码
  1. 演示
这里启动了2个note实例
访问http://localhost:20000/note/test

返回
第一次
{
  "code": 200,
  "msg": "操作成功",
  "data": "Feign 调用成功"
}
第二次
{
  "code": 200,
  "msg": "操作成功",
  "data": "本地Feign 调用成功"
}
复制代码

说明是轮询策略进行调用的

总结

通过上面,我们发现,使用feign调用十分简单。也不需要和dubbo一样强依赖。需要注意,如果你使用nacos进行服务注册的,需要保证2个服务在同一个group下。否则调用不成功。

分类:
后端
标签:
分类:
后端
标签: