服务注册中⼼本质上是为了解耦服务提供者和服务消费者。
一,服务注册中⼼⼀般原理
1)服务提供者启动
2)服务提供者将相关服务信息主动注册到注册中⼼
3)服务消费者获取服务注册信息:
pull模式:服务消费者可以主动拉取可⽤的服务提供者清单
push模式:服务消费者订阅服务(当服务提供者有变化时,注册中⼼也会主动推送
更新后的服务清单给消费者
4)服务消费者直接调⽤服务提供者
另外,注册中⼼也需要完成服务提供者的健康监控,当发现服务提供者失效时需要及时剔除;
二,服务注册中心组件Eureka基础架构
Eureka 包含两个组件:Eureka Server 和 Eureka Client,Eureka Client是⼀个Java客户端,⽤于简化与Eureka Server的交互;Eureka Server提供服务发现的能⼒,各个微服务启动时,会通过Eureka Client向Eureka Server 进⾏注册⾃⼰的信息(例如⽹络信息),Eureka Server会存储该服务的信息;
1)图中us-east-1c、us-east-1d,us-east-1e代表不同的区也就是不同的机房。
2)图中每⼀个Eureka Server都是⼀个集群。
3)图中Application Service作为服务提供者向Eureka Server中注册服务,Eureka Server接受到注册事件会在集群和分区中进⾏数据同步,Application Client作为消费端(服务消费者)可以从Eureka Server中获取到服务注册信息,进⾏服务调⽤。
4)微服务启动后,会周期性地向Eureka Server发送⼼跳(默认周期为30秒)以续约⾃⼰的信息
5)Eureka Server在⼀定时间内没有接收到某个微服务节点的⼼跳,EurekaServer将会注销该微服务节点(默认90秒)。
6)每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的⽅式完成服务注册列表的同步。
7)Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使⽤缓存中的信息找到服务提供者,Eureka通过⼼跳检测、健康检查和客户端缓存等机制,提⾼系统的灵活性、可伸缩性和可⽤性。
三,Eureka服务端代码实现
1,导入pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2,配置application.yml配置文件
# Eureka server服务端⼝
server:
port: 8761
spring:
application:
# 应⽤名称,会在Eureka中作为服务的id标识
name: edu-eureka-boot
eureka:
instance:
hostname: localhost
client:
#⾃⼰就是服务不需要从Eureka Server获取服务信息,默认为true,置为false
fetch-registry: false
# ⾃⼰就是服务不需要注册⾃⼰
register-with-eureka: false
# 客户端与EurekaServer交互的地址,如果是集群,也需要写其它Server的地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3,启动类
@SpringBootApplication
// 声明本项⽬是⼀个Eureka服务
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class,args);
}
}
执⾏启动类LagouCloudEurekaServerApplication的main函数
访问http://127.0.0.1:8761,如果看到如下⻚⾯(Eureka注册中⼼后台),则表明EurekaServer发布成功
经验:建议⽣产环境打开⾃我保护机制
eureka web页面右上部实时展示Renews threshold和Renews (last min)
Renews threshold:续约最小阈值。
Renews (last min):最后一分钟续约的数量。
当Renews (last min) ≤ Renews threshold时就会触发自我保护机制。
四,Eureka客户端
服务提供者(也是Eureka客户端)要向EurekaServer注册服务,并完成服务续约等
⼯作,服务注册详解(服务提供者):
1)当我们导⼊了eureka-client依赖坐标,配置Eureka服务注册中⼼地址
2)服务在启动时会向注册中⼼发起注册请求,携带服务元数据信息
3)Eureka注册中⼼会把服务的信息保存在Map中。
1,pom文件引入依赖
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--获取配置中心配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2,配置application.yml
server:
port: 8001
spring:
application:
name: edu-ad-boot
cloud:
config:
uri: http://localhost:8090
label: master
profile: dev
name: lagou-edu-ad
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
# 注册服务的时候使用ip地址,ip地址从host里面找
prefer-ip-address: true
# 翻译过来就是“主机名:服务名称:服务端口”。当我们在 Eureka 的 Web 控制台查看服务注册信息的时候,就是这样的一个格式:
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
3,配置启动类
@SpringBootApplication
# 将服务注册到eureka server注册中心
# @EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。
# 不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
@EnableDiscoveryClient
public class LagouAdApplication {
public static void main(String[] args) {
SpringApplication.run(LagouAdApplication.class, args);
}
}
4,启动后查看注册中心中是否注册成功