當前位置:
首頁 > 知識 > Feign實現和負載均衡

Feign實現和負載均衡

Feign是一個聲明式WebService客戶端,使用方法是定義一個介面並在上面添加註解即可。Feign支持可拔插式的編碼器和解碼器。

Spring Cloud對Feign進行了封裝,使其支持SpringMVC和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支持負載均衡。

[Feign源碼]: https://github.com/OpenFeign/Feign

使用案例:

1.新建一個Feign模塊,類似之前Ribbon中使用的consume-9001模塊。在依賴信息中加入Feign的依賴;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>spring-cloud-demo</artifactId>
  7. <groupId>com.wangcw.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>springclouddemo-consume-feign-9002</artifactId>
  12. <dependencies>
  13. <!--Feign模塊依賴-->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-feign</artifactId>
  17. </dependency>
  18. <!-- 自己定義的api -->
  19. <dependency>
  20. <groupId>com.wangcw.springcloud</groupId>
  21. <artifactId>springclouddemo-api</artifactId>
  22. <version>${project.version}</version>
  23. </dependency>
  24. <!-- Ribbon相關 -->
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-eureka</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-starter-ribbon</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.cloud</groupId>
  35. <artifactId>spring-cloud-starter-config</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-web</artifactId>
  40. </dependency>
  41. </dependencies>
  42. </project>

2. 因為Feign開發其實是面向介面編程,所以Feign介面可以放在公共模塊【springclouddemo-api】模塊中供各模塊使用,所以要在【springclouddemo-api】模塊中添加也添加Feign依賴;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>spring-cloud-demo</artifactId>
  7. <groupId>com.wangcw.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>springclouddemo-api</artifactId>
  12. <dependencies>
  13. <!--Feign依賴-->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-feign</artifactId>
  17. </dependency>
  18. <!--mybatis-->
  19. <dependency>
  20. <groupId>org.mybatis.spring.boot</groupId>
  21. <artifactId>mybatis-spring-boot-starter</artifactId>
  22. <version>1.3.0</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>tk.mybatis</groupId>
  26. <artifactId>mapper-spring-boot-starter</artifactId>
  27. <version>2.0.0</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>javax.persistence</groupId>
  31. <artifactId>persistence-api</artifactId>
  32. <version>1.0.2</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. </dependency>
  38. </dependencies>
  39. </project>

3.在公共模塊【springclouddemo-api】中編寫介面,介面上添加@FeignClient註解,並通過value指定作用的微服務名;

  1. package com.wangcw.service;
  2. /* 新建Feign介面供各個模塊調用微服務 【SPRINGCLOUDDEMO-PROVIDER-DEPT】*/
  3. @FeignClient(value = "SPRINGCLOUDDEMO-PROVIDER-DEPT")
  4. public interface FeignClientService{
  5. @RequestMapping(value = "/provider/dept/get/{id}", method = RequestMethod.GET)
  6. Dept get(@PathVariable("id") long id);
  7. @RequestMapping(value = "/provider/dept/list", method = RequestMethod.GET)
  8. List<Dept> list();
  9. }

4.在步驟1中新建的Feign模塊中編寫Controller,並注入FeignClient介面,直接調用service介面中的方法即可(因為聲明Feign介面時已經指定過微服務,所以訪問時會正確地找到微服務)

  1. @RestController
  2. @RequestMapping(value = "/consumer")
  3. public class DeptController_Consumer {
  4. /* 注入公共模塊中的FeignService */
  5. @Autowired
  6. private FeignClientService feignClientService;
  7. @RequestMapping(value = "/dept/get/{id}")
  8. public Dept get(@PathVariable("id") Long id) {
  9. return this.feignClientService.get(id);
  10. }
  11. @RequestMapping(value = "/dept/list")
  12. public List<Dept> list() {
  13. return this.feignClientService.list();
  14. }
  15. }

5.修改Feign模塊的主啟動類,加入@EnableFeignClients註解(主要是掃描公共模塊【springclouddemo-api】中聲明的介面)

  1. @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
  2. @EnableEurekaClient
  3. @EnableFeignClients(basePackages= {"com.wangcw.service"})
  4. public class DeptConsumer_Feign_9002_App {
  5. public static void main(String[] args) {
  6. SpringApplication.run(DeptConsumer_Feign_9002_App.class, args);
  7. }
  8. }

6.啟動訪問測試,會發現訪問時帶有輪詢機制的負載均衡。

(原理:其實就是類似於在公共工程api中加入Service介面,在介面中利用@FeignClient註解去調用對應的服務暴露的方法。

所有需要調用註冊的服務的類都直接去調用api中的service,即相當於是在調用對應的在線服務了)

總結:

- Feign通過介面方法調用REST服務,在Eureka中查找對應的服務

- Feign集成了Ribbon技術,所以也支持負載均衡(輪詢)

Feign實現和負載均衡

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

基於SSH的航空公司票務機票預訂管理系統(前台以及後台)
base64加密的解密

TAG:程序員小新人學習 |