SpringCloud學習筆記2
阿新 • • 發佈:2018-12-27
零.複習
其實,SpringCloud有點與之前學過的WebService相似。
SpringCloud構建專案的微服務框架,就是一個工具集,集Netfilx的開源元件進一步封裝。
Eureka-Server、Eureka-Client、Ribbon
一.Eureka Client的高可用
- 啟動eureka server註冊中心
- 搭建服務的高可用
①準備服務提供者
②注意:同一個服務提供者的叢集,服務的名字必須一致。
③同時向euraka註冊 - 啟動eureka server 啟動多個服務例項即可
二.基於ribbon的負載均衡
Springcloud 中的預設的負載均衡策略是 輪詢策略
restTemplate(類似httpClient協議的通訊框架)+ ribbon元件(負載均衡)
<!--引入ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.0.RELEASE</version>
</dependency>
-
rebbon元件如何進行負載均衡的呢?
當我們發起一個請求,這個請求呼叫服務,先去註冊中心拿服務類表;區別於Dubbo,dubbo是在註冊中心中,在服務提供方,設計了一系列負載均衡策略,當然消費方是可以覆蓋服務方的負載均衡策略。(服務方提供負載均衡策略,消費方可覆蓋服務方 )
Springcloud則不同,其所有的負載均衡均屬”軟負載均衡“。軟負載均衡 — 基於客戶端的負載均衡,與服務端無關。(ribbon是一個基於客戶端的軟負載均衡 )
當我們呼叫某個服務時,客戶端向eureka server請求該服務例項,然後它會把這個服務的服務列表,全部返回給客戶端,並快取起來。(其中,客戶端快取列表會與伺服器進行心跳檢測,遇宕機會高效剔除
所以可以使用@LoadBalanced註解,根據預設負載均衡策略拿到列表中的服務節點。 -
那麼如何修改策略呢?
ribbon中輪詢策略,是基於三大元件
-
ServerList ”用來獲取服務列表“
根據指定的服務名,去拿取註冊中心中的服務列表 -
ServerListFilter ”通過心跳機制,進行服務過濾“
為了保證服務的高可用,對拿到列表中的服務 與 eureka始終做”心跳機制“,去檢測可用服務 -
IRule ”指定負載均衡規則“(修改處 )
拿到可用服務列表後,具體使用哪種負載均衡策略
- RibbonLoadBalancerClient.class 詳情見 Ribbon負載均衡策略
public class RibbonLoadBalancerClient implements LoadBalancerClient {
//serviceId 服務唯一標識,通過get拿到真正的server
public ServiceInstance choose(String serviceId) {
Server server = this.getServer(serviceId);
return server == null ? null : new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
}
//chooseServer 取到ILoadBalancer元件
protected Server getServer(ILoadBalancer loadBalancer) {
return loadBalancer == null ? null : loadBalancer.chooseServer("default");
}
- ILoadBalancer
public interface ILoadBalancer {
//再從這去到BaseLoadBalancer實現類
Server chooseServer(Object var1);
- BaseLoadBalancer.class
public class BaseLoadBalancer extends AbstractLoadBalancer implements PrimeConnectionListener, IClientConfigAware {
//rule 預設RoundRobinRule() 輪詢
private static final IRule DEFAULT_RULE = new RoundRobinRule();
//IRule 的實現類,就是哪些策略
protected IRule rule;
private final Counter createCounter() {
return Monitors.newCounter("LoadBalancer_ChooseServer");
}
public Server chooseServer(Object key) {
if (this.counter == null) {
//輪詢需要計數,好知道哪臺機器是否訪問過
this.counter = this.createCounter();
}
//計的數,自增長
this.counter.increment();
//基於rule規則進行選擇
if (this.rule == null) {
return null;
} else {
try {
return this.rule.choose(key);
} catch (Exception var3) {
logger.warn("LoadBalancer [{}]: Error choosing server for key {}", new Object[]{this.name, key, var3});
return null;
}
}
}
三.使用屬性自定義ribbon客戶端
在application.yml中
HELLO-SERVICE: #服務名,注意要與大小寫一致。(restTemplate.getForObject的url)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #規則要寫全限定名