🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
微服务注册中心是一个管理微服务的工具,可以帮助微服务在分布式系统中发现、注册和协调服务之间的交互。它是微服务架构的核心组件之一,负责维护服务注册表,提供服务发现、负载均衡、故障恢复等功能,使得微服务能够更好地运行和协作。常见的微服务注册中心有Consul、Eureka、Zookeeper等。
注册中心是分布式系统中的重要组件,主要作用是为服务提供者和服务消费者之间建立联系。在一个分布式系统中,服务提供者和消费者数量很多,而且会随时变化。没有一个中心化的机制来管理它们之间的联系,会造成服务发现、负载均衡、故障转移等问题。
使用注册中心可以简化服务发现过程,提供负载均衡和故障转移支持。服务提供者和消费者将其元数据注册到注册中心,当消费者需要调用某个服务时,可以通过注册中心找到该服务提供者,并进行调用。当某个服务不可用时,注册中心可以及时检测到并将其从可用服务列表中删除,从而实现快速的故障转移。
注册中心是分布式系统中极其重要的基础设施,可以提高系统的可靠性、可维护性和可扩展性。
Eureka是Netflix开源的一种服务发现工具,它可以通过RESTful接口实现微服务的动态发现和负载均衡。Eureka采用客户端-服务端模式,服务提供方在启动时将自己注册到Eureka服务器中,Eureka服务器维护服务注册表,记录了所有可用的服务实例,服务消费方在需要调用服务时从Eureka服务器中获取服务实例信息,然后进行调用。
Eureka结构主要包括两个主要组件:Eureka Server和Eureka Client。Eureka Server是服务注册中心,负责维护所有可用服务的注册表、实例状态和信息变更的通知,同时会定时将注册表信息发送给其他Eureka Server实现集群的高可用。Eureka Client是服务消费方,负责从Eureka Server中获取可用服务实例信息,并进行服务调用。
Eureka的作用主要在于解耦服务之间的调用关系,提高了系统的可扩展性和可维护性。同时,Eureka还支持服务的自我保护机制,当Eureka Server失去与客户端的联系时,它将保留已注册的实例信息,避免服务的瞬时不可用性。
Eureka的具体使用步骤如下:
在cloud-demo父工程下,创建一个spring boot子模块:
cloud-demo cn.itcast.demo 1.0 4.0.0 eureka-service 8 8
引入SpringCloud为eureka提供的starter依赖:
org.springframework.cloud spring-cloud-starter-netflix-eureka-server
给eureka-server服务编写一个启动类,一定要添加一个 @EnableEurekaServer 注解,开启eureka的注册中心功能:
package cn.itcast.demo.eurekaserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
编写一个application.yml文件,内容如下:
server: port: 10086 spring: application: name: eureka-server eureka: instance: hostname: localhost # 主机名 client: service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信 register-with-eureka: false # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要 fetch-registry: false # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要 server: enable-self-preservation: false # 关闭自我保护机制 eviction-interval-timer-in-ms: 3000 # 检查服务的时间间隔
启动微服务,然后在浏览器访问:http://127.0.0.1:10086
看到下面结果应该是成功了:
在user-service的pom文件中,引入下面的eureka-client依赖:
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
在user-service中,修改application.yml文件,添加服务名称、eureka地址:
spring: application: name: userservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka
为了演示一个服务有多个实例的场景,我们添加一个SpringBoot的启动配置,再启动一个user-service。
首先,复制原来的user-service启动配置:
然后,在弹出的窗口中,填写信息:
现在,SpringBoot窗口会出现两个user-service启动配置:
不过,第一个是8081端口,第二个是8082端口。
启动两个user-service实例:
查看eureka-server管理页面:
之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。
在order-service的pom文件中,引入下面的eureka-client依赖:
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息:
在order-service中,修改application.yml文件,添加服务名称、eureka地址:
spring: application: name: orderservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka
最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。
不过这些动作不用我们去做,只需要添加一些注解即可。
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:
spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。
@EnableDiscoveryClient // 激活DiscoveryClient @EnableEurekaClient @SpringBootApplication public class ConsumerApp { public static void main(String[] args) { SpringApplication.run(ConsumerApp.class,args); } }
@RestController @RequestMapping("/order") public class OrderController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @GetMapping("/goods/{id}") public Goods findGoodsById(@PathVariable("id") int id){ System.out.println("findGoodsById..."+id); //演示discoveryClient 使用 Listinstances = discoveryClient.getInstances("EUREKA-PROVIDER"); //判断集合是否有数据 if(instances == null || instances.size() == 0){ //集合没有数据 return null; } ServiceInstance instance = instances.get(0); String host = instance.getHost();//获取ip int port = instance.getPort();//获取端口 System.out.println(host); System.out.println(port); String url = "http://"+host+":"+port+"/goods/findOne/"+id; // 3. 调用方法 Goods goods = restTemplate.getForObject(url, Goods.class); return goods; } }
Eureka包含四个部分的配置
Eureka Instance的配置信息全部保存在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean配置类里,实际上它是com.netflix.appinfo.EurekaInstanceConfig的实现类,替代了netflix的com.netflix.appinfo.CloudInstanceConfig的默认实现。
Eureka Instance的配置信息全部以eureka.instance.xxx的格式配置。
配置列表
应用名,首先获取spring.application.name的值,如果取值为空,则取默认unknown。
应用组名
实例注册到Eureka上是,是否立刻开启通讯。有时候应用在准备好服务之前需要一些预处理。
非安全的端口
安全端口
是否开启非安全端口通讯
是否开启安全端口通讯
实例续约间隔时间
实例超时时间,表示最大leaseExpirationDurationInSeconds秒后没有续约,Server就认为他不可用了,随之就会将其剔除。
虚拟主机名,首先获取spring.application.name的值,如果取值为空,则取默认unknown。
注册到eureka上的唯一实例ID,不能与相同appname的其他实例重复。
安全虚拟主机名,首先获取spring.application.name的值,如果取值为空,则取默认unknown。
实例元数据,可以供其他实例使用。比如spring-boot-admin在监控时,获取实例的上下文和端口。
实例部署的数据中心。如AWS、MyOwn。
实例的IP地址
实例状态页相对url
实例状态页绝对URL
实例主页相对URL
实例主页绝对URL
实例健康检查相对URL
实例健康检查绝对URL
实例安全的健康检查绝对URL
配置属性的命名空间(Spring Cloud中被忽略)
主机名,不配置的时候讲根据操作系统的主机名来获取
是否优先使用IP地址作为主机名的标识
Eureka Client客户端特性配置是对作为Eureka客户端的特性配置,包括Eureka注册中心,本身也是一个Eureka Client。
Eureka Client特性配置全部在org.springframework.cloud.netflix.eureka.EurekaClientConfigBean中,实际上它是com.netflix.discovery.EurekaClientConfig的实现类,替代了netxflix的默认实现。
Eureka Client客户端特性配置全部以eureka.client.xxx的格式配置。
配置列表
是否启用Eureka client。
定时从Eureka Server拉取服务注册信息的间隔时间
定时将实例信息(如果变化了)复制到Eureka Server的间隔时间。(InstanceInfoReplicator线程)
首次将实例信息复制到Eureka Server的延迟时间。(InstanceInfoReplicator线程)
拉取Eureka Server地址的间隔时间(Eureka Server有可能增减)
Eureka Server的代理端口
Eureka Server的代理主机名
Eureka Server的代理用户名
Eureka Server的代理密码
从Eureka Server读取信息的超时时间
连接Eureka Server的超时时间
Eureka Client第一次启动时获取服务注册信息的调用的回溯实现。Eureka Client启动时首次会检查有没有BackupRegistry的实现类,如果有实现类,则优先从这个实现类里获取服务注册信息。
Eureka client连接Eureka Server的链接总数
Eureka client连接单台Eureka Server的链接总数
当Eureka server的列表在DNS中时,Eureka Server的上下文路径。如http://xxxx/eureka。
当Eureka server的列表在DNS中时,Eureka Server的端口。
当Eureka server的列表在DNS中时,且要通过DNSName获取Eureka Server列表时,DNS名字。
实例所属区域。
Eureka Client和Eureka Server之间的Http连接的空闲超时时间。
心跳(续约)执行器线程池大小。
心跳执行器在续约过程中超时后的再次执行续约的最大延迟倍数。默认最大延迟时间=10 * eureka.instance.leaseRenewalIntervalInSeconds
cacheRefreshExecutord的线程池大小(获取注册信息)
cacheRefreshExecutord的再次执行的最大延迟倍数。默认最大延迟时间=10 *eureka.client.registryFetchIntervalSeconds
Eureka Server的分区地址。默认添加了一个defualtZone。也就是最常用的配置eureka.client.service-url.defaultZone=xxx
是否注册到Eureka Server。
是否使用相同Zone下的Eureka server。
是否记录Eureka Server和Eureka Client之间注册信息的差异
是否开启增量同步注册信息。
获取注册服务的远程地区,以逗号隔开。
可用分区列表。用逗号隔开。
是否只拉取UP状态的实例。
是否拉取注册信息。
是否在停止服务的时候向Eureka Server发起Cancel指令。
是否在初始化过程中注册服务。
Eureka Server注册中心端的配置是对注册中心的特性配置。Eureka Server的配置全部在org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean里,实际上它是com.netflix.eureka.EurekaServerConfig的实现类,替代了netflix的默认实现。
Eureka Server的配置全部以eureka.server.xxx的格式进行配置。
配置列表
是否开启自我保护
自我保护续约百分比阀值因子。如果实际续约数小于续约数阀值,则开启自我保护
续约数阀值更新频率。
Eureka Server节点更新频率。
是否启用复制请求压缩。
当从其他节点同步实例信息为空时等待的时间。
节点间连接的超时时间。
节点间读取信息的超时时间。
节点间连接总数。
单个节点间连接总数。
节点间连接空闲超时时间。
增量队列的缓存时间。
清理增量队列中过期的频率。
剔除任务频率。
注册列表缓存超时时间(当注册列表没有变化时)
注册列表缓存更新频率。
是否开启注册列表的二级缓存。
是否为client提供增量信息。
状态同步的最大线程数。
状态同步队列的最大容量。
当时间差异时是否同步。
注册信息同步重试次数。
注册信息同步重试期间的时间间隔。
节点间同步事件的最大容量。
节点间同步的最小线程数。
节点间同步的最大线程数。
节点间同步的最大时间,单位为毫秒。
是否启用远程区域增量。
远程区域连接超时时间。
远程区域读取超时时间。
远程区域最大连接数
远程区域单机连接数
远程区域连接空闲超时时间。
远程区域注册信息拉取频率。
远程区域注册信息线程数。
注册中心仪表盘的配置主要是控制注册中心的可视化展示。以eureka.dashboard.xxx的格式配置。
仪表盘访问路径
是否启用仪表盘
server: port: 8761 eureka: instance: hostname: eureka-server1 # 主机名(需要配置端口映射) client: service-url: defaultZone: http://eureka-server2:8762/eureka register-with-eureka: true # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要 fetch-registry: true # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要 spring: application: name: eureka-server-ha
server: port: 8762 eureka: instance: hostname: eureka-server2 # 主机名 client: service-url: defaultZone: http://eureka-server1:8761/eureka register-with-eureka: true # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要 fetch-registry: true # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要 spring: application: name: eureka-server-ha
server: port: 8001 eureka: instance: hostname: localhost # 主机名 prefer-ip-address: true # 将当前实例的ip注册到eureka server 中。默认是false 注册主机名 ip-address: 127.0.0.1 # 设置当前实例的ip instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id lease-renewal-interval-in-seconds: 3 # 每隔3 秒发一次心跳包 lease-expiration-duration-in-seconds: 9 # 如果9秒没有发心跳包,服务器呀,你把我干掉吧~ client: service-url: defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信 spring: application: name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
server: port: 9000 eureka: instance: hostname: localhost # 主机名 client: service-url: defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信 spring: application: name: eureka-consumer # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”