简单的来说就是一个微服务要调用另一个微服务,就必须知道这个微服务的地址及端口信息。采用一张注册表,注册上线可用的微服务及相关信息,微服务则从注册表上查找所需的其它微服务的相关信息。有两种主要的服务发现模式:客户端服务发现(client-side discovery)和服务器端服务发现(server-side discovery)
客户端发送请求到service时,通过查询一个Service Registry(它知道所有service实例的地址)的方式来获取service实例的地址,简单来说就是客户端从注册表中获取相关信息,由客户端进行负载均衡等操作并对微服务发起请求,如下所示:
当发送请求到一个service的时候,客户端发送请求到一个router,这个router是在一个已知的地址上运行的。router查询service registry(可能在这个router中实现), 然后把请求发送到可用的service实例。如下所示:
上图是来自Eureka官方的架构图,大致描述了Eureka集群的工作过程。
Eureka有两个概念,区域(Region)与可用区(Zone),不太理解,先抄过来占个位置。
Eureka包含两个组件:Eureka Server 和 Eureka Client。
综上,Eureka通过心跳检测、健康检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
依赖:
spring-cloud-starter-eureka-server: 是服务端核心依赖
spring-boot-starter-security:安全校验依赖,非核心必须
spring-cloud-dependencies: 添加该依赖后会自动帮你选择其他spring-cloud打头的依赖的版本(version),这里的springcloud采用的是Edgware.SR3版本,不同版本对spring-boot版本要求不一致,具体到springcloud官网查看。
org.springframework.boot
spring-boot-starter-parent
1.5.13.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Edgware.SR3
pom
import
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework.boot
spring-boot-starter-security
应用入口增加增加注解@EnableEurekaServer
配置文件:
#本身服务器端(注册中心)也是一个服务,如果是单机环境(非集群),则没必要将自己的注册到注册中心,则以下两项设置为false即可,默认为true。
#是否向服务注册中心注册自己
eureka.client.register-with-eureka=false
#是否检索服务
eureka.client.fetch-registry=false
#服务注册中心的配置内容,指定服务注册中心的位置,本服务注册到该地址的注册中心
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
#设置eureka的指定数据中心
eureka.datacenter =cloud
#设置eureka的环境名称
eureka.environment =product
#这是安全检验模块,设置登录eureka后台的帐号密码,链接中添加相同 ${user}:${password}@ 即可
security.user.name
security.user.password
依赖:
spring-cloud-starter-eureka: 是服务端核心依赖
spring-boot-starter-actuator:是一个用于暴露自身信息的模块,所以很明显,它的主要作用是用于监控与管理。这里的作用就是为了能被注册中心及其他微服务监测到。
org.springframework.boot
spring-boot-starter-parent
1.5.13.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Edgware.SR3
pom
import
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-actuator
应用入口增加增加服务发现的注解@EnableEurekaClient
配置文件:
spring:
application:
name: microservice-provider
server:
port: 8020
eureka:
client:
healthcheck:
enabled: true #健康检查
serviceUrl:
defaultZone: http://user:1234@localhost:8761/eureka
instance:
prefer-ip-address: true #在注册中心选中该条微服务的展现名时,是否展现该微服务的ip地址
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} #该微服务在eureka上的显示名
健康检查