前言
Spring Cloud是一系列框架的有序集合。Spring Cloud关注全局的服务治理框架,它利用Spring Boot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册,配置中心,消息总线,负载均衡,熔断器,数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟,经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单,易部署和易维护的分布式系统开发工具包。
我们都知道,Eureka是属于Spring Cloud众多框架之一,那Spring Cloud中除了Eureka还有哪些主要框架呢?
- 服务发现——Netflix Eureka
- 服务调用——Netflix Feign
- 熔断器——Netflix Hystrix
- 服务网关——Netflix Zuul
- 分布式配置——Spring Cloud Config
- 消息总线——Spring Cloud Bus
Eureka简介
Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server 和Eureka Client。
(1) Eureka Server
Eureka Server 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
(2) Eureka Client
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也是一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向Eureka Server 发送心跳,默认周期为30秒,如果Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。也就是说,Eureka通过心跳检查,客户端缓存等机制,确保了系统的高可用性,灵活性和扩展性。
软件环境
- Windows 10
- JDK1.8
- IDEA 2019.3
- Spring Boot 2.0.1.RELEASE
- Spring Cloud Finchley.SR2
Eureka服务端开发
1、新建一个project叫tensquare_parent52,在project中创建一个maven模块名字叫 tensquare_eureka
2、引入依赖,父工程 tensquare_parent52 的 pom.xml 中定义SpringCloud版本(spring-cloud-dependencies版本为Finchley.SR2)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_parent52</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>tensquare_base</module>
<module>tensquare_qa</module>
<module>tensquare_eureka</module>
</modules>
<packaging>pom</packaging>
<name>tensquare_parent</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- spring cloud eureka -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
</dependencies>
</project>
tensquare_eureka模块中的pom.xml引入 eureka-server的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>tensquare_parent52</artifactId>
<groupId>com.tensquare</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_eureka</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
3、添加application.yml文件
server:
port: 6868
eureka:
client:
register-with-eureka: false #不需要把当前服务注册到eureka上,所以配置为false
fetch-registry: false # 是否从Eureka中获取注册信息
service-url:
defaultZone: http://127.0.0.1:${server.port}/eureka/
4、tensquare_eureka 模块的启动类添加注解
@EnableEurekaServer
5、启动运行 tensquare_eureka 模块,然后在浏览器地址输入 http://localhost:6868/
,运行结果如下:
服务注册
在project中再新建两个maven模块,叫做test1和test2。现在将test1和test2这两个模块都注册到Eureka中,这样这两个模块(或叫微服务)之间就可以互相调用了。
1、将微服务模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、修改每个微服务模块的application.yml文件,添加注册eureka服务的配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/ # 注册地址
instance:
prefer-ip-address: true # 模块之间可以跨域访问
3、修改每个微服务的启动类,添加注解
@EnableEurekaClient
4、启动测试:将每个微服务模块启动起来,会发现eureka的注册列表中可以看到这些微服务了。
保护模式
如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式:
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳 定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的 数据(也就是不会注销任何微服务)。
小结
其实Eureka的使用主要就是三个步骤:
1、添加依赖
2、在配置文件中添加eureka相关配置
3、启动类添加注解