分布式: 概念详解 & Eureka & CAP

项目架构变化

单体架构: 单体架构就是一个项目里面包含这个项目中全部代码。一个应用程序完成全部功能的实现。
分布式架构: 分布式架构会把一个项目按照特定要求(多按照模块或功能)拆分成多个项目,每个项目分别部署到不同的服务器上。

分布式架构的两种实现方式
1.SOA架构:
面向服务架构。通过模块进行拆分,并通过这些服务之间定义好的接口和协议联系起来。
核心在于ESB(企业服务总线 Enterprise Service Bus)
在这里插入图片描述
2.微服务架构: 拆分颗粒度为业务
在这里插入图片描述

区别:
SOA架构: 核心消息总线。在SOA架构中每个项目都满足分布式要求,分别部署到不同的服务器上。
微服务服务架构:核心是把项目拆分成多个小服务,不要求每个服务独占一台服务器,可以结合Docker等把多个服务部署到一台服务器上。

分布式和集群的区别:
分布式: 一种软件架构。把一个项目拆分成多个项目,每个拆分后的项目部署到不同的服务器上。
集群:把同一个软件部署多次,每个软件部署到不同的服务器上,让这些软件共同完成相同的事情。
如果把集群中所有软件都安装到一台服务器上,此时称为伪集群,学习期间都搭建是伪集群。

微服务架构主流实现框架

1.Spring Cloud Netflix : 目前市场上使用最多的。
2.Spring Cloud Alibaba:基于Dubbo的微服务架构体系实现。
3.Spring 其他:为了摆脱受Netflix公司限制,逐渐推出一套组件。

Eureka

服务注册和发现工具,平时说的注册中心
Eureka中分为两个角色: Eureka Server和Eureka Client本质都是一个Java项目

Eureka Server: 注册中心
Eureka Client: 注册到Eureka Server中的应用,注册后才能通过注册中心获取到项目信息和项目所在服务器信息,Spring Cloud中每个项目调用的信息都存储在了注册中心中(Eureka)。

Eureka Client: 分为Application Service和Application Client,两者为相对角色

注意: 如果A项目访问B项目,称A项目为Application Client,称B项目为Application Service。同时可能存在C访问A的情况,这是C项目是Application Client,A项目是Application Service。发现A项目又是Application Service又是Application Client

搭建单机版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>

配置文件:

server:
  port: 8761# 默认
eureka:
  client:
    # 因为当前项目为服务,不需要向服务注册自己,默认为true
    register-with-eureka: false
    # 因为当前为非集群版eureka,所以不需要同步其他节点数据
    fetch-registry: false
# 当server.port配置不是8761时需要配置内容.eureka server 端口号要和tomcat一致!!!!!!!!!
#    service-url:
#      defaultZone: http://localhost:${server.port}/eureka/

3.启动类
@EnableEurekaServer注解,表示当前应用开启 Eureka Server 服务注册与发现功能。(一定要加)

@SpringBootApplication
@EnableEurekaServer
public class MyApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(MyApplication.class,args);
    }
}

4.访问Eureka管理平台
访问 http://IP:8761/

搭建Eureka Client

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.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 所有基于Eureka注册中心实现服务注册与发现的应用,都必须依赖,代表当前应用是一个Eureka Client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

2.配置文件
1.其中spring.application.name为当前应用注册到eureka server后的服务名字。名字中不能使用下划线,否则可能出现无法注册的问题。
2.Eureka Server注册中心默认地址是localhost:8761,如果注册中心不符合默认配置,则必须提供eureka.client.service-url.defaultZone配置。

# 此处应该定义名称,否则注册到Server后的名字为UNKNOWN
spring:
  application:
    name: eureka-client
# 注册中心地址,默认值是http://localhost:8761/eureka/,可省略
#eureka:
#  client:
#    service-url:
#      defaultZone: http://localhost:xxxx/eureka/

3.启动类型
启动类上的注解@EnableEurekaClient代表当前应用是一个Eureka客户端,启动后会根据配置信息,把当前应用服务信息注册到Eureka Server注册中心。此注解默认生效,是可以省略的。

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(EurekaClientApplication.class,args);
    }
}

在这里插入图片描述
Application: 配置文件中定义的应用程序名称,即服务名字。
Status:状态。UP - 表示正在执行,smallming - Eureka Client微服务所在服务器的主机名,eureka-client定义应用程序名称

搭建Eureka Server集群

服务端
在虚拟机的linux系统上和windows上分别搭建一个Eureka Server相互注册
1.打包插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

2.配置文件
windows配置文件: application-windows.yml

spring:
  application:
    name: eureka-server-cluster # 两个配置文件的应用名称必须一致。只有同名的服务才会组建成集群!!!!!!!!!!!!!!!!
server:
  port: 8761
