小弟今天本身搭建了一套 基於spring cloud 的分佈式使用自帶eureka 和ribbon工具spring
首先使用spring boot搭建了一個eureka 的服務註冊中心,有搭建了兩個provider 並註冊到註冊中內心後端
相關搭建網上都有教程,以後搭建一個consumer,要集成ribbon服務器
spring-cloud-starter-ribbon
同時也註冊進中心中,ribbon會 獲取可用 的provider的相關數據,產生輪詢結果,進行輪詢。通過測試每次訪問都會請求不一樣的provider至關棒!併發
以後又查了一些相關知識點。已作備份負載均衡
一、開啓一下註解能夠將應用變動爲eureka註冊服務器框架
@EnableEurekaServer
二、開啓如下註解,能夠將此應用註冊到 eureka服務器並發現服務,provider和consumer均可以用分佈式
@EnableDiscoveryClient/
Ribbon是一種客戶端的負載均衡,本質上是跑在服務消費者的進程裏。服務消費者要訪問服務時,經過ribbon向一個服務註冊的列表查詢,而後以配置的負載均衡策略選擇一個後端服務發起請求。ide
前面 ribbon的實現 ,講到LB的定義的兩個主要方法,分別是後端服務相關的調用:工具
public void addServers(List<Server> newServers); public List<Server> getServerList(boolean availableOnly);
在netflix中這個服務註冊列表其實就是eureka服務端集中管理的註冊服務列表。獲取這個列表應該就是是經過eureka的client來完成的。測試
也就是ribbon中應該在某個地方集成了eureka client來維護服務列表。這裏嘗試追蹤細這個過程,確認下猜測。
ribbon的實現 的繼承圖上能夠看到除了介紹的基本實現LoadBalancer外,還有DynamicServerListLoadBalancer的實現,能夠動態的加載後端服務列表。正如名所示,能夠動態的加載後端的服務列表。
DynamicServerListLoadBalancer中使用一個ServerListRefreshExecutorThread任務線程按期的更新後端服務列表。
class ServerListRefreshExecutorThread implements Runnable { public void run() { updateListOfServers(); } } public void updateListOfServers() { servers = serverListImpl.getUpdatedListOfServers(); updateAllServerList(servers); }
實際上是經過com.netflix.loadbalancer.ServerList.getUpdatedListOfServers() 方法加載後端服務列表。ServerList這個接口正是用來獲取加載後端服務列表。(這麼一個名詞來作動做,有一點點彆扭!)能夠看到有這麼多加載的方式。
看到ConfigurationBasedServerList是從配置中(能夠是經過Archaius這樣的集中配置)加載的。 而DiscoveryEnabledNIWSServerList這個實現中包含DiscoveryEnabled猜測應該就是服務發現框架裏的服務吧。看進去果真是經過eureka client 從eureka server獲取服務列表進而在ribbon中能夠動態的加載。 從聲明
public class DiscoveryEnabledNIWSServerList extends AbstractServerList<DiscoveryEnabledServer>{
能看到管理的服務不是通常的服務,是DiscoveryEnabledServer的服務。觀察List<DiscoveryEnabledServer> com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList.obtainServersViaDiscovery() 的實現能夠了解整個過程。
private List<DiscoveryEnabledServer> obtainServersViaDiscovery() { List<DiscoveryEnabledServer> serverList = new ArrayList<DiscoveryEnabledServer>(); DiscoveryClient discoveryClient = DiscoveryManager.getInstance().getDiscoveryClient(); if (vipAddresses!=null){ for (String vipAddress : vipAddresses.split(「,」)) { // if targetRegion is null, it will be interpreted as the same region of client List<InstanceInfo> listOfinstanceInfo = discoveryClient.getInstancesByVipAddress(vipAddress, isSecure, targetRegion); for (InstanceInfo ii : listOfinstanceInfo) { if (ii.getStatus().equals(InstanceStatus.UP)) { DiscoveryEnabledServer des = new DiscoveryEnabledServer(ii, isSecure, shouldUseIpAddr); des.setZone(DiscoveryClient.getZone(ii)); serverList.add(des); } } return serverList; }
能夠看到就是經過一個com.netflix.discovery.EurekaClient做爲一個句柄來獲取eureka中註冊的服務列表。獲取活的服務,並根據instanceInfo 構形成ribbon須要的DiscoveryEnabledServer並加到服務列表中。