1. 程式人生 > 實用技巧 >SpringCloud:Feign(工程構建)

SpringCloud:Feign(工程構建)

1、概念

(1)概述

Feign是一個宣告式的Web服務客戶端,使得編寫Web服務客戶端變得非常容易,只需要建立一個介面,然後在上面添加註解即可。

2、Feign工程構建

(1)模仿消費者(80)新建一個Feign模組,並新增Feign的依賴

 <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-feign</artifactId>
   </dependency>

(2)修改公共模組

  • 新增Feign的依賴
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-feign</artifactId>
   </dependency>
  • 建立介面

註解的引數中帶有微服務的名稱,通過該名稱獲取服務

@FeignClient(value = "PROVIDER")
public interface DeptClientService {
    @RequestMapping(value 
= "/dept/get/{id}",method = RequestMethod.GET) public Dept get(@PathVariable("id") long id); @RequestMapping(value = "/dept/list",method = RequestMethod.GET) public List<Dept> list(); @RequestMapping(value = "/dept/add",method = RequestMethod.POST) public boolean add(Dept dept); }

(3)建立消費者模組

@RestController
public class DeptConsumerController {
    @Autowired
    private DeptClientService service = null;

    @RequestMapping(value = "/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id)
    {
        return this.service.get(id);
    }

    @RequestMapping(value = "/consumer/dept/list")
    public List<Dept> list()
    {
        return this.service.list();
    }

    @RequestMapping(value = "/consumer/dept/add")
    public Object add(Dept dept)
    {
        return this.service.add(dept);
    }
}
  • 啟動類
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
@EnableEurekaClient
@EnableFeignClients(basePackages= {"com.zhb"})
@ComponentScan("com.zhb")
public class DeptConsumer80_Feign_App {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer80_Feign_App.class,args);
    }
}

(4)RestTemplate 方式

消費者模組程式碼:

與Feign相比,RestTemplate 方式不需要在公共類裡面新增介面,Feign是在接口裡面的註解新增微服務的名稱即可。

@RestController
public class DeptConsumerController {
    private static final String REST_URL_PREFIX = "http://PROVIDER";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/consumer/dept/add")
    public boolean add(Dept dept) {
        return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
    }

    @RequestMapping(value = "/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
    }

    @SuppressWarnings("unchecked")
    @RequestMapping(value = "/consumer/dept/list")
    public List<Dept> list() {
        return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
    }

}

配置類:

   @Bean
    @LoadBalanced
    public RestTemplate template(){
        return  new RestTemplate();
    }