目录
- SpringCloud微服务入门(零),开篇
- SpringCloud微服务入门(一),Eureka注册中心
- SpringCloud微服务入门(二),Eureka Client
- SpringCloud微服务入门(三),Eureka高可用集群
- SpringCloud微服务入门(四),创建服务
- SpringCloud微服务入门(五),Feign实现服务通信
- SpringCloud微服务入门(六),负载均衡Ribbon
- SpringCloud微服务入门(七),服务网关Zuul
- SpringCloud微服务入门(八),服务熔断组件Hystrix
- SpringCloud微服务入门(九),统一配置中心Config
- SpringCloud微服务入门(十),完结篇,是结束也是开始
- 番外篇 - 安装Docker,运行RabbitMQ镜像)
正文
Feign是一个http客户端工具,大名鼎鼎的Apache Http client、Spring RestTemplate、OkHttp想必都知道。Feign就是类似工具更便捷的一个封装。
SpringCloud是以REST来对外提供接口的,所以服务与服务之间的调用就是http调用。用过SpringBoot的同学都晓得可以用RestTemplate来调用接口。其实在SpringCloud中一样可以。
但有没有比RestTemplate更简单的方法呢?这个工具就是Feign了,它可以将REST接口伪装成本地方法调用,类似RPC。
百闻不如一见,跟着笔者一起在devices中用Feign调用park的/park-list接口。
1、在pom.xml中加入Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
需要留意别导错包了,artifactId是openfeign结尾而不是feign,feign已经过时了。
2、老套路,加注解。在devices的启动类上启用Feign的注解@EnableFeignClients
package com.javafm.devices;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class DevicesApplication {
public static void main(String[] args) {
SpringApplication.run(DevicesApplication.class, args);
}
}
3、创建Feign客户端,关键的一步操作在此
新建一个client包,再创建一个ParkClient接口,代码如下:
package com.javafm.devices.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "park")
public interface ParkClient {
@GetMapping("/park-list")
String parkList();
}
@FeignClient注解,表示这个接口是Feign客户端,参数name表示要调用的服务名,这个一定不要搞错了。
@GetMapping注解,表示要请求服务中的REST接口地址。
写了这个接口后,是不用写实现类的,因为devices调用park服务调用代码已经写完了。 有木有很简单,http地址啥的,都不用写了,没有任何逻辑代码。这里参数类型可以是你自定义的pojo,只要能与接口返回的JSON一一对应就可以了,这里写String是为了偷懒。
4、测试调用结果
我们可以建一个controller类,在里面调用ParkClient来测试,代码如下:
package com.javafm.devices.controller;
import com.javafm.devices.client.ParkClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DevicesController {
@Autowired
private ParkClient parkClient;
@GetMapping("/call-park-list")
public String callParkList() {
// 测试在devices服务里面调用park服务的接口
return parkClient.parkList();
}
}
运行devices,在浏览器访问http://localhost:8081/call-park-list
就可以看到调用park服务成功了。
(图一)
本节代码:https://gitee.com/dev-tang/learn-springcloud/tree/sc-04/