博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud 之Eureka服务注册和发现
阅读量:2455 次
发布时间:2019-05-10

本文共 7813 字,大约阅读时间需要 26 分钟。

文章目录

源码地址:

官网地址:

Eureka2.0已经停止更新了。
在这里插入图片描述

微服务注册与发现

在这里插入图片描述

  • 服务提供者将服务注册到注册中心
  • 服务消费者通过注册中心查找服务
  • 查找到服务后进行调用
  • 服务的消费者与服务注册中心保持心跳连接,一旦服务提供者的地址发生变更时,注册中心会通知服务消费者

注册中心:Eureka

Spring Cloud提供了多种注册中心的支持,如:Eureka、Consul、ZooKeeper、Nacos等。Eureka已经闭源了。所以不建议使用了,目前推荐使用阿里提供的Nacos注册中心。

原理:

在这里插入图片描述
Eureka包含两个组件:Eureka Server和Eureka Client

  • Eureka Server 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
  • Eureka Client 是一个Java客户端,用于简化与Eureka Server的交互,客户端同时也内置了一个Ribbon、并使用了轮询(round-robin)负载算法的负载均衡器。
  • Eureka Client 应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
  • Eureka Server 之间通过复制的方式完成数据的同步,Eureka Client 还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
  • 综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

1、创建一个maven主工程

首先创建一个主Maven工程,在其pom文件引入依赖。这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该pom。

快速构建SpringBoot微服务工程。

父pom依赖:

4.0.0
pom
eureka-client
eureka-server
org.springframework.boot
spring-boot-starter-parent
2.0.3.RELEASE
com.yq
springcloud-eureka
0.0.1-SNAPSHOT
springcloud-eureka
UTF-8
UTF-8
1.8
Finchley.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin

2、编写服务注册中心

创建一个model工程作为服务注册中心,即eureka-server

导入依赖:

com.yq
springcloud-eureka
0.0.1-SNAPSHOT
eureka-server
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server

启动一个服务注册中心,只需要在SpringBoot启动类上加上注解@EnableEurekaServer即可。

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication// 申明这是一个Eureka服务@EnableEurekaServerpublic class EurekaServerApplication {
}

配置文件appication.yml:

spring:  application:    name: app-eureka-centerserver:  port: 8100eureka:  instance:    prefer-ip-address: true    ip-address: 127.0.0.1  client:    service-url:      defaultZone: http://${
eureka.instance.ip-address}:${
server.port}/eureka/ register-with-eureka: false fetch-registry: false server: enable-self-preservation: false
  • spring.application.name:注册到eureka注册中心的服务名称
  • eureka.client.service-url.defaultZon:服务注册中心地址
  • eureka.client.register-with-eureka:是否将自己注册到Eureka服务注册中心,默认为true(单机模式为false,集群模式为true)
  • eureka.client.fetch-registry:是否从Eureka中检索服务信息,默认为true(单机的注册中心为false,集群的注册中心或客户端为true)
  • eureka.instance.prefer-ip-address:是否将自己的IP地址注册到Eureka服务中,默认为false
  • eureka.instance.ip-address:自定义IP地址,默认是本机地址
  • eureka.server.enable-self-preservation:是否开启自我保护机制,默认true,测试环境、开发环境可以设置false关闭自我保护机制,保证服务不可用时及时剔除

3、编写服务提供者

创建一个model工程作为eureka-client

导入依赖:

springcloud-eureka
com.yq
0.0.1-SNAPSHOT
eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client

通过注解@EnableEurekaClient或者@EnableDiscoveryClient开启服务注册和发现功能。

@EnableEurekaClient只兼容Eureka。
@EnableDiscoveryClient兼容所有注册中心,比如:Zookeeper,Consul。
建议还是使用@EnableDiscoveryClient,方便以后切换注册中心。

package com.yq.eurekaclient;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplication// 申明这是一个Eureka客户端@EnableEurekaClient@RestControllerpublic class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args); } @Value("${server.port}") String port; @GetMapping("/hello") public String home() {
return "hello port:" + port; }}

配置文件中注明自己的服务注册中心的地址。

需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
application.yml配置文件如下:

server:  port: 8081spring:  application:    name: eureka-clienteureka:  client:    serviceUrl:      defaultZone: http://localhost:8100/eureka/  instance:    prefer-ip-address: true

4、启动工程

打开http://localhost:8100,即eureka server的网址:

在这里插入图片描述
发现一个服务已经注册在服务注册中心了,服务名为EUREKA-CLIENT,端口为8081。

5、构建高可用的Eureka Serve集群

搭建Eureka集群非常简单,只要启动多个Eureka Server服务并且让这些Server端之间彼此进行注册即可实现。

更改eureka-server的配置文件application.yml, 在该配置文件中采用多 profile 的格式。

