ribbon
2021-08-30 14:36:16 0 举报
restemplate底层ribbon处理流程
作者其他创作
大纲/内容
则构建新的requestServiceRequestWrapper重写了getUri(),方法里面使用均衡器重建uri
有
newInterceptingClientHttpRequestFactory
request.execute()
父类BaseLoadBalancer构造器中setupPingTask()10s一次定时ping操作
getServer(loadBalancer)根据负载均衡器,选择一个服务端
此时拿到的server已经包含了ip和端口号
创建普通请求此时的uri已被替换为ip和port
updateListOfServers()更新缓存的在线client
迭代执行interceptor直到执行完
每种服务会有一个定时任务,刷新服务列表allServerList从EurekaClient上拿服务实例列表,是从DiscoveryClient的本地Applications中获取实例列表
clientFactory.getLoadBalancer(serviceId)拿一个负载均衡器
从容器中获取getBean(ILoadbalancer)拿到ZoneAwareLoadBalancer的对象主要逻辑在父类DynamicServerListLoadBalancer
一种服务对应一个spring子容器,没有则创建;创建的子容器会注册其他client对应的IPing配置,IRule配置以及对应的serviceList列表等这里会注册@RibbonClient注解标记的配置类,用于替换原有规则配置
根据是否有ClientHttpRequestInterceptor来创建相应的requestFactory
execute()doExecute()
LoadBalancerRequestFactory创建匿名对象
发送http请求并返回ClientHttpResponse
返回UP状态的实例List<InstanceInfo>
LoadBalancer执行
从EurekaClient上拿服务实例列表eurekaClient.getInstancesByVipAddress()
DynamicServerListLoadBalancer构造器中restOfInit(clientConfig)
几个主要的类SpringClientFactory:创建及缓存每种服务的子容器,并从容器中可以拿到相应的对象(包含负载均衡器等)RibbonLoadBalancerClient:所有负载均衡execute的入口,以及重建uriDynamicServerListLoadBalancer:每种服务对应的负载均衡器类型,管理该client服务列表,以及定时更新服务列表,通过一定的规则rule拿到server
没有
更新到负载均衡器中的serviceList的管理列表中
即执行loadBalancerClient.execute(匿名对象request)
enableAndInitLearnNewServersFeature()里面开启定时任务执行updateListOfServers每30秒执行一次
ribbon通过@LoadBalanced注解使restTemplate对象启用客户端负载均衡组件设计的关键点:拦截器设计,ClientHttpRequestInterceptor通过实现接口ClientHttpRequestExecution执行器,来传递拦截器的执行资源隔离,通过spring子容器来给不同类型服务配置不同的负载均衡策略
RestTemplate中的拦截器ClientHttpRequestInterceptor实现该拦截器,便能拦截request.execute()
结束
使用负载均衡规则Rule选择一个server默认配置的是ZoneAvoidanceRule
创建new InterceptingClientHttpRequest()
在该request真正进行execute时,会调用getUri方法拿到真实ip和port
SimpleClientHttpRequestFactory
内部类InterceptingRequestExecutionexecute(request)
从工厂的缓存中拿spring子容器context,没有则创建
loadBalancer.chooseServer(\"default\")
拿到server实例,调用request.apply(serviceInstance)即执行了匿名对象
createRequest()
restTemplate发起服务调用
该拦截器对象中包含了LoadBalancerClient:真正做负载均衡操作LoadBalancerRequestFactory:创建负载均衡请求对象(这里创建的实际上是一个匿名对象,该对象的方法用于向下一个拦截器执行,即execution.execute(newRequest))execution对象作为衔接所有拦截器的执行器,该对象作为拦截器的参数
获取该服务的服务列表getUpdatedListOfServers
0 条评论
下一页