html
一.Feign是什麼java
Feignnginx
二.Feign能作什麼git
Feign旨在編寫Java Http客戶端更加容易。github
web
Feign集成了Ribbonspring
利用Ribbon維護了MicroServiceCloud-Dept的服務列表信息,而且經過輪詢實現了客戶端的負載均衡。而與Ribbon不一樣的是,apache
Feign經過接口的方法調用Rest服務(以前是Ribbon+RestTemplate),該請求發送給Eureka服務器(http://MICROSERVICE-DEPT/dept/list),經過feign直接找到服務接口,因爲在進行服務調用的時候融合了Ribbon技術,因此也支持負載均衡。後端
api
修改microservice-api項目
pom文件修改:
<?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>microservice</artifactId> <groupId>com.wang.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservice-api</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- Feign相關 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> </project>
package com.wang.springcloud.service; import com.wang.springcloud.entities.Dept; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.util.List; /** * * @Description: 修改microservicecloud-api工程,根據已經有的DeptClientService接口 新建 一個實現了FallbackFactory接口的類DeptClientServiceFallbackFactory * @author * @date */ @FeignClient(value = "MICROSERVICE-DEPT") //@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class) 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); }
上述工做完成後,使用clean,package從新打包成jar,方便其餘項目調用。
<?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>microservice</artifactId> <groupId>com.wang.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservice-consumer-dept-feign</artifactId> <dependencies> <dependency><!-- 本身定義的api --> <groupId>com.wang.springcloud</groupId> <artifactId>microservice-api</artifactId> <version>${project.version}</version> </dependency> <dependency><!-- Feign相關 --> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </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> <!-- 修改後當即生效,熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
@RestController public class DeptController { @Autowired private DeptClientService service; @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); } }
四.
Nginx 基於C語言,快速,性能高5w/s。
Redis 5w/s,RibbatMQ 1.2w/s ApacheActiveMQ 0.6w/s 業務系統,kafka 20w~50w/s大數據,Zuul2.0 200w/s
負載均衡、反向代理,代理後端服務器。隱藏真實地址,防火牆,不能外網直接訪問,安全性較高。屬於服務器端負載均衡。既請求由 nginx 服務器端進行轉發。
Ribbon 是從 eureka 註冊中心服務器端上獲取服務註冊信息列表,緩存到本地,而後在本地實現輪詢負載均衡策略。
既在客戶端實現負載均衡。
應用場景的區別:
Nginx 適合於服務器端實現負載均衡 好比 Tomcat ,Ribbon 適合與在微服務中 RPC 遠程調用實現本地服務負載均衡,好比Dubbo、SpringCloud 中都是採用本地負載均衡。
Feign 是一個聲明web服務客戶端, 這便得編寫web服務客戶端更容易Spring Cloud Netflix 的微服務都是以 HTTP 接口的形式暴露的,因此能夠用 Apache 的 HttpClient 或 Spring 的 RestTemplate 去調用,而 Feign 是一個使用起來更加方便的HTTP 客戶端,使用起來就像是調用自身工程的方法,而感受不到是調用遠程方法。
Feign包含了Ribben,有時候有的項目會2個技術一塊兒用在該項目中是由於Feign是遠程調用的,Ribbon是作負載均衡的。