feign是聲明式的web service客戶端,它讓微服務之間的調用變得更簡單了,相似controller調用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign時提供負載均衡的http客戶端java
Feign本質上是對Ribbon作了集成封裝, 至關於加了一層, 更加符合開發者面向接口和註解的編程習慣, 免去了RestTemplate的配置, 這樣同時不可避免的帶來了性能的損失web
在API中提供Feign的接口spring
<!--Feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.6.RELEASE</version> </dependency>
package com.wang.springcloud.service; import com.wang.springcloud.pojo.Dept; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; //value爲微服務的名稱 @FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT") @Service public interface DeptClientService { @GetMapping("/dept/get/{id}") Dept queryById(@PathVariable("id") Long id); @GetMapping("/dept/list") List<Dept> queryAll(); @PostMapping("/dept/add") Boolean addDept(Dept dept); }
注意編程
咱們首先依據SpringCloud-consumer-dept-8080建立了利用Feign作負載均衡的Moduleapp
一樣的, 依賴只須要將Ribbon替換爲Feign負載均衡
<!--Feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.6.RELEASE</version> </dependency>
package com.wang.springcloud.controller; import com.wang.springcloud.pojo.Dept; import com.wang.springcloud.service.DeptClientService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; @ApiModel("Consumer Controller") @RestController public class DeptConsumerController { @Autowired private DeptClientService service = null; @ApiOperation("經過部門編號查詢一個部門") @RequestMapping(value = "/consumer/dept/get/{id}", method = RequestMethod.GET) public Dept get(@PathVariable("id") @ApiParam("部門編號") Long id) { return this.service.queryById(id); } @ApiOperation("經過部門名稱添加一個部門") @RequestMapping(value = "/consumer/dept/add", method = RequestMethod.POST) public boolean add(@ApiParam("部門的名稱") Dept dept){ return this.service.addDept(dept); } @ApiOperation("查詢所有的部門") @RequestMapping(value = "consumer/dept/list", method = RequestMethod.GET) public List<Dept> list() { return this.service.queryAll(); } }
注意dom
package com.wang.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; //Ribbon 和 Eureka 整合之後, 客戶端能夠直接調用, 不用關心IP地址和端口號 @SpringBootApplication @EnableEurekaClient //開啓Feign客戶端支持 @EnableFeignClients public class FeignDeptConsumer_8080 { public static void main(String[] args) { SpringApplication.run(FeignDeptConsumer_8080.class, args); } }
Feign因爲封裝了Ribbon, 只是更加貼近JAVA的面向接口和註解編程的習慣, 所以, 自定義和更改負載均衡策略與Ribbon一致, 依然是註冊IRule接口ide
當自定義策略與SpringBoot主啓動類不在同一級時, 使用@RibbonClient註解中的configuration屬性指定配置類微服務
下面是在Feign配置負載均衡黑隨機方式的配置類性能
package com.wang.springcloud.config; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ConfigBean { @Bean public IRule myRule() { return new RandomRule(); } }