Spring Cloud私人笔记整理(二)➡服务中心Eureka
目录
????什么是服务中心?
服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。总的来说服务中心在spring cloud中统筹兼顾,扮演小领导的角色
????什么是Eureka?
Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.
Eureka 是一个基于 REST 的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry(服务注册)和Service Discovery(服务发现)实现。也是spring cloud体系中最重要最核心的组件之一。
????Eureka原理
先看一下eureka的原理图:
解释上图名词:
1.Eureka Server:注册中心
服务都注册在哪里,哪里就可称为 Eureka Server,提供服务注册和发现
2.Eureka Client:注册客户端
服务的提供者客户端(Applicaton Service)/(Service Provider),有以下行为:
• Registy:服务注册
当 Eureka 客户端向 Eureka Server 注册时,会向 Eurekaserver 注册自己的信息(比如 IP,
端口,微服务名等),Eureka Server 会存储这些信息。
• Renew:服务续约
微服务启动后,会周期性(默认 30 秒)地向 Eureka Server 发送心跳。如果 Eureka Server
在一定时间内没有接收到某个微服务实例的心跳,Eureka Server 将会注销该实例(默认 90
秒)
• Cancel:服务下线
Eureka Client 在程序关闭时向 Eureka Server 发送取消请求。 发送请求后,该客户端实例
信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:
DiscoveryManager.getInstance().shutdownComponent()
服务的消费者客户端(Application Client)/(Service Consumer),有以下行为:
• Get Register:获取服务注册
从Eureka获取注册服务列表,从而消费服务
????Eureka的功能特点
既然各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载(一般配合Ribbon);监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。
·Eureka有监控页面:可在页面中直观的看到所有注册的服务的情况。
·Eureka有心跳机制:当某个节点服务在规定时间内没有发送心跳信号时,Eureka会从服务注册中把这个服务节点移除。
·Eureka有客户端缓存机制:
1.客户端会缓存服务注册表中的信息,并将其缓存在本地,该注册列表信息定期(默认 30 秒)更新一次,因此微服务无须每次请求都查询 Eureka Server,从而降低了 Eureka Server 的压力。
2.即使所有的Eureka Server都挂掉,客户端扔可以利用缓存中的信息调用服务节点的服务。
????Eureka通过心跳检查、健康检查、客户端缓存等机制,保证了系统具有高可用和灵活性!
PS:Eureka与传统负载的区别:
客户端能够获取所要调用的服务端的所有信息。
这种方式的好坏取决你看待和使用它的方式 ,如果你需要一个基于Session的负载,传统的基于代理的负载更适合。
Eureka更适合无状态的服务,这有利于应用的可扩展性。
当负载均衡中断(宕机)后,应用的高可用性。
传统基于代理的负载均衡器中断后, 整个系统不可用。 而Eureka将可用的服务端的信息缓存在客户端上,即使 Eureka Server中断后,系统依然保持可用。
????Eureka 简单示例
本文示例Eureka Server:
1.新建springboot项目:
使用官方快速创建➡:https://start.spring.io/
2.pom加入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.项目启动类加上注解
@SpringBootApplication
@EnableEurekaServer//启用EurekaServer
public class SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaApplication.class, args);
}
}
4.配置文件
application.properties文件中加入以下配置:
spring.application.name=spring-cloud-eureka
server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
也可换成yml风格(个人喜欢):
spring:
application:
name: spring-cloud-eureka
server:
port:
8000
eureka:
client:
register-with-eureka:
false
fetch-registry:
false
serviceUrl:
defaultZone: http://localhost:${server.port}/eureka/
配置文件名词解释:
- eureka.client.register-whth-eureka:表示是否将自己注册到Eureka Server,默认为true。
(这里eureka server自己作为注册中心,故设置为false)
- eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true。
(这里eureka server自己作为注册中心,故设置为false)
- eureka.client.serviceUrl.defaultZone:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
启动项目后,浏览器输入:localhost:8000,进入监控页面:
????Eureka集群
以上是Eureka注册中心的单点示例,作为一个分布式系统中最重要的基础部分,注册中心理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。
????首先尝试一下搭建双节点注册中心:
1、创建application-peer1.properties,作为peer1服务中心的配置,并将serviceUrl指向peer2
spring.application.name=spring-cloud-eureka
server.port=8000
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:8001/eureka/
2、创建application-peer2.properties,作为peer2服务中心的配置,并将serviceUrl指向peer1
spring.application.name=spring-cloud-eureka
server.port=8001
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:8000/eureka/
3、host转换
找到windows的hosts文件在:C:\Windows\System32\drivers\etc目录下
在hosts文件中加入如下配置
127.0.0.1 peer1
127.0.0.1 peer2
4、打包启动
依次执行下面命令
#打包
mvn clean package
# 分别以peer1和peeer2 配置信息启动eureka
java -jar jar包名.jar --spring.profiles.active=peer1
java -jar jar包名.jar --spring.profiles.active=peer2
依次启动完成后,浏览器输入:http://localhost:8000/
效果图如下:
根据图可以看出peer1的注册中心DS Replicas(复制品)已经有了peer2的相关配置信息,并且出现在available-replicas(可用副本)中。
我们手动停止peer2来观察,发现peer2就会移动到unavailable-replicas一栏中,表示peer2不可用。如下图:
以上就是eureka双节点的配置。
????三(多)节点集群配置
在生产中我们可能需要三台或者大于三台的注册中心来保证服务的稳定性,配置的原理其实都一样,将注册中心分别指向其它的注册中心。这里只介绍三台集群的配置情况,其实和双节点的注册中心类似,每台注册中心分别又指向其它两个节点即可,使用application.yml来配置。
application.yml配置详情如下:
---
spring:
application:
name: spring-cloud-eureka
profiles: peer1
server:
port: 8000
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8001/eureka/,http://peer3:8002/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: peer2
server:
port: 8001
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8000/eureka/,http://peer3:8002/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: peer3
server:
port: 8002
eureka:
instance:
hostname: peer3
client:
serviceUrl:
defaultZone: http://peer1:8000/eureka/,http://peer2:8001/eureka/
依次执行以下命令:
#打包
mvn clean package
# 分别以peer1/peeer2/peer3配置信息启动eureka
java -jar jar包名.jar --spring.profiles.active=peer1
java -jar jar包名.jar --spring.profiles.active=peer2
java -jar jar包名.jar --spring.profiles.active=peer3
启动完成后,打开浏览器输入:localhost:8000,效果如下:
可以看到peer2/peer3副本,eureka三节点集群搭建完成。