前言
本篇主要介绍的是 SpringCloud 相关知识, 微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka).
SpringCloud 介绍
Spring Cloud 是在 Spring Boot 的基础上构建的, 用于简化分布式系统构建的工具集, 为开发人员提供快速建立分布式系统中的一些常见的模式.
例如:
配置管理(configuration management), 服务发现(service
discovery), 断路器 (circuit breakers), 智能路由( intelligent routing), 微代理(micro-proxy), 控制总线(control bus), 一次性令牌( one-time okens), 全局锁(global locks), 领导选举(leadership election), 分布式会话(distributed sessions), 集群状态(cluster state) 等等.
微服务架构是什么
微服务架构风格是一种将单个应用程序开发为一套小型服务的方法, 每个小型服务都在自己的流程中运行, 并与轻量级机制 (通常是 HTTP 资源 API) 进行通信. 这些服务围绕业务功能构建, 可通过全自动部署机制独立部署. 这些服务至少集中管理, 可以用不同的编程语言编写, 并使用不同的数据存储技术.
SpringCloud Eureka
Eureka 介绍
Eureka 是 Netflix 开源的一款提供服务注册和发现的产品, 它提供了完整的 Service Registry 和 Service Discovery 实现. 也是 springcloud 体系中最重要最核心的组件之一.
Eureka 主要由两个组件组成: Eureka 服务器和 Eureka 客户端.
Eureka 服务器用作服务注册服务器.
Eureka 客户端是一个 java 客户端, 用来简化与服务器的交互, 作为轮询负载均衡器, 并提供服务的故障切换支持.
开发准备
开发环境
- JDK:1.8
- SpringBoot:2.1.1.RELEASE
- SpringCloud:Finchley
注: 不一定非要用上述的版本, 可以根据情况进行相应的调整. 需要注意的是 SpringBoot2.x 以后, jdk 的版本必须是 1.8 以上!
确认了开发环境之后, 我们再来添加相关的 pom 依赖.
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
注: 基于 SpringBoot1.x 以上 SpringCloud 是 Dalston 版本的 eureka 依赖是 <artifactId>spring-cloud-starter-eureka</artifactId>, 少了个 netflix .SpringCloud 的版本命名方式是通过伦敦的地方来命名的, 版本顺序是根据首字母的顺序来的.
SpringCloud Eureka Hello World
我们先来实现 Eureka 的 Hello World 版, 其实也就是实现简单的服务注册和发现功能.
服务端
首先建立一个服务端的工程, 添加如上的依赖之后, 在 application.properties 添加如下的配置:
配置信息:
- spring.application.name=springcloud-eureka-client
- server.port=8000
- eureka.client.register-with-eureka=false
- eureka.client.fetch-registry=false
- eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
配置说明:
spring.application.name: 这个是指定服务名称.
server.port: 服务指定的端口.
eureka.client.register-with-eureka: 表示是否将自己注册到 Eureka Server, 默认是 true.
eureka.client.fetch-registry: 表示是否从 Eureka Server 获取注册信息, 默认为 true.
eureka.client.serviceUrl.defaultZone: 这个是设置与 Eureka Server 交互的地址, 客户端的查询服务和注册服务都需要依赖这个地址.
完成配置信息的添加后, 我们再来看代码如何实现.
在服务端这边只需要在 SpringBoot 启动类添加 @EnableEurekaServer 注解就可以了, 该注解表示此服务是一个服务注册中心服务.
代码示例:
- @EnableEurekaServer
- @SpringBootApplication
- public class App {
- public static void main(String[] args) {
- SpringApplication.run(App.class, args);
- System.out.println("注册中心服务启动...");
- }
- }
客户端
这里我们在新建一个客户端的项目, 添加如上的依赖之后, 在 application.properties 添加如下的配置:
配置信息:
- spring.application.name=springcloud-eureka-client
- server.port=9001
- eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
配置说明:
spring.application.name: 这个是客户端的服务名称. 如果有多个服务使用同一个名称但是访问地址不同, 结合 ribbon 使用, 则可以实现负载均衡功能.
server.port: 服务指定的端口.
eureka.client.serviceUrl.defaultZone: 注册中心服务端的地址.
服务端这边的实现也很简单, 只需在启动类上添加 @EnableDiscoveryClient 该注解即可, 使用该注解表示该项目就具有了服务注册的功能.
代码示例:
- @SpringBootApplication
- @EnableDiscoveryClient
- public class App {
- public static void main(String[] args) {
- SpringApplication.run(App.class, args);
- System.out.println("客户端服务启动...");
- }
- }
功能测试
完成如上的工程开发之后, 我们依次启动服务端和客户端程序, 然后在浏览器界面输入: http://localhost:8000/, 即可查看注册中心的信息.
访问界面地址:
通过上述示例图中, 可以看到 Eureka 启动成功了, 并且有一个服务进行注册了.
成功的实现了服务注册功能之后, 我们来测试下 Eureka 服务的保护机制.
这里我们先关闭客户端, 查看界面信息, 发现没什么改变, 等待大约 15 分钟左右之后, 再到 Eureka 界面查看信息, 发现出现了一长串红字描述, 描述的语句如下:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
翻译之后的意思:
紧急! EUREKA 可能错误地声称实例已经启动, 而实际上并没有. 续订小于阈值, 因此实例不会为了安全而过期.
界面示例图:
这里就顺便说下 Eureka 的自我保护机制.
自我保护模式正是一种针对网络异常波动的安全保护措施, 使用自我保护模式能使 Eureka 集群更加的健壮, 稳定的运行.
自我保护机制的工作机制是如果在 15 分钟内超过 85% 的客户端节点都没有正常的心跳, 那么 Eureka 就认为客户端与注册中心出现了网络故障, Eureka Server 自动进入自我保护机制, 此时会出现以下几种情况:
Eureka Server 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务.
Eureka Server 仍然能够接受新服务的注册和查询请求, 但是不会被同步到其它节点上, 保证当前节点依然可用.
当网络稳定时, 当前 Eureka Server 新的注册信息会被同步到其它节点中.
因此 Eureka Server 可以很好的应对因网络故障导致部分节点失联的情况, 而不会像 ZK 那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪.
自我保护机制的相关配置如下:
服务端的配置:
eureka.server.enable-self-preservation: 该配置可以移除这种自我保护机制, 防止失效的服务也被一直访问 (Spring Cloud 默认该配置是 true).
eureka.server.eviction-interval-timer-in-ms: 该配置可以修改检查失效服务的时间, 每隔 10s 检查失效服务, 并移除列表 (Spring Cloud 默认该配置是 60s)
客户端的配置:
eureka.instance.lease-renewal-interval-in-seconds: 该配置指示 eureka 客户端需要向 eureka 服务器发送心跳的频率 (Spring Cloud 默认该配置是 30s).
eureka.instance.lease-expiration-duration-in-seconds: 该配置指示 eureka 服务器在接收到最后一个心跳之后等待的时间, 然后才能从列表中删除此实例 (Spring Cloud 默认该配置是 90s).
这里顺便说下 Eureka 的的心跳机制.
Eureka Client 需要每 30 秒给 Eureka Server 发一次心跳, 同时更新 Server 上最新的注册信息到本地, 如果 Server 多次没有收到来自客户端的心跳, 那么在 90 秒内会被 Server 上剔除.
高可用的注册中心
上述的服务注册中心示例是单点的, 如果在生产环境中就显得不适合, 显然这并不适合应用于线上生产环境. 作为分布式系统最重要的注册服务功能, 为了使其高可用, 使用集群是最普遍的方式. Eureka 可以通过互相注册的方式来实现高可用的部署.
Eureka 实现相互注册的方式很简单, 只需要将各个服务端的地址相互进行配置即可.
那么我们再来新建两个服务端的工程, 其中配置信息如下:
server2 配置信息:
- spring.application.name=springcloud-eureka-server
- server.port=8002
- eureka.instance.hostname = server2
- eureka.client.serviceUrl.defaultZone=http://server3:8003/eureka/
server3 配置信息:
- spring.application.name=springcloud-eureka-server
- server.port=8003
- eureka.instance.hostname = server3
- eureka.client.serviceUrl.defaultZone=http://server2:8002/eureka/
上述的配置在之前已经说过了, 这里就不在过多描述了. 这里的服务端配置和之前项目的服务端配置略有不同, 允许自己进行注册了. 并且这里的 eureka.instance.hostname 相当于是对服务地址起一个别名, 也可以不配置, 默认将会使用 IP 进行查找. eureka.client.serviceUrl.defaultZone 这里配置的是另一个服务端的地址, 如果是多个就通过 "," 逗号隔开.
因为这里使用了别名进行区分服务, 所以需要在 hosts 文件添加如下配置, 用于做映射.
- 127.0.0.1 server2
- 127.0.0.1 server3
hosts 文件地址:
Windows 系统地址: C:\Windows\System32\drivers\etc\hosts
Linux 系统地址: /etc/hosts
配置完成之后, 启动这两个服务, 然后在浏览器输入:
http://server2:8002/
或
http://server3:8003/
即可查看信息.
高可用注册中心示例图:
这里我们把之前的客户端程序的配置改下, 改成指定这个高可用注册中心的地址, 然后在关闭其中一个服务, 查看是否能够正常的使用.
示例图:
可以看到其中一个服务可以正常运行和使用!
其他
项目地址
基于 SpringBoot1.x,SpringCloud 的 Dalston 版本开发的地址: https://github.com/xuwujing/springcloud-study.
基于 SpringBoot1.x,SpringCloud 的 Dalston 版本开发的地址: https://github.com/xuwujing/springcloud-study-old.
如果感觉项目不错, 希望能给个 star, 谢谢!
音乐推荐
挺有节奏感的一首纯音乐!
原创不易, 如果感觉不错, 希望给个推荐! 您的支持是我写作的最大动力!
来源: https://www.cnblogs.com/xuwujing/p/10269570.html