聲明式服務調用Feign簡單介紹下;java
Feign是一個聲明式的Web Service客戶端,它使得編寫Web Serivce客戶端變得更加簡單。咱們只須要使用Feign來建立一個接口並用註解來配置它既可完成。web
它具有可插拔的註解支持,包括Feign註解和JAX-RS註解。Feign也支持可插拔的編碼器和解碼器。spring
Spring Cloud爲Feign增長了對Spring MVC註解的支持,還整合了Ribbon和Eureka來提供均衡負載的HTTP客戶端實現。服務器
這裏說下實際使用,前面Ribbon調用服務提供者,咱們經過restTemplate調用,缺點是,多個地方調用,同一個請求要寫屢次,不方便統一維護,app
這時候Feign來了,就直接把請求統一搞一個service做爲FeignClient,而後其餘調用Controller須要用到的,直接注入service,直接調用service方法便可;負載均衡
同時Feign整合了Ribbon和Eureka,因此要配置負載均衡的話,直接配置Ribbon便可,無其餘特殊地方;ide
固然Fiegn也整合了服務容錯保護,斷路器Hystrix,後面再說。學習
第一步:在common項目裏建一個service(實際項目中是多個service)做爲Feign客戶端,用Feign客戶端來調用服務器提供者,固然能夠配置負載均衡;測試
Feign客戶端定義的目的,就是爲了方便給其餘項目調用; 編碼
修改 microservice-common
pom.xml引入Feign依賴:
<!-- feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
在common中創建TicketClientService接口:
1 package com.wfd360.service;
2
3 import com.wfd360.model.Ticket;
4 import org.springframework.cloud.netflix.feign.FeignClient;
5 import org.springframework.web.bind.annotation.GetMapping;
6 import org.springframework.web.bind.annotation.PathVariable;
7 import org.springframework.web.bind.annotation.PostMapping;
8
9 import java.util.List;
10
11 /**
12 * Created by 姿式帝-博客園 on 2019/3/29.
13 * 歡迎添加筆者wx(851298348)共同探討、學習!
14 */
15
16 /**
17 * feign客戶端接口
18 */
19 @FeignClient(value = "MICROSERVICE-TICKET") //調用的服務名稱
20 public interface TicketClientService {
21 /**
22 * 根據id查詢車票信息
23 *
24 * @param id
25 * @return
26 */
27 @GetMapping(value = "/ticket/get/{id}")
28 public Ticket get(@PathVariable("id") Integer id);
29
30 /**
31 * 查詢車票信息
32 *
33 * @return
34 */
35 @GetMapping(value = "/ticket/list")
36 public List<Ticket> list();
37
38 /**
39 * 添加或者修改車票信息
40 *
41 * @param ticket
42 * @return
43 */
44 @PostMapping(value = "/ticket/save")
45 public boolean save(Ticket ticket);
46
47 /**
48 * 根據id刪除車票信息
49 *
50 * @return
51 */
52 @GetMapping(value = "/ticket/delete/{id}")
53 public boolean delete(@PathVariable("id") Integer id);
54 }
第二步:爲了避免影響以前的ribbon消費者,咱們在這裏從新創建一個基於Feign消費者項目,本質上與ribbon的消費者同樣的;
參考microservice-student-consumer-80建一個microservice-student-consumer-feign-80
代碼都複製一份,包括pom.xml,pom.xml里加下 feign依賴,和第一步同樣;
第三步:加註解,啓動加個註解@EnableFeignClients,支持下Feign;
重點注意:要註釋掉@EnableEurekaClient
第四步:修改Contrller,代碼以下:
1 package wfd360.controller;
2
3 import com.wfd360.model.Ticket;
4 import com.wfd360.service.TicketClientService;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.*;
8
9 import java.util.List;
10
11 /**
12 * Created by 姿式帝-博客園 on 2019/3/26.
13 * 歡迎添加筆者wx(851298348)共同探討、學習!
14 */
15
16 /**
17 * 知識點:@RestController註解至關於@ResponseBody + @Controller合在一塊兒的做用。
18 */
19 @Controller
20 @RequestMapping("/ticket")
21 public class TicketConsumerController {
22 @Autowired
23 private TicketClientService ticketClientService;
24
25 /**
26 * 添加或者修改車票信息
27 *
28 * @param ticket
29 * @return
30 */
31 @PostMapping(value = "/save")
32 @ResponseBody
33 public boolean save(Ticket ticket) {
34
35 return ticketClientService.save(ticket);
36 }
37
38 /**
39 * 查詢車票信息
40 *
41 * @return
42 */
43 @SuppressWarnings("unchecked")
44 @GetMapping(value = "/list")
45 @ResponseBody
46 public List<Ticket> list() {
47 return ticketClientService.list();
48 }
49
50 /**
51 * 根據id查詢車票信息
52 *
53 * @return
54 */
55 @GetMapping(value = "/get/{id}")
56 @ResponseBody
57 public Ticket get(@PathVariable("id") Integer id) {
58
59 return ticketClientService.get(id);
60 }
61
62 /**
63 * 根據id刪除車票信息
64 *
65 * @return
66 */
67 @GetMapping(value = "/delete/{id}")
68 @ResponseBody
69 public boolean delete(@PathVariable("id") Integer id) {
70 try {
71 ticketClientService.delete(id);
72 return true;
73 } catch (Exception e) {
74 return false;
75 }
76 }
77 }
如今用Fiegn,因此把restTemplate去掉,改爲注入service,調用service方法來實現服務的調用;
第五步:測試負載均衡
啓動3個eureak,在啓動3個服務提供者,最後啓動 feign消費者,訪問
SpringCloudConfig類的myRule,大夥自行修改測試便可;
Feign實戰應用就講到這裏,案例的源碼,你們能夠下載v7版本!