Feign使用接口实现服务的调用

1.使用feign在api层面,暴露一个服务接口,结构如下

image-20201025222507115

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.saxon.springcloud.service;

import com.saxon.springcloud.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;


@Component
@FeignClient (value = "SAXON")
public interface FeignService {
@GetMapping("/get/{id}")
Dept queryDeptById (@PathVariable("id") long id);
}

@FeignClient (value = “SAXON”),里面的值就是服务的名字,注册这个接口就是Feign的客户端

==@FeignClient can only be specified on an interface==

类似于一个controller层,暴露接口等待下一个接收的接口,把注解变成一个可以由外界调用的方法;

2.创建一个消费端口,调用api

使用方法是一样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.saxon.springcloud.controller;

import com.saxon.springcloud.pojo.Dept;
import com.saxon.springcloud.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerDept {

@Autowired
FeignService feignService;

@GetMapping("/get/{id}")
Dept queryDeptById (@PathVariable ("id") long id) {
return feignService.queryDeptById (id);
}
}

启动类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.saxon.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients (basePackages = {"com.saxon.springcloud"})
public class SpringCloudConsumer {
public static void main (String[] args) {
SpringApplication.run (SpringCloudConsumer.class, args);
}
}

@EnableFeignClients启动Feign客户端

使用和一般的服务使用是一样的,就不多赘述了;

与前一种比较的话,由于加了一层,可能导致效率变低,但是更加符合我们Java的感觉;

区别在于通过接口和通过服务名获得服务;