spring cloud 的eureka 小结

小弟今天本身搭建了一套 基于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这个接口正是用来获取加载后端服务列表。(这么一个名词来作动做,有一点点别扭!)能够看到有这么多加载的方式。

netflix_ribbon_serverlis

看到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并加到服务列表中。

相关文章
相关标签/搜索