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

代码如下:
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的感觉;
区别在于通过接口和通过服务名获得服务;