springcloud
文章平均质量分 69
spring cloud 一代与二代学习
欢谷悠扬
这世上有一种英雄主义,那就是看清了生活的真相,依然热爱生活
展开
-
Feign之远程JDK代理对象请求发送链路追踪(三)
1.前言从第一篇和第二篇中,可以看到Feign最终会为每个带有@FeignClient注解的interface生成一个JDK代理对象。那么在在通过feign进行远程调用时,一定会走到这个类的invoke方法中去。所以接下来我们探究一下invoke方法究竟在干什么~~2.FeignInvocationHandler的invoke方法@Override public Object invoke(Object proxy, Method method, Object[] args) throw原创 2021-07-23 16:54:36 · 463 阅读 · 1 评论 -
Feign基于注解@EnableFeignClients的JDK动态代理对象创建流程(二)
1.说明这是对上一篇文章的绘图总结,大致内容为基于@EnableFeignClients如何推导到每个被@FeignClient注解的接口的JDK代理对象的创建过程。这里面涉及到两个Spring的组件:一个是ClassPathScanningCandidateComponentProvider,专门进行包扫描,然后根据注解类型进行过滤并生成对应的BeanDefinition的组件扫描器还有一个是FactoryBeanRegistrySupport,这个专门对FacotryBean的子类进行getOb原创 2021-07-21 11:22:21 · 298 阅读 · 0 评论 -
Feign之EnableFeignClients引发的初步探索(一)
背景(可以略过的废话)前段时间一个朋友在做spring security相关配置时遇到一些问题,请我帮忙解决一些问题,由于我自身并没有使用过security,所以花了一段时间去学习spring security的使用和解析了一下spring security源码。时至今日,终于可以再次重新开始学习spring cloud相关的内容了~1.@EnableFeignClients注解的默认配置1.1 basePackages扫描@FeignClient注解的包路径,扫描这些包下的所有类,获取被@F原创 2021-07-20 20:28:46 · 5549 阅读 · 3 评论 -
Ribbon之IRule 负载均衡策略详解
1.IRule家族2.RoundRobinRule 轮询策略2.1 核心方法解读private AtomicInteger nextServerCyclicCounter;public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { log.warn("no load balancer"); return null; }原创 2021-06-16 14:29:17 · 1922 阅读 · 0 评论 -
Ribbon之ZoneAwareLoadBalancer及其父类做了些什么?
1.看看ZoneAwareLoadBalancer都做了些什么?这个类主要是跟Zone有关的,提供了跟zone有关的方法。但是在国内基本上用不上。eureka提供了region和zone两个概念来进行分区,这两个概念均来自于亚马逊的AWS:region:可以简单理解为地理上的分区,比如亚洲地区,或者华北地区,再或者北京等等,没有具体大小的限制。根据项目具体的情况,可以自行合理划分region。zone:可以简单理解为region内的具体机房,比如说region划分为北京,然后北京有两个机房,就可以原创 2021-06-15 15:28:02 · 1057 阅读 · 0 评论 -
Ribbon 如何获取默认的ZoneAwareLoadBalancer?
1.ILoadBalancer家族2.ZoneAwareLoadBalancer是在哪声明的呢?从前面几篇中可以看到我调试时使用的默认的LoadBalancer是ZoneAwareLoadBalancer,那它在哪声明的呢?在org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration 中至于RibbonClientConfiguration 如何加载的就细说了,在Ribbon自动注入时,有初始化一个SpringCli原创 2021-06-15 14:02:24 · 315 阅读 · 0 评论 -
Ribbon之LoadBalancerClient、ZoneAwareLoadBalancer 、ZoneAvoidanceRule默认三剑客
1.RibbonLoadBalancerClient之承上在ribbon中LoadBalanceClient 只有一个子类,这个子类就是RibbonLoadBalancerClient。它从LoadBalancerInterceptor接过请求,进入真正的负载均衡流程。2.RibbonLoadBalancerClient做了些啥?获取负载均衡器ILoadBalancer根据负载均衡器和规则选择服务(chooseServer)记录每个serviceId的状态 RibbonStatsRecor原创 2021-06-11 16:05:15 · 1405 阅读 · 1 评论 -
Ribbon如何拦截到restTemplate?(三)
1.LoadBalancerAutoConfiguration自动装配下的初始化上面这段代码主要做了两件事:初始化拦截器 LoadBalancerInterceptor初始化Restemplate定制化器RestTemplateCustomizer ,而这个东西就是用来将拦截器加入到restTemplate拦截器中去。2. 那何时使用了RestemplateCustomizer去初始化RestTemplate呢?这里其实看到这个返回类的时候有点懵逼,这个匿名类SmartInitiali原创 2021-06-10 20:09:11 · 412 阅读 · 1 评论 -
Ribbon 基于restTemplate如何处理请求大致流程(二)
1.背景在研究玩自动装配后,我搭了个demo,总共三个eureka server构成集群,然后两个服务提供者provider,一个consumer。在上一章简单了解自动装配的内容后,现在看看restTemplate是如何一步步走到ribbon的负载均衡器的。// 这里是直接处理了默认的restTemplate@Bean@LoadBalancedRestTemplate restTemplate(){ return new RestTemplate();}@GetMapping("/h原创 2021-06-10 16:43:27 · 375 阅读 · 0 评论 -
Ribbon之自动装配下ribbon做了些什么?(一)
1.前言在springboot的自动装配原理上,我们知道要使用一个组件,那么先去找spring.factories ,所以这里我们直接开始看spring-cloud-netflix-ribbon-2.1.0 的spring.factories 文件2.RibbonAutoConfiguration 源码简读@Configuration// 这个是判断条件的集合,只有RibbonClassesConditions里面的条件都满足了才能实例化这个配置类// 到spring 容器中去@Condit原创 2021-06-10 16:36:24 · 379 阅读 · 0 评论 -
eureka 源码解析用几张图收个尾
一、eureka server 与 eureka client 的交互关系二、eureka server 启动流程(eureka Netflix 原生源码)三、eureka server的三级缓存四、eureka server 与 eureka client 功能图五、小结eureka 在看完之后,其实会发现它有一些问题存在的。其中最大的问题就是信息延迟。如果使用tcp长链接来做的话,会有更好的效果。...原创 2021-06-08 11:16:26 · 105 阅读 · 0 评论 -
spring cloud eureka client 启动分析
1.自动装配原则下client加载配置类简单描述:1.EurekaClientConfigServerAutoConfiguration :如果配置服务器和eureka 实例在同一个服务上,这里需要处理一下服务实例的元数据信息2.EurekaDiscoveryClientConfigServiceAutoConfiguration:eureka 与 配置中心的联合使用处理3.EurekaClientAutoConfiguration:eureka client 服务启动的核心4.RibbonEu原创 2021-06-04 07:41:09 · 801 阅读 · 1 评论 -
【源码】spring cloud eureka server 对eureka server的封装与优化
1.自动装配原则在pom中引入spring-cloud-starter-netflix-eureka-server,在idea 右边的maven插件的dependencies中可以查看到spring-cloud-starter-netflix-eureka-server 依赖了哪些内容。<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-c原创 2021-06-02 10:27:53 · 200 阅读 · 1 评论 -
【源码】eureka server 响应服务下线过程解析
1.源码定位方法:com.netflix.eureka.resources.InstanceResource#cancelLease源码版本:v1.7.x源码地址:https://github.com/Netflix/eureka/tree/v1.7.x2. 源码解析protected boolean internalCancel(String appName, String id, boolean isReplication) { try { read原创 2021-05-28 16:53:42 · 147 阅读 · 0 评论 -
【源码】eureka server接受心跳信息过程解析
1.源码定位eureka server 接收服务器请求的处理方法为:com.netflix.eureka.resources.InstanceResource#renewLease源码版本: v1.7x源码地址:https://github.com/Netflix/eureka/tree/v1.7.x2.请求处理流程从eureka server的注册表 registery中获取服务列表 registry.get(appName);判断服务实例是否存在 leaseToRenew ,不存在则原创 2021-05-28 15:57:06 · 198 阅读 · 0 评论 -
【源码】eureka server 响应拉取注册表过程解析
1.拉取注册表的流程判断eureka server 是否准备好接收请求shouldAllowAccess生成三级缓存的keyKey cacheKey =newKey(Key.EntityType.Application, ResponseCacheImpl.ALL_APPS, keyType, CurrentRequestVersion.get(), EurekaAccept.fromString(eurekaAccept), regions);读取缓存原创 2021-05-28 11:48:06 · 234 阅读 · 0 评论 -
【源码】eureka的 三级缓存之设计探索
1.三级缓存是哪三级?第一级: 是多个缓存的总称eureka server 全量注册表 com.netflix.eureka.registry.AbstractInstanceRegistry#registry 是一个ConcurrentHashMap<String, Map<String, Lease>> 对象。eureka server 增量注册表 recentlyChangedQueue 这是一个ConcurrentLinkedQueue对象。getApplica原创 2021-05-28 11:18:01 · 879 阅读 · 0 评论 -
【源码】eureka 如何开启自我保护机制?
1. 背景 我们都知道自我保护机制,都知道15分钟,85%的心跳阈值,那么这是如何计算的?源码中怎么体现的呢?今天来研究一下~2.进入自我保护的模式的判断public boolean isLeaseExpirationEnabled() { // eureka server自我保护功能是否已经过期 if (!isSelfPreservationModeEnabled()) { // The原创 2021-05-27 15:34:32 · 479 阅读 · 0 评论 -
(源码) eureka server 接收服务注册过程解析
1. 源码定位方法:com.netflix.discovery.InstanceInfoReplicator源码版本: v1.7x源码地址:https://github.com/Netflix/eureka/tree/v1.7.x2.一切的开始InstanceInfoReplicator2.1 线程任务InstanceInfoReplicator初始化与启动eureka server想要接受请求,首先得有客户端发送。而在DiscoveryClient 初始化过程中创建了InstanceInf原创 2021-05-26 11:08:01 · 366 阅读 · 1 评论 -
(源码)eureka server启动流程图总览(非spring cloud eureka server启动流程)
1.背景看了一个多星期的源码,今天来对eureka server原生启动流程进行流程图总绘。这个跟spring cloud eureka server的启动流程不相同,spring cloud eureka 对eureka server原生做了一些重写(应该是看不下去了,小问题挺多)。源码版本: v1.7x源码地址:https://github.com/Netflix/eureka/tree/v1.7.x2.图来...原创 2021-05-25 07:40:42 · 205 阅读 · 1 评论 -
eureka 之如何从eureka server全量或增量拉取服务实例注册表?
1.源码定位com.netflix.discovery.DiscoveryClient#fetchRegistry 这个方法是用于从eureka服务端拉取服务信息使用的,那么拉取的流程是怎样的呢?我们先简单的读一下源码源码版本: v1.7x源码地址:https://github.com/Netflix/eureka/tree/v1.7.x2. 源码简读private boolean fetchRegistry(boolean forceFullRegistryFetch) { S原创 2021-05-21 16:24:13 · 929 阅读 · 0 评论 -
eureka 增量更新模式下如何保证eureka server注册表和本地注册表一致?
1.源码定位方法:com.netflix.discovery.DiscoveryClient#getAndUpdateDelta源码版本: v1.7x源码地址:https://github.com/Netflix/eureka/tree/v1.7.x2.源码解析private void getAndUpdateDelta(Applications applications) throws Throwable { // 版本控制 long currentUpdate原创 2021-05-21 15:21:32 · 289 阅读 · 0 评论 -
eureka之服务器注册表与本地注册表不一致检查的源码Bug
1.源码定位方法:com.netflix.discovery.shared.Applications#getReconcileMapDiff作用: 检查本地缓存的注册表和eureka 服务器注册表不一致的地方版本: 1.7.xgithub: https://github.com/Netflix/eureka/tree/v1.7.x2.源码简单解析public Map<String, List<String>> getReconcileMapDiff(Applicatio原创 2021-05-21 15:00:41 · 360 阅读 · 0 评论 -
eureka 巧妙的EurekaHttpClient工厂设计与请求发送过程
1.背景在研究从eureka server拉取服务注册信息列表时,源码阅读到拉取全量列表时,需要调用EurekaHttpClient进行。方法:com.netflix.discovery.DiscoveryClient#getAndStoreFullRegistry疑惑代码:eurekaTransport.queryClient.getApplications(remoteRegionsRef.get()) 这里的queryClient返回的竟然不是JerseyApplicationClient而是原创 2021-05-21 10:31:02 · 659 阅读 · 0 评论 -
eureka之ApplicationInfoManager管理实例
1.前言在上一节《eureka之InstanceInfo单例管理器》中,EurekaConfigBasedInstanceInfoProvider对InstanceInfo进行初始化了,但是由于是通过new EurekaConfigBasedInstanceInfoProvider(config).get()来实现的,而创建出来的EurekaConfigBasedInstanceInfoProvider对象,并没有被管理起来,所以无法通过EurekaConfigBasedInstanceInfoProv原创 2021-05-19 16:37:25 · 554 阅读 · 0 评论 -
eureka client 刷新服务信息缓存CacheRefreshThread
这个类的主要作用就是从eureka server 去拉取信息,然后刷新本地的注册表(服务变化的感知)1.核心源码定位class CacheRefreshThread implements Runnable { public void run() { refreshRegistry(); }}核心方法:com.netflix.discovery.DiscoveryClient#refreshRegistry2.核心源码void refreshRegistry()原创 2021-05-19 16:33:02 · 999 阅读 · 0 评论 -
eureka之如何通过schdule来进行周期性执行心跳检查和缓存刷新
1.遭遇线程池套娃1.schduler线程池提交TimedSupervisorTask线程任务2.TimedSupervisorTask 向heartbeatExecutor线程池 提交HeartbeatThread线程任务总结:线程池里的线程向另一个线程池提交线程,嗯套娃2.源代码定位在DiscoveryClient初始化过程中在 com.netflix.discovery.DiscoveryClient#initScheduledTasks 方法中有一下一块代码 scheduler.s原创 2021-05-19 15:09:31 · 445 阅读 · 0 评论 -
eureka之InstanceInfo单例管理器
1.好味道源码定位在com.netflix.eureka.EurekaBootStrap#initEurekaServerContext 方法中,通过new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get() 方法来获取InstanceInfo单例。这个类主要是为Guice轻量级依赖注入使用。通过上面这种new 出来的只能保证单个EurekaConfigBasedInstanceInfoProvider对象内的InstanceInf原创 2021-05-18 20:36:52 · 403 阅读 · 3 评论 -
SpringCloud-Eureka客户端启动(9)
一.自动装配→一切的起点1.spring.factories在SpringCloud中,一切是基于SpringBoot构建的,而想要管理spring或者被spring管理,那都离不开自动装配。而自动装配离不开spring.factories 。org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.cloud.netflix.eureka.config.EurekaClientConfig原创 2020-11-24 15:08:01 · 405 阅读 · 0 评论 -
SpringCloud-Eureka服务端之续约接口(8)
服务续约的作用所谓的续约,其实不过一种健康检查的叫法,就是客户端告诉服务器端,我还活着。无论是zookeeper,nacos,eureka,还是各种监控系统,都存在着向服务器发送特殊信息标识自己依然存活,避免被剔除的命运。服务续约基于第七篇中注册接口的寻找方法,我们可以在Resource类中找到com.netflix.eureka.resources.InstanceResource#renewLease 续约接口1.续约接口基本解析通过下面一顿注解可以发现,主要在做两件事:1.交给org.原创 2020-11-23 15:41:17 · 441 阅读 · 0 评论 -
SpringCloud-Eureka服务端之注册接口(7)
一.服务注册接口1.前景回顾SpringCloud-Eureka服务端如何给客户端提供服务?在上一篇中,讲述了Eureka如何提供服务,且Jesery如何拦截请求,并进行url解析的过程。最后找到了具体业务处理的位置。今天尝试来捋一下在Eureka诸多接口之中的注册接口com.netflix.eureka.resources.ApplicationResource#addInstance2.基本代码解读com.netflix.eureka.resources.ApplicationResourc原创 2020-11-22 22:33:31 · 1226 阅读 · 0 评论 -
SpringCloud-Eureka服务端如何给客户端提供服务?(6)
一.服务端为客户端提供哪些功能?服务注册拉取服务列表心跳检查集群服务节点批量复制其他服务节点信息查询实例信息服务器状态复写更新节点信息(续约)更新客户端元数据信息取消续约这些功能可以在PeerReplicationResource类和其同包下的类中找到,具体如何提供的,下面开始分析具体流程二.提供方式1.Eureka与客户端的沟通:Jersey在Eureka中,是通过Jersey提供Restful接口来为客户端提供服务的至于Jersey是啥:传送门2.Jersey在哪里引入原创 2020-11-18 18:13:37 · 661 阅读 · 1 评论 -
SpringCloud-Eureka服务端集群如何同步(5)
一.起源1.前景回顾SpringCloud-Eureka服务端启动过程源码分析(4)在上一篇中,我们解析了Eureka服务端启动过程。其中第五点涉及到服务器端集群同步问题我们并没有进行深入了解,在这里,我们将进行一次探索。// 获取集群中的其他节点,注册到当前节点上int registryCount = this.registry.syncUp();二.集群同步1.为什么要进行集群同步首先,我们需要知道Eureka为什么要集群?Eureka使用集群的目的是为了实现负载均衡+高可用。作为微原创 2020-11-17 23:29:40 · 1375 阅读 · 0 评论 -
SpringCloud-Eureka服务端启动过程源码分析(4)
1.入口EurekaServerAutoConfiguration在第一节中,我们在启动类中使用EnableEurekaServer 标注该项目为Eureka注册中心服务端,而该类是在org.springframework.cloud:spring-cloud-netflix-eureka-server依赖包下,那么根据springboot 的自动装配原理 ,我们在META-INF 文件夹下的spring.factoryies下发现,自动装配类为org.springframework.cloud.netf原创 2020-11-07 14:55:47 · 391 阅读 · 2 评论 -
SpringCloud-Eureka注册与消费(3)
未见彩虹时,我知道我的雨季还没结束一.背景在上一节中,我们已经完成了Eureka的简单集群,那么服务提供者如何注册服务,而服务消费者如何获取注册服务列表,而注册服务列表里又有啥东西呢,这是我们这一节所需要整理的问题二.父pom改造由于服务提供者和服务消费者都需要使用web相关的依赖,所以将相关写入父pom文件中,当然也可以写在服务提供者和服务消费者项目中。<?xml version="1.0" encoding="UTF-8"?><project xmlns="http:/.原创 2020-11-03 20:16:37 · 190 阅读 · 0 评论 -
SpringCloud-Eureka简单集群(2)
一.修改HOST前一章简单讲了的Eureka注册中心启动,这里将构建Eureka简单集群,由于是在个人计算机中进行测试,很难模拟多主机情况,而Eureka配置server集群时,需要配置host地址,所以先修改个人电脑上的host地址二.配置文件在第一章的基础上,修改application.yml配置文件# eureka server 注册中心配置节点Aserver: port: 6662spring: application: name: springcloud-eureka原创 2020-11-03 15:36:08 · 133 阅读 · 0 评论 -
SpringCloud-Eureka(1)
简介Eureka作为服务注册中心,主要是用于存储服务提供者地址信息,服务发布相关的属性信息,消费者通过主动(消费者拉取)或者被动通知(注册中心推送)的方式获取服务提供者的地址信息,从而将服务提供者与消费者之间的硬编码通信变得更为透明,更为灵活。Eureka使用步骤服务提供者启动服务提供者将服务信息注册到注册中心当中服务消费者获取服务注册信息:poll模式:服务消费者基于触发式,或者根据一定时间间隔去注册中心拉取提供者清单(Eureka)push模式:服务消费者订阅服务,当服务提供者发生变化原创 2020-11-03 14:19:21 · 199 阅读 · 0 评论 -
Eureka踩坑事件-An attempt was made to call the method GsonBuilder.setLenient
背景在开始学习SpringCloud的Eureka时,在启动Eureka服务端时,出现以下错误Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2020-11-02 23:06:20.178 ERROR 8800 --- [ main] o.s.b.d.LoggingFailureAnalysisReport原创 2020-11-02 23:42:08 · 579 阅读 · 0 评论