eureka:
  instance:
    prefer-ip-address: true #开启ip支持,默认关闭!!!!!!!!!!!!!!!!!!!!!!!!!!! 
  client:
    service-url:
    	#这里写集群内其他所有的Eureka Server地址,即相互注册,有多少写多少,用逗号分隔!!!!!!!!!!!!!!!!!!
      defaultZone: http://192.168.6.101:8761/eureka/ # 基于主机名,把当前应用注册到另一个eureka server中。

linux配置文件: application-linux.yml

spring:
  application:
    name: eureka-server-cluster
server:
  port: 8761
eureka:
  instance:
    prefer-ip-address: true #开启ip支持,默认关闭!!!!!!!!!!!!!!!!!!!!!!!!!!! 
  client:
    service-url:
    #这里写集群内其他所有的Eureka Server地址,即相互注册,有多少写多少,用逗号分隔!!!!!!!!!!!!!!!!!!
      defaultZone: http://192.168.6.100:8761/eureka/ # 基于主机名,把当前应用注册到另一个eureka server中。

3.部署并启动
上传打包好的jar文件到Linux服务器。在Linux和Windows系统中.
分别执行名:java -jar -Dspring.profiles.active=配置文件名(yml|properties 不含后缀) 打包后jar包名称

java -jar -Dspring.profiles.active=win eureka-server-1.0-SNAPSHOT.jar
java -jar -Dspring.profiles.active=linux eureka-server-1.0-SNAPSHOT.jar

客户端:
更改客户端配置文件:

:
  client:
    service-url:
    	# 如果只写一个ip,这个ip挂了,这个客户端的信息就不能同步到其他eureka server,所以最好写多个ip
    	#有多少的个eureka server ip 就写几个,用逗号分隔!!!!!!!!!!!!!!!!!!!!!!!
    	#客户端会先找第一个ip,正常连接了,这个连接的eureka server 会同步到其他的eureka server,
    	#第一个连接不上,会找下一个......
      defaultZone: http://192.168.6.100:8761/eureka/,http://192.168.6.101:8761/eureka/

Eureka Server集群原理

1.同步数据: 所有Eureka Server会进行数据同步。无论Eureka Client向哪个Eureka Server中注册信息,最终所有Eureka Server中都会存储注册的信息且缓存到Eureka Server的本地。每个Eureka Server中同步后的数据都是完全相同的。

2.客户端发送心跳包: Eureka Client启动后,每隔30秒向Eureka Server发送一次心跳,证明自己的可用。当Eureka Server超过90秒没有收到提供者的心跳后,会认为这个提供者已经宕机,销毁实例。

3.Eureka Server自我保护机制: 当15分钟内超过85%的Eureka Client都没有正常的心跳包时,Eureka认为Server和Client之间出现了网络问题。这个时候将不在因为没有收到心跳而销毁实例。虽然Eureka Client依然可以访问Server,但是Server不会把内容同步到其他Server中。当网络稳定后,Server会把注册的信息同步到其他Server中。

4.如果重新启动Eureka Server,会销毁所有实例。
在Eureka中自我保护机制默认为开启的:
可以关闭:

eureka:
  server:
    # 关闭自我保护
    enable-self-preservation: false
    # 扫描失效服务的时间间隔
    eviction-interval-timer-in-ms: 10000

也可以配置发送心跳包周期和销毁时间:

#不建议更改这个两个配置  使用默认的即可
client
#配置发送心跳时间 默认是30s
eureka.instance.lease-renewal-interval-in-seconds=5
#最长超过多久 删除注册列表 默认是90s
eureka.instance.lease-expiration-duration-in-seconds=5

CAP

CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。 由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。

1.C: 数据必须实时同步,否则不响应(一致性Consistency)在分布式系统中,是否立即达到数据同步的效果(平时多说的强一致性)。在分布式系统一定最终会一致的。如果请求时,整个分布式系统同步后才返回结果,叫做强一致性(满足一致性)。如果先返回结果,在一定时间后才实现一致性就叫做弱一致性。

2.A: 最终一致,任何时候都有响应,但是数据不一定是最新的,(可用性Availability),在分布式系统中,保证每个请求不管成功或者失败都有响应。

3.P: 某个节点不能用,不影响集群,仍能对外提供服务(分区容错性)在分布式系统中, 即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务,是否可以在有限的时间内达到数据一致的效果,如果因为网络等问题最终没有达到一致性,这时称为出现分区错误。

Eureka是符合AP原则的。
在Eureka集群中所有的节点都是保存完整的信息的,当Eureka Client向Eureka中注册信息时,如果发现节点不可用,会自动切换到另一台Eureka Server,也就是说整个集群中即使只有一个Eureka可用,那么整个集群也是可用的。同时Eureka的自我保护机制也是可用性非常重要的体现。

猜你喜欢

转载自blog.csdn.net/m0_56182317/article/details/130003958
今日推荐