一、架构
(1)单体架构
单体架构就是一个项目里面包含这个项目中全部代码。一个应用程序完成全部功能的实现。
优点
部署简单、维护方便、开发成本低。
缺点
当项目规模大、用户访问频率高、并发量大、数据量大时,会大大降低程序执行效率,甚至出现服务器宕机等情况。
维护成本高、改动影响大(无论是修改1行代码,还是10行代码,都要全量替换)、部署频率低(无法快速交付客户需求)。无法满足快速扩容,弹性伸缩,无法适应云环境特性等问题。
(2)分布式架构
分布式架构会把一个项目按照特定要求(多按照模块或功能)拆分成多个项目,每个项目分别部署到不同的服务器上。
优点
增大了系统可用性。减少单点故障,导致整个应用不可用。
增加重用性。因为模块化,所以重用性更高。
增加可扩展性。有新的模块增加新的项目即可。
增加每个模块的负载能力。因为每个模块都是一个项目,所以每个模块的负载能力更强。
缺点
开发成本更高。
架构更加复杂。
整体响应时间变长,一些业务需要多项目通信后给出结果。
(3)分布式架构 - SOA架构
SOA架构:Service-Oriented Architecture 面向服务架构。面向服务架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。此架构的核心在于ESB(企业服务总线 Enterprise Service Bus),ESB因过于笨重在目前新项目中已经很少使用了。
(4)分布式架构 - 微服务架构
微服务架构是分布式架构中的一种。
微服务(MicroService)的概念最早是在 年由 Martin Fowler 和 James Lewis 共同提出,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计(微服务一个业务一个项目),以全自动方式部署,与其他服务使用特性的通讯协议(如:HTTP或RPC等)(每个项目都是一个标准的web项目)。同时,服务会使用最小规模的集中管理 (例如 Docker)技术,服务可以用不同的编程语言与数据库等。
微服务的核心在于:
微服务是分布式架构的一种。发展到现在微服务已经可以说是综合平台(架构以外还包含服务治理、注册中心、服务容灾等相关特性)。
微服务架构中每个Web项目都称为服务。
微服务拆分颗粒度为业务。
微服务中服务和服务之间使用特定协议通信(如:HTTP、PRC)。
微服务和Docker结合使用更方便。
二、微服务常见框架
当前市场主流的微服务实现框架就是:Spring Cloud。目前包含三大体系,分别是:
Spring Cloud Netflix : 目前市场上使用最多的。也是本阶段学习的主体内容。
Spring Cloud Alibaba:基于Dubbo的微服务架构体系实现。
Spring 其他:为了摆脱受Netflix公司限制,逐渐推出一套组件。
三、Eureka介绍
Eureka是由Netflix公司推出的服务注册和发现工具(Service Discovery,平时说的注册中心)。现已被Spring Cloud集成,提供了开箱即用的支持。(直接在项目中直接集成,快捷使用)
(1)Eureka角色
Eureka中分为两个角色:Eureka Server(Eureka服务)和Eureka Client(Eureka客户端)。无论是服务端还是客户端其本质都是一个Java项目,在Spring Cloud中主要通过启动类上添加@EnableEurekaServer和@EnableEurekaClient(可以省略)来区分当前应用程序是服务端还是客户端。
(2)Eureka Server
可以理解成Zookeeper注册中心,只是现在使用的是Java项目实现的(Spring Cloud内嵌Eureka)。
(3)Eureka Client
可以理解成所有需要注册到Eureka Server中的应用。为什么需要向注册中心中注册呢?因为注册后别人才能通过注册中心获取到项目信息和项目所在服务器信息,通过这些信息调用这个项目。Spring Cloud中每个项目调用的信息都存储在了注册中心中(Eureka)。
四、Eureka Server搭建
(1)导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
(2)配置文件
server:
port: 8761
eureka:
client:
# 因为当前项目为服务,不需要向服务注册自己,默认为true
register-with-eureka: false
# 因为当前为非集群版eureka,所以不需要同步其他节点数据
fetch-registry: false
# 当server.port配置不是8761时需要配置内容
# service-url:
# defaultZone: http://localhost:${server.port}/eureka/
(3)启动类
@SpringBootApplication@EnableEurekaServerpublic class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class,args);}}
五、Eureka Client微服务
(1)依赖相同
(2)配置文件
# 此处应该定义名称,否则注册到Server后的名字为UNKNOWN
spring:
application:
name: eureka-client
# 注册中心地址,默认值是http://localhost:8761/eureka/,可省略
#eureka:
# client:
# service-url:
# defaultZone: http://localhost:8761/eureka/
(3)启动类
@SpringBootApplication@EnableEurekaClientpublic class EurekaClientApplication {public static void main(String[] args) {SpringApplication.run(EurekaClientApplication.class,args);}}
六、Eureka Server自我保护机制
Eureka中有一种自我保护机制。当15分钟内低于85%的Eureka Client都正常的心跳包时,Eureka认为Server和Client之间出现了网络问题。这个时候将不在因为没有收到心跳而销毁实例。Eureka Client依然可以访问Server,但是Server不会把内容同步到其他Server中。当网络稳定后,Server会把注册的信息同步到其他Server中。
使用配置文件设置
eureka:
server:
# 关闭自我保护
enable-self-preservation: false
# 扫描失效服务的时间间隔
eviction-interval-timer-in-ms: 10000
七、优雅关闭
Spring Boot提供的Actuator(监视器,监控中心)可以实现应用的优雅关闭。Spring Cloud 是基于Spring Boot的框架,一样可以依赖Actuator来实现微服务应用的优雅关闭。
(1)导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)配置文件
management:
endpoints:
# 所有功能默认开启
enabled-by-default: true
# 显示所有已启用功能
web:
exposure:
include: shutdown # '*' 代表所有
(3)测试
Actuator提供的优雅关闭服务地址是: http://IP:Port/actuator。必须使用POST请求访问此路径地址。
八、搭建Eureka Server高可用集群
(1)打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
(2)配置文件application-windows.yml
spring:
application:
name: eureka-server-cluster # 两个配置文件的应用名称必须一致。只有同名的服务才会组建成集群。
server:
port: 8761
eureka:
instance:
# 当前eureka server实例的所在主机的主机名。
hostname: eureka-windows
client:
service-url:
defaultZone: http://eureka-linux:8761/eureka/ # 基于主机名,把当前应用注册到另一个eureka server中。
(3)配置文件application-linux.yml
spring:
application:
name: eureka-server-cluster
server:
port: 8761
eureka:
instance:
# 当前eureka server实例的所在主机的主机名。
hostname: eureka-linux
client:
service-url:
defaultZone: http://eureka-windows:8761/eureka/ # 基于主机名,把当前应用注册到另一个eureka server中。
(4)配置主机名
Linux系统修改配置/etc/hosts文件。Windows系统修改配置文件C:\Windows\System32\drivers\etc\hosts文件。在hosts文件中增加下述内容:(windows和linux系统一致)。下述案例是伪配置信息,注意修改具体IP。
192.168.x.xxx eureka-windows
192.168.y.yyy eureka-linux
(5)部署启动
java -jar -Dspring.profiles.active=windows eureka-server-1.0-SNAPSHOT.jar
(6)注册
eureka:
client:
service-url:
defaultZone: http://eureka-windows:8761/eureka/,http://eureka-linux:8761/eureka/
九、CAP定理
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。 由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。
C(一致性Consistency):在分布式系统中,是否立即达到数据同步的效果(平时多说的强一致性)。在分布式系统一定最终会一致的。如果请求时,整个分布式系统同步后才返回结果,叫做强一致性(满足一致性)。如果先返回结果,在一定时间后才实现一致性就叫做弱一致性。
A(可用性Availability):在分布式系统中,其中一些节点出现问题,整个整体是否还可用。
P(分区容错性):在分布式系统中,是否可以在有限的时间内达到数据一致的效果,如果因为网络等问题最终没有达到一致性,这时称为出现分区错误。
Eureka满足的CAP?
Eureka是符合AP原则的。
在Eureka集群中所有的节点都是保存完整的信息的,当Eureka Client向Eureka中注册信息时,如果发现节点不可用,会自动切换到另一台Eureka Server,也就是说整个集群中即使只有一个Eureka可用,那么整个集群也是可用的。同时Eureka的自我保护机制也是可用性非常重要的体现。
如果觉得《Spring Cloud Netfilx Eureka(服务发现工具)》对你有帮助,请点赞、收藏,并留下你的观点哦!