springcloud負載均衡策略有:1、Ribbon,它是一個基于Netflix Ribbon實現的一套客戶端負載均衡工具;2、Fegin的配置,它是一個聲明式的Web服務客戶端,能夠更加容易編寫Web服務客戶端,只要在api層建設一個接口并添加注解即可。
具體內容如下:
1、Ribbon
是基于Netflix Ribbon實現的一套客戶端 負載均衡的工具,類似Nginx主要功能時提供客戶端的軟件負載均衡算法LB就是負載均衡,集中式(F5),進程內(Nginx),消費者可以自動看從Eureka中拿到對應的服務列表,默認進行輪詢RoundRobinRule
下圖是RestTemplate的自帶的7中均衡策略
我們在之前通過Ribbon+RestTemplate實現調用服務的時候,在獲取RestTemplate的方法上加了@LoadBalanced ,實現默認輪詢,如果需要更改其均衡策略,則在配置類中聲明想要的均衡策略
@Configurationpublic 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)創建消費者層
@RestControllerpublic 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技術,所以也支持負載均衡。
4、在使用Feign的時候其實就是遠程通過調用標注微服務的對應接口(每一個方法上的路徑),來獲取返回值