小弟今天本身搭建了一套 基于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并加到服务列表中。