---spring:  profiles: server1  application:    name: app-eureka-centerserver:  port: 8100eureka:  instance:    prefer-ip-address: true    ip-address: 192.168.112.187  client:    service-url:      # 端口为8100的机器注册到端口为9100的注册中心      defaultZone: http://127.0.0.1:9100/eureka/  server:    enable-self-preservation: false---spring:  profiles: server2  application:    name: app-eureka-centerserver:  port: 9100eureka:  instance:    prefer-ip-address: true    ip-address: 192.168.112.187  client:    service-url:      # 端口为9100的机器注册到端口为8100的注册中心      defaultZone: http://127.0.0.1:8100/eureka  server:    enable-self-preservation: false

通过 spring.profiles.active 指定启动的配置文件。

  • -Dspring.profiles.active=server1
    在这里插入图片描述
  • -Dspring.profiles.active=server2
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以看到,2个Eureka服务进行了彼此注册。

服务注册到Eureka集群时,可以指定多个,也可以指定一个Eureka服务(因为Eureka服务集群间彼此互联)。

深入理解Eureka

Eureka的一些概念

  • Register 一一服务注册: 当Rureka Client Eureka Server 注册时 Eureka Client 提供自身的元数据,比如 IP 地址、端口、运行状况H1标的 Uri 主页地址等信息。
  • Renew一一服务续约: Eureka Client 在默认的情况下会每隔 30 秒发送一次心跳来进行服务续约。通过服务续约来告知 Eureka Server 该 Eureka Client 仍然可用,没有出现故障。正常情况下,如果 Eureka Server 90 秒内没有收到 Eureka Client 的心跳, Eureka Server 会将 Eureka Client 实例从注册列表中删除。注意:官网建议不要更服务续约的间隔时间。
  • Fetch Registries一一获取服务注册列表信息: Eureka Client 从 Eureka Server 获取服务注册表信息,井将其缓存在本地。 Eureka Client 使用服务注册列表信息查找其他服务的信息,从而进行远程调用。该注册列表信息定时(每30 秒) 更新一次。
  • Cancel-一服务下线: Eureka Client 在程序关闭时可以向 Eureka Server 发送下线请求。发送请求后,该客户端的实例信息将从 Eureka Server 的服务注册列表中删除。
  • Eviction一一服务剔除:
    在默认情况下,当 Eureka Client 90 秒没有向 Eureka Server 发送服务续约(即心跳)时, Eureka Server 会将该服务实例从服务 册列表删除,即服务剔除。

自我保护模式

如图,表示当前Eureka进入了自我保护模式。(先开启Eureka server端和client端,然后再断开client端,此时刷新Eureka界面,就会看到红色字样)

在这里插入图片描述
如果 Eureka Serve 在短时间内(默认为 15 分钟内低于 85% )丢失大量的服务续约,则服务器开启自我保护模式,即不再剔除注册列表的信息。这样做的好处在于,如果是 Eureka Server 自身的网络问题而导致 Eureka Client 无法续约,Eureka Client 注册列表信息不再被删除,也就是 Eureka Client 还可以被其他服务消费,使用自我保护模式,可以让Eureka集群更加的健壮,稳定。

在默认情况下, Eureka Server 的自我保护模式是开启的,如果需要关闭,则在配置文件中添加:

eureka:  server:    enable-self-preservation: false #禁用自我保护模式

如图表示禁用自我保护模式:

在这里插入图片描述

经典入门教程

转载地址:http://jgdhb.baihongyu.com/

你可能感兴趣的文章
多步骤建立镜像_通过四个步骤建立更多可信赖的团队
查看>>
linux中top命令_在Linux中使用top命令的提示
查看>>
管理工具 tools不可用_赶紧为管理员准备的10种杀手tools工具
查看>>
sysadmin默认密码_sysadmin的SELinux指南:42个主要问题的答案
查看>>
sysadmin默认密码_sysadmin的Ansible指南:如何简化任务
查看>>
linux开源游戏_适用于Linux的5个开源策略和模拟游戏
查看>>
开源语法解释器_抓住机会解释开源
查看>>
sonic pi_前5名:Linux,Sonic Pi,LibreOffice等
查看>>
owncloud_本周热门文章5:ownCloud创始人专访,Raspberry Pi上的Docker等
查看>>
前5名:来自Docker CEO的一句话,来自Scratch的Linux等
查看>>
开源意义_有用的陌生人和开源的意义
查看>>
最佳 开源 人脸识别算法_2014年最佳开源教程
查看>>
foss测试_2014年FOSS十大法律发展
查看>>
本周最热门的5篇文章:Raspberry Pi A +,Ansible和Jen的Linux历程
查看>>
owncloud_一周前五篇文章:Linux理念,ownCloud集成等
查看>>
最佳 开源 人脸识别算法_本周最佳5篇文章:今年最佳开源,以及更多
查看>>
firefox 开源_一周最热门的5篇文章:移动版Firefox OS和年度开源奇迹
查看>>
18年开源前端框架排名_2014年排名前20位的开源故事
查看>>
十大开源项目_2014年十大开源访谈
查看>>
展望2019年_感谢您创纪录的一年(并展望2015年)
查看>>