Feign實現和負載均衡
Feign是一個聲明式WebService客戶端,使用方法是定義一個介面並在上面添加註解即可。Feign支持可拔插式的編碼器和解碼器。
Spring Cloud對Feign進行了封裝,使其支持SpringMVC和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支持負載均衡。
[Feign源碼]: https://github.com/OpenFeign/Feign
使用案例:
1.新建一個Feign模塊,類似之前Ribbon中使用的consume-9001模塊。在依賴信息中加入Feign的依賴;
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>spring-cloud-demo</artifactId>
- <groupId>com.wangcw.springcloud</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>springclouddemo-consume-feign-9002</artifactId>
- <dependencies>
- <!--Feign模塊依賴-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-feign</artifactId>
- </dependency>
- <!-- 自己定義的api -->
- <dependency>
- <groupId>com.wangcw.springcloud</groupId>
- <artifactId>springclouddemo-api</artifactId>
- <version>${project.version}</version>
- </dependency>
- <!-- Ribbon相關 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-eureka</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-ribbon</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-config</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
- </project>
2. 因為Feign開發其實是面向介面編程,所以Feign介面可以放在公共模塊【springclouddemo-api】模塊中供各模塊使用,所以要在【springclouddemo-api】模塊中添加也添加Feign依賴;
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>spring-cloud-demo</artifactId>
- <groupId>com.wangcw.springcloud</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>springclouddemo-api</artifactId>
- <dependencies>
- <!--Feign依賴-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-feign</artifactId>
- </dependency>
- <!--mybatis-->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.3.0</version>
- </dependency>
- <dependency>
- <groupId>tk.mybatis</groupId>
- <artifactId>mapper-spring-boot-starter</artifactId>
- <version>2.0.0</version>
- </dependency>
- <dependency>
- <groupId>javax.persistence</groupId>
- <artifactId>persistence-api</artifactId>
- <version>1.0.2</version>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- </dependencies>
- </project>
3.在公共模塊【springclouddemo-api】中編寫介面,介面上添加@FeignClient註解,並通過value指定作用的微服務名;
- package com.wangcw.service;
- /* 新建Feign介面供各個模塊調用微服務 【SPRINGCLOUDDEMO-PROVIDER-DEPT】*/
- @FeignClient(value = "SPRINGCLOUDDEMO-PROVIDER-DEPT")
- public interface FeignClientService{
- @RequestMapping(value = "/provider/dept/get/{id}", method = RequestMethod.GET)
- Dept get(@PathVariable("id") long id);
- @RequestMapping(value = "/provider/dept/list", method = RequestMethod.GET)
- List<Dept> list();
- }
4.在步驟1中新建的Feign模塊中編寫Controller,並注入FeignClient介面,直接調用service介面中的方法即可(因為聲明Feign介面時已經指定過微服務,所以訪問時會正確地找到微服務)
- @RestController
- @RequestMapping(value = "/consumer")
- public class DeptController_Consumer {
- /* 注入公共模塊中的FeignService */
- @Autowired
- private FeignClientService feignClientService;
- @RequestMapping(value = "/dept/get/{id}")
- public Dept get(@PathVariable("id") Long id) {
- return this.feignClientService.get(id);
- }
- @RequestMapping(value = "/dept/list")
- public List<Dept> list() {
- return this.feignClientService.list();
- }
- }
5.修改Feign模塊的主啟動類,加入@EnableFeignClients註解(主要是掃描公共模塊【springclouddemo-api】中聲明的介面)
- @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
- @EnableEurekaClient
- @EnableFeignClients(basePackages= {"com.wangcw.service"})
- public class DeptConsumer_Feign_9002_App {
- public static void main(String[] args) {
- SpringApplication.run(DeptConsumer_Feign_9002_App.class, args);
- }
- }
6.啟動訪問測試,會發現訪問時帶有輪詢機制的負載均衡。
(原理:其實就是類似於在公共工程api中加入Service介面,在介面中利用@FeignClient註解去調用對應的服務暴露的方法。
所有需要調用註冊的服務的類都直接去調用api中的service,即相當於是在調用對應的在線服務了)
總結:
- Feign通過介面方法調用REST服務,在Eureka中查找對應的服務
- Feign集成了Ribbon技術,所以也支持負載均衡(輪詢)
※基於SSH的航空公司票務機票預訂管理系統(前台以及後台)
※base64加密的解密
TAG:程序員小新人學習 |