SpringCloud微服务入门(五),Feign实现服务通信

目录



正文


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/

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:SpringCloud微服务入门(五),Feign实现服务通信

本文地址:https://jizhong.plus/post/2020/03/study-springcloud-05.html