springcloud --Eureka
Eureka介绍
又称服务中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等。
任何一个服务都不能直接去掉用,都需要通过注册中心来调用。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。
由于各种服务都注册到了服务中心,就有了很多高级功能条件。比如几台服务提供相同服务来做客户端负载均衡(Ribbon);监控服务器调用成功率来做断路器(Hystrix),移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重、智能路有(Zuul)等等。
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。
Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
1、Eureka Server
- Eureka Server 作为一个独立的部署单元,以 REST API 的形式为服务实例提供了注册、管理和查询等操作。同时,Eureka Server 也为我们提供了可视化的监控页面,可以直观地看到各个 Eureka Server 当前的运行状态和所有已注册服务的情况。多个服务会同步复制。
- 存储元信息:嵌套map 存储,第一层服务信息,第二层 实列信息。
2、Service Provider
- 服务提供方
- 将自身服务注册到Eureka,从而使服务消费方能够找到
3、Service Consumer
- 服务消费方
- 从Eureka获取注册服务列表,从而能够消费服务
创建项目工程
使用maven 创建一个聚合工程,使用工具idea,创建相关的父子工程。
父工程pom.xml
Springboot版本 2.1.4.RELEASE springcloud版本 Greenwich.RELEASE
因为springcloud是使用springboot实现的,所以要使用其相关的版本
pom
imooc-homepage-springcloud
Project For ImoocHomepage SpringCloud
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
Greenwich.RELEASE
org.projectlombok
lombok
1.16.18
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
spring-milestones
Spring Milestones
https://repo.spring.io/milestone
false
创建出的项目工程的结构是,父模块可以将 src 目录进行删除
工程创建
单节点的Eureka 项目开发
创建一个Euraka子工程,pom文件如下
homepage-eureka 1.0-SNAPSHOT jar homepage-eureka Spring Cloud Eureka org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.boot spring-boot-maven-plugin
Springboot启动类配置如下
package com.imooc.homepage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * 标识 spring boot 是一个 eureka server */ @EnableEurekaServer @SpringBootApplication public class EurakeApplication { public static void main(String[] args) { SpringApplication.run(EurakeApplication.class,args); } }
application.yml文件的配置信息
spring: application: name: homepage-eureka server: port: 8000 eureka: instance: hostname: localhost client: # eureka.client.fetch-registry: 表示是否从 Eureka Server 获取注册信息,默认为true。如果这是一个单点的 Eureka Server,不需要同步其他节点的数据,设为false fetch-registry: false # eureka.client.register-with-eureka: 表示是否将自己注册到 Eureka Server, 默认为true。由于当前应用就是 Eureka Server, 因此设为 false register-with-eureka: false # 设置 Eureka Server 所在的地址,查询服务和注册服务都需要依赖这个地址 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
目录结构
至此现在可以运行该服务。启动后
多节点的Eureka的实现
在本地电脑上实现一个多节点的Eureka 需要去修改 hosts文件 添加三个主机名称
C:\Windows\System32\drivers\etc
127.0.0.1 server1 127.0.0.1 server2 127.0.0.1 server3
Springboot 启动前会先加载 bootstrap.yml文件,然后在去加载application.yml文件。所以通用的配置可以放到bootstrap.yml。将单节点的配置信息注释,使用bootstrap.yml的配置
spring: application: name: homepage-eureka profiles: server1 server: port: 8000 eureka: instance: hostname: server1 prefer-ip-address: false client: service-url: defaultZone: http://server2:8001/eureka/,http://server3:8002/eureka/ --- spring: application: name: homepage-eureka profiles: server2 server: port: 8001 eureka: instance: hostname: server2 prefer-ip-address: false client: service-url: defaultZone: http://server1:8000/eureka/,http://server3:8002/eureka/ --- spring: application: name: homepage-eureka profiles: server3 server: port: 8002 eureka: instance: hostname: server3 prefer-ip-address: false client: service-url: defaultZone: http://server1:8000/eureka/,http://server2:8001/eureka/
将项目打包,使用 以下命令分别启动 三个服务。
java -jar homepage-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server1
在启动项目时会报错误,可能是其他服务没有启动起来,尝试注册时报的错。启动成功后如下