springeureka(spring eureka)
本篇文章给大家谈谈springeureka,以及spring eureka对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、SpringCloud:如何使用Eureka进行服务治理?
- 2、SpringCloud创建Eureka模块
- 3、Spring Cloud之Eureka源码分析2
- 4、Springboot整合eureka
- 5、Spring Boot集成Eureka
- 6、spring cloud eureka双活设置碰到的小坑
SpringCloud:如何使用Eureka进行服务治理?
“微服务”一词来自国外的一篇博文,网站:
如果您不能看懂英文文档,可以弯雹跳转到搜简体中文的文档
这是国人翻译的文档,可以隐迅学习参考:
引用官方文档解释:
Eureka server:创建服务注册中心
环境准备:
创建一个SpringBoot Initialize项目
pom,加上spring-cloud-starter-netflix-eureka-server
@EnableEurekaServer配置Eureka服务端:
eureka服务端配置:
启动项目,访问:
在Eureka中,服务提供者和服务消费者是Eureka client提供的,使用注解@EnableEurekaClient标明
新建SpringBoot Initializer项目
写个例子,以github用户为例:
读取github用户信息:
@EnableEurekaClient指定eureka client:
部署后,注册信息发布到eureka server:埋携帆
服务注册信息打印到控制台
访问接口: ,能访问就是注册成功
提示:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
方法:可以关了eureka的自我保护模式eureka.server.enableSelfPreservation=false
eureka也引用SpringBoot actuator监控管理
具体可以进行配置,配置成eureka server的ip,加上actuator
显示ip和实例id配置:
Spring cloud有两种最常用的服务调用方式,一种是ribbon+restTemplate,另一种是feign,所以本博客以学习为目的,简单介绍一下ribbon+restTemplate的方式,之后有时间再介绍feign的方式
ribbon+resttemplate方式,Spring Cloud Hoxton.SR6版本不需要引入spring-cloud-starter-netflix-ribbon,已经默认集成
引入web既可,主要是想调restTemplate
yaml配置:
关键点,使用SpringCloud的@LoadBalanced,才能调 ? 接口的数据,浏览器是不能直接调的
附录:
ok,本博客参考官方教程进行实践,仅仅作为入门的学习参考资料
SpringCloud创建Eureka模块
本文详细介绍Spring Cloud创建Eureka模块的方法,
基于已经创建好的Spring Cloud父工程,
请参考 SpringCloud创建项目父工程 ,
在里面创建Eureka模块,
用于Spring Cloud的微服务注册。
这里介绍的是Eureka单机版。
这一步创建一个Maven Module,
作为Spring Cloud的父工程下的一个子工程:
在父工程spring-cloud-demo上右键 - New - Other... - Maven - Maven Module
勾选Create a simple project(skip archetype selection),
输入Module Name:eureka-server,
查看Parent Project:spring-cloud-demo,
如果不是自己选择的父工程,请重新选择。
点击Finish完成工程创建。
创建后可以看到pom.xml如下:
在pom.xml中增加eureka-server的依赖:
在src/main/resource目录下新增application.yml文件,
并且增加如下配置:
在src/main/java目录下新增主启动类,
Package:com.yuwen.spring.eureka
Name:EurekaServerApplication
然后修改EurekaServerApplication.java如下,
注意一定要有@EnableEurekaServer注解,
表示这是一个Eureka服务注册中心:
右键主启动类EurekaServerApplication.java,
Run As ... - Java Application
成功启动日志如下,
可以看到对外提供的服务端口是7001:
在前配浏览器中访问Eureka服务页面:慧乱指
可以看到如下页面:
Eureka服务启动后陪尺,
客户端可以注册到Eureka,
在pom.xml中增加eureka-client的依赖:
在application.yml中配置自己的主机名,
以及连接的eureka地址:
然后在客户端的主启动类上面加@EnableEurekaClient注解,
这样客户端服务启动之后,
可以看到Eureka页面已经有客户端注册了:
Spring Cloud之Eureka源码分析2
本章主要姿滑介绍Eureka Client端源码分析。
客户端主要是向Server服务端发送Http请求,主要有注册,心跳续约,获取注册信息等功能
在分析源码之前,需要查看下客户端配置文件
application.yml
访问服务端localhost:8000的注册信息
自动配置类,首先要从依赖包的spring.factories文件看起
其中最重要的是EurekaClientAutoConfiguration类
只要类中存在EurekaClientConfig类所在段带的依赖包eureka-client-xx.jar就可以加载这个类
2、RefreshableEurekaClientConfiguration 用来开启定时任务
1、EurekaAutoServiceRegistration
实例化EurekaAutoServiceRegistration对象,并放到spring容器中
org.springframework.cloud.netflix.eureka.serviceregistry.EurekaAutoServiceRegistration
2、start
由于EurekaAutoServiceRegistration类实现了SmartLifecycle,SmartApplicationListener等接口,所以会在容器初始化完成之后调用EurekaAutoServiceRegistration#start方法。
调用ApplicationInfoManager应用信息管理设置实例初始化状态信息initialStatus
4、setInstanceStatus
com.netflix.appinfo.ApplicationInfoManager#setInstanceStatus
设置实例迹燃腊状态信息并调用监听器notify方法
com.netflix.discovery.DiscoveryClient#register
这里就到了注册客户端的地方
包括缓存更新与心跳续约,通过RefreshableEurekaClientConfiguration类开始初始化,并最终通过initScheduledTasks方法开启定时调度器任务
EurekaClientAutoConfiguration.RefreshableEurekaClientConfiguration
这个类是程序实现定时刷新任务开始的地方,主要是通过new CloudEurekaClient()方法创建Cloud客户端类(CloudEurekaClient)
下面主要查看CloudEurekaClient的调用链
1、CloudEurekaClient#CloudEurekaClient
org.springframework.cloud.netflix.eureka.CloudEurekaClient#CloudEurekaClient
调用CloudEurekaClient类的父类,和对applicationInfoManager、publisher、eurekaTransportField等属性值赋值
2、DiscoveryClient#DiscoveryClient
com.netflix.discovery.DiscoveryClient#DiscoveryClient
4、DiscoveryClient#DiscoveryClient
定义调度器类、心跳执行器和缓存刷新执行器等的定义。
com.netflix.discovery.DiscoveryClient#DiscoveryClient
这个方法主要流程:
①、这个方法前半部分是初始化属性值。
②、根据客户端client配置文件,config.shouldFetchRegistry()是否获取注册表信息和
config.shouldRegisterWithEureka()是否注册到eureka上来对属性赋值,或直接返回
③、初始化调度器scheduler、两个线程池执行器heartbeatExecutor(心跳续约)和cacheRefreshExecutor(缓存刷新,定时获取注册信息表)
④、在获取服务注册信息条件下,没有获取到信息或异常即fetchRegistry(false)返回false。可以从备用服务器获取调用fetchRegistryFromBackup()方法,内部实现方法调用备用服务器类的get方法backupRegistryProvider.get()
⑤、初始化调度器任务方法initScheduledTasks()
调度器任务包括:
1、定时刷新缓存注册表信息,分为全量获取和增量获取
2、定时向服务端发送心跳续约
3、状态改变监听器执行
这里不仅包括这些定时任务,注册也是在这里调用状态改变监听器StatusChangeListener的notify方法
com.netflix.discovery.DiscoveryClient#initScheduledTasks
1、initScheduledTasks
com.netflix.discovery.DiscoveryClient#initScheduledTasks
TimedSupervisorTask继承了TimerTask,TimerTask实现了Runnable
TimedSupervisorTask类的构造方法
2、HeartbeatThread
执行TimedSupervisorTask的task任务,在给定的间隔内执行心跳续约任务
com.netflix.discovery.DiscoveryClient.HeartbeatThread
3、renew
续约任务,续约成功更新lastSuccessfulHeartbeatTimestamp参数。通过REST方式进行续订
com.netflix.discovery.DiscoveryClient#renew
服务端调用到renewLease方法续约,appName和id与客户端传过来的相同
com.netflix.eureka.resources.InstanceResource#renewLease
在定时刷新缓存实现获取注册信息,分为全量拉取和增量拉取
创建TimedSupervisorTask调度任务类,传入cacheRefreshExecutor执行器、CacheRefreshThread任务类、从服务端获取注册信息的时间间隔RegistryFetchIntervalSeconds等参数信息
全量拉取条件(任意一个)
①、disable-delta属性值是true 关闭增量拉取
②、registry-refresh-single-vip-address 属性vip地址的值不为空
③、forceFullRegistryFetch 为true 传过来的变量值
④、localRegionApps的applications是null 当前区域应用
⑤、applications的数量是0
⑥、applications的版本是-1
实现增量拉取的条件是不符合全量拉取,调用getAndUpdateDelta方法
com.netflix.discovery.DiscoveryClient#getAndUpdateDelta
这个方法实现了增量拉取的请求实现,及对拉取增量结果的处理
1、getDelta
eurekaTransport.queryClient.getDelta(remoteRegionsRef.get())的具体实现是通过AbstractJerseyEurekaHttpClient类实现的
com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient#getDelta
这个方法主要是遍历recentlyChangedQueue存在的数据放入到Applications对象中。所以recentlyChangedQueue队列中存在什么数据就很重要,因此我们需要了解最新更新队列recentlyChangedQueue是如何放入的及放入那些数据,及其的移除的原理。
在这个方法最后 apps.setAppsHashCode设置了当前服务端所有注册信息的HashCode,所以这个增量对象存储了最新的状态HashCode值。
7、客户端获取增量数据的处理
还是在getAndUpdateDelta方法内,对服务端传输过来数据,获取当前服务端的增量数据部分
com.netflix.discovery.DiscoveryClient#getAndUpdateDelta
这个方法的主要过程是:
如果增量数据部分为空,则执行全量拉取。
对当前服务的注册信息表执行updateDelta(delta)方法,对当前注册实例的增加删除或修改操作
当前更新后的服务注册表的HashCode值与增量对象存储的最新的状态HashCode值比较,如果不相等 则执行全量拉取
最新更新队列ConcurrentLinkedQueueRecentlyChangedItem recentlyChangedQueue
com.netflix.eureka.registry.AbstractInstanceRegistry#AbstractInstanceRegistry类在构建创建注册表时创建了recentlyChangedQueue队列,并创建了一个增量调度任务方法getDeltaRetentionTask方法
com.netflix.eureka.registry.AbstractInstanceRegistry#getDeltaRetentionTask
对recentlyChangedQueue队列中对最近改变的队列在一定时间范围retentionTimeInMSInDeltaQueue=180000ms(3分钟)外的进行定时清除(30s清除一次)
3、statusUpdate
4、deleteStatusOverride
getDeltaRetentionTask进行定时清除
全量拉取与增量拉取过程类似
全量拉取调用getAndStoreFullRegistry方法
1、getAndStoreFullRegistry
com.netflix.discovery.DiscoveryClient#getAndStoreFullRegistry
2、getApplications
com.netflix.discovery.shared.transport.EurekaHttpClient#getApplications
[img]Springboot整合eureka
在利用spring initializer创建项目时,勾选上Eureka Server即可完成相关导入
在resource资源路径下,创建application.yml
验证
localhost:7900
配置eureka Server很简单,一般是不会出错的,如果出错了,那么百分之99是因为springboot的版本跟springcloud的版本对应不上,然后出现各种莫须有的问题
在搭建的过程中我也出现了各种问题,随后找到了一个可以适配的版本
这里在上面的例子上进行操作,我们可以修改配置文件,利用spring.proflies进行区分
分别为7900,7901,7902,猛银含各个eureka不用互相注册, 多台eureka的spring.application.name必须相同 ,之前也踩过这种坑(当时是两天eureka,互相注册,就因为spring.application.name不相同,死活注册不上去),利用eureka.instance.hostname进行各个节点的区分即可。另外需要关注的一点就是 defaultZone必须写上三台主机,如果是两台的话,就互相注册即可。这里大家可以参考官网的,当然我也枝笑是借鉴的 spring-cloud-Netflix eureka server集群搭建
这里搏兄还需要注意,spring.profiles不要选错了。
如果选择了第一个,将会导致配置不生效,而且yml也不像java,通过import还能看出导入的是什么,这里选错直接玄学,所以还是得细心点。
Spring Boot集成Eureka
在应梁核樱用启动类上添加@EnableEurekaServer注解,声明为Eureka Server
配置文件application.yml中添加以下内容:
启动应用,访问
添加如下依赖:
在配置文件application.yml中添加如下配置:
也可使用@EnableEurekaClient注解替代@EnableDiscoveryClient,EnableEurekaClient只支持Eureka,氏弊而EnableDiscoveryClient是一个高度的抽象还支持Zookeeper和Consul
只需修改Eureka Server端口号启动多个实例,然后将eureka.client.serviceUrl.defaultZone地址相互配置为其他节点地址即可。而客户端无需配置多个defaultZone,橡丛只需配置一个,Eureka Server集群节点之间会相互同步
spring cloud eureka双活设置碰到的小坑
spring cloud netflix版本 1.3.6
在测试环境,同一台虚拟首巧手机上的不同端口上,进行eureka双活配置的时候,按照官方文档的配置,把defaultZone设置成对方节点,发现怎么设置都不行,DS Replicas中,各种不显示多活的HA,感觉就是相互没有注册上,宽亮但是又找不到原因。
之后无意中,在本地起了一个eureka之后,发现居然本地起的eureka居然能和虚拟机上的形成多活!并且在DS Replicas中显示的是我本地的IP地址,这个时候,突然有了一个想法。官方文档中,多活的设置都是用hostname,而不是用IP地址,会不会是因为这个原因导致多活无法成功相互注册呢??
于是,在虚拟机的hosts里,增加了两个配置一个是eureka 127.0.0.1,一个是eureka1 127.0.0.1。者嫌重新启动之后,eureka的多活就实现了。。稍微记录一下~
关于springeureka和spring eureka的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。