前言:
之前寫了通過Ribbon+RestTemplate實現調用服務,此處我再系統的說一下兩者的區別
一、springcloud的負載均衡策略
1、Ribbon
主要功能時提供客戶端的軟件負載均衡算法LB就是負載均衡,集中式(F5),進程內(Nginx),消費者可以自動看從Eureka中拿到對應的服務列表,默認進行輪詢RoundRobinRule
下圖是RestTemplate的自帶的7中均衡策略
我們在之前通過Ribbon+RestTemplate實現調用服務的時候,在獲取RestTemplate的方法上加了@LoadBalanced ,實現默認輪詢,如果需要更改其均衡策略,則在配置類中聲明想要的均衡策略
具體實現參考:https://www.cnblogs.com/guanyuehao0107/p/11819375.html
@Configuration public class RestConfig { @Bean //通過RestTemplate來實現調用接口 @LoadBalanced //表示RestTemplate開啟了負載均衡 public RestTemplate getRestTemplate(){ return new RestTemplate(); } //重新創建一個均衡策略,表示不使用默認 @Bean public IRule getIReule(){ //通過獲取一個IRule對象, return new RandomRule(); //達到的目的,用我們重新選擇的隨機,替代默認的輪訓方式 } }
2、消費者controller層
//聲明一個接口 // private static final String HTTP_NAME = "http://localhost:8001/product/"; private static final String HTTP_NAME = "http://MICROSERVICE-PRODUCT"; @Autowired private RestTemplate restTemplate; @Resource private DiscoveryClient client; //我這個微服務想要被別人去發現 @GetMapping("/consum/find/{id}") public User findone(@PathVariable("id")Integer id){ String url = HTTP_NAME+"/product/findone/"+id; return (User) restTemplate.getForObject(url,User.class); } @GetMapping("/consum/findAll") public List<User> getAll(){ List<User> users = restTemplate.getForObject(HTTP_NAME + "/product/list", List.class); return users; }
2、Fegin的配置
Feign是一個聲明式的Web服務客戶端,使得編寫Web服務客戶端變得非常容易,在api層只需要創建一個接口,然后在上面添加注解即可
步驟如下:
1、導入依賴,創建接口的微服務,以及消費者微服務都需要引入
<!-- Feign依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.0.RELEASE</version> </dependency>
2、創建消費者層
@RestController public class Usercontroller {
@Resource //調用的是API層的接口 private UserService userService;
@GetMapping("/consum/find/{id}") public User findone(@PathVariable("id")Integer id){ return userService.findById(id); } @GetMapping("/consum/findAll") public List<User> getAll(){ return userService.findAll(); } }
3、在消費者的模塊的啟動類上加上 @EnableFeignClients(basePackages = {"com.ghh"}) //掃描另外一個Feign的接口
@SpringBootApplication @EnableEurekaClient @EnableFeignClients(basePackages = {"com.ghh"}) //掃描另外一個Feign的接口 public class ConsumStart_Feign { public static void main(String[] args) { SpringApplication.run(ConsumStart_Feign.class,args); } }
4、在api層要創建一個接口,以及加上一個注解@FeignClient(value = "MICROSERVICE-PRODUCT"),表名調用的提供者或者服務名稱
@FeignClient(value = "MICROSERVICE-PRODUCT") public interface UserService { @GetMapping("/product/findone/{id}") public User findById(@PathVariable("id") Integer id); @GetMapping("/product/list") public List<User> findAll(); }
三、Ribbon+RestTemplate和Feign的區別
1、實際開發中,對服務依賴的調用可能不止一處,往往一個接口會被多處調用,如果使用Ribbon+RestTemplate,就需要在每一個模塊都要創建一個配置類,而且,各社區中javaweb也傾向於面向接口編程
2、通常針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的調用,所以,Feign在此基礎上做了進一步封裝,在Feign的實現下,我們只需要創建一個接口並使用注解的方式來配置它(以前是Dao接口上面標注Mapper注解,現在是一個微服務接口上面標注一個Feign注解即可),完成對服務提供方的接口綁定
3、使用Feign是通過接口的方法調用Rest服務,該請求發送給Eureka服務器,通過Feign直接找到服務接口。Feign融合了Ribbon技術,所以也支持負載均衡。