微服务设计(二)---springCloud基础及注册中心

1、spring Cloud概述

  Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

2、微服务中的相关概念

2.1 服务注册与发现

  服务注册:服务实例将自身服务信息注册到注册中心。这部分服务信息包括服务所在主机IP和提供服务的Port,以及暴露服务自身状态以及访问协议等信息。

  服务发现:服务实例请求注册中心获取所依赖服务信息。服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求它们提供的服务。

2.2 负载均衡

  负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。

2.3 熔断

  熔断在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。

2.4 链路追踪

  随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言 来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要对一次请求涉及的多个服务链路进行日志记录,性能监控即链路追踪。

2.5 API网关

  随着微服务的不断增多,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务 的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信可能出现: 客户端需要调用不同的url地址,增加难度再一定的场景下,存在跨域请求的问题,每个微服务都需要进行单独的身份认证针对这些问题,API网关顺势而生。 API网关直面意思是将所有API调用统一接入到API网关层,由网关层统一接入和输出。一个网关的基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。有了网关之后,各个 API服务提供团队可以专注于自己的的业务逻辑处理,而API网关更专注于安全、流量、路由等问题。

3、 SpringCloud架构

3.1 SpringCloud中的核心组件

  Spring Cloud的本质是在Spring Boot的基础上,增加了一堆微服务相关的规范,并对应用上下文 (Application Context)进行了功能增强。既然 Spring Cloud 是规范,那么就需要去实现,目前 Spring Cloud 规范已有 Spring官方,Spring Cloud Netflix,Spring Cloud Alibaba等实现。通过组件化的方式,Spring Cloud将这些实现整合到一起构成全家桶式的微服务技术栈。

   Spring Cloud Netflix组件

 

3.2 SpringCloud的体系结构

从上图可以看出Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构。

  注册中心负责服务的注册与发现,很好将各服务连接起来

  断路器负责监控服务之间的调用情况,连续多次失败进行熔断保护。

  API网关负责转发所有对外的请求和服务

  配置中心提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息

  链路追踪技术可以将所有的请求数据记录下来,方便我们进行后续分析

各个组件又提供了功能完善的dashboard监控平台,可以方便的监控各组件的运行状况

 

4、 服务注册Eureka基础

4.1 微服务的注册中心

  注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中, 服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

4.2 注册中心的主要作用

  服务注册中心(下称注册中心)是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者 的一个作用。注册中心一般包含如下几个功能:

  1. 服务发现:

    服务注册/反注册:保存服务提供者和服务调用者的信息

    服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能

    服务路由(可选):具有筛选整合服务提供者的能力。

  2. 服务配置:

    配置订阅:服务提供者和服务调用者订阅微服务相关的配置

    配置下发:主动将配置推送给服务提供者和服务调用者

  3. 服务健康检测

    检测服务提供者的健康情况。

4.3 常见的注册中心

  Zookeeper

  zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项 的管理等。简单来说zookeeper=文件系统+监听通知机制。

  Eureka

  Eureka是在Java语言上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组 件 Consul Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件, 采用Raft算法保证服务的一致性,且支持健康检查。

  Nacos

  Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是 注册中心 + 配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。Nacos 还是 Spring Cloud Alibaba 组件之一,负责服务注册与 发现。 最后我们通过一张表格大致了解Eureka、Consul、Zookeeper的异同点。选择什么类型的服务注册与 发现组件可以根据自身项目要求决定。

4.4 Eureka的概述

4.4.1 Eureka基础

  Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中, 实现SpringCloud的服务发现功能。

  上图简要描述了Eureka的基本架构,由3个角色组成:

  1、Eureka Server 提供服务注册和发现

  2、Service Provider 服务提供方 将自身服务注册到Eureka,从而使服务消费方能够找到

  3、Service Consumer 服务消费方 从Eureka获取注册服务列表,从而能够消费服务

  1.1 Eureka Server

  Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
  Eureka Server本身也是一个服务,默认情况下会自动注册到Eureka注册中心。
  如果搭建单机版的Eureka Server注册中心,则需要配置取消Eureka Server的自动注册逻辑毕竟当前服务注册到当前服务代表的注册中心中是一个说不通的逻辑。
  Eureka Server通过Register、Get、Renew等接口提供服务的注册、发现和心跳检测等服务。

  2.1 Eureka Client

  Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)
  Eureka Client分为两个角色,分别是:Application Service(Service Provider)和Application Client(Service Consumer)

4.4.2 Eureka的交互流程与原理

  图是来自Eureka官方的架构图,大致描述了Eureka集群的工作过程。图中包含的组件非常多,可能比 较难以理解,我们用通俗易懂的语言解释一下: Application Service 相当于本书中的服务提供者,Application Client相当于服务消费者; Make Remote Call,可以简单理解为调用RESTful API; us-east-1c、us-east-1d等都是zone,它们都属于us-east-1这个region; 由图可知,Eureka包含两个组件:Eureka Server 和 Eureka Client,它们的作用如下: Eureka Client是一个Java客户端,用于简化与Eureka Server的交互; Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server 进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息; 微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如 果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服 务节点(默认90秒); 每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注 册表的同步; Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费 者依然可以使用缓存中的信息找到服务提供者。 综上,Eureka通过心跳检测、健康检查和客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用性。

4.4.3 搭建Eureka注册中心

(1) 引入maven坐标

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

(2) 配置application.properties(全局配置)

spring.application.name=eureka-server # 设置spring应用命名,可以自定义,非必要

server.port: 8761 #eureka server web配置端口

eureka.instance.hostname: localhost #设置eureka实例名称,建议与配置文件的变量相同,必须和Linux系统域名相同

eureka.client.registerWithEureka: false #是否将自己注册到eureka-server中,默认为true

eureka.fetchRegistry: false #是否从eureka-server中获取服务注册信息,默认为true

euraka.serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置服务注册中心地址,指向另一个注册中心,使用域名作为访问路径


registerWithEureka: 是否将自己注册到Eureka服务中,本身就是所有无需注册 fetchRegistry : 是否从Eureka中获取注册信息 serviceUrlEureka: 客户端与Eureka服务端进行交互的地址

(3) 配置启动类

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

(5) 服务注册到Eureka注册中心

5.1 引入坐标

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-commons</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

5.2 配置application.properties文件

  在工程的 application.properties中添加Eureka Server的主机地址

 

# eureka server的路径
eureka.client.serviceUrl.efaultZone: http://localhost:8761/eureka/

instance.prefer-ip-address: true #使用ip注册

5.3 修改启动类添加服务注册注解

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

 从Spring Cloud Edgware版本开始, @EnableDiscoveryClient 或 @EnableEurekaClient 可 省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。

4.4.4 Eureka中的自我保护

  微服务第一次注册成功之后,每30秒会发送一次心跳将服务的实例信息注册到注册中心。通知 Eureka Server 该实例仍然存在。如果超过90秒没有发送更新,则服务器将从注册信息中将此服务移除。 Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况 (在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会 将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务) 验证完自我保护机制开启后,并不会马上呈现到web上,而是默认需等待 5 分钟(可以通过 eureka.server.wait-time-in-ms-when-sync-empty 配置),即 5 分钟后你会看到下面的提示信息:

如果关闭自我保护 通过设置 eureka.enableSelfPreservation=false 来关闭自我保护功能。

4.4.5 Eureka中的元数据

  Eureka的元数据有两种:标准元数据和自定义元数据。

  标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注 册表中,用于服务之间的调用。

  自定义元数据:可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式。这些元数据可以在远程客户端中访问。 在程序中可以使用DiscoveryClient 获取指定微服务的所有元数据信息

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RestTemplateTest {

 @Autowired
 private DiscoveryClient discoveryClient;
 @Test
 public void test() {
 //根据微服务名称从注册中心获取相关的元数据信息
 List<ServiceInstance> instances = discoveryClient.getInstances("shopservice-product");
 for (ServiceInstance instance : instances) {
 System.out.println(instance);
 }
 }
}

4.4.6 Eureka Server安全认证

  Eureka Server作为Spring Cloud中的服务注册中心,如果可以任意访问的话,那么其安全性太低。所以Spring Cloud中也有为Eureka Server提供安全认证的方式。可以使用spring-boot-starter-security组件来为Eureka Server增加安全认证。

  pom文件

<!-- spring boot security安全认证启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

  修改全局配置文件,在全局配置文件中,开启基于http basic的安全认证。

# eurekaserver1配置
spring.application.name=eureka-server
server.port=8761

eureka.instance.hostname=eurekaserver1
# 使用http basic安全认证语法,在集群通信中增加认证信息。  http://用户名:密码@地址:端口/eureka/
eureka.client.serviceUrl.defaultZone=http://test:123456@eurekaserver2:8761/eureka/

# 开启基于http basic的安全认证
security.basic.enabled=true
# 设置安全认证用户名
security.user.name=test
# 设置安全认证密码
security.user.password=123456
# eurekaserver2配置
spring.application.name=eureka-server
server.port=8761

eureka.instance.hostname=eurekaserver2
eureka.client.serviceUrl.defaultZone=http://test:123456@eurekaserver1:8761/eureka/

security.basic.enabled=true
security.user.name=test
security.user.password=123456

4.4.8、服务注册Eureka高级

      Eureka Server 高可用集群

   Eureka Client会定时连接 Eureka Server,获取注册表中的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数 据。因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Server中的缓存若不被刷新,就可能会影响到微服务的调用,甚至影响到整个应用系统的高可用。因此,在生成环境中,通常会部署一个高可用 的Eureka Server集群。 Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增 量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server的默认行为。

  搭建 Eureka Server高可用集群

(1)修改本机host属性 由于是在个人计算机中进行测试很难模拟多主机的情况,Eureka配置server集群时需要执行host地址。 所以需要修改个人电脑中host地址

127.0.0.1 eureka1
127.0.0.1 eureka2

(2)修改 shop_eureka_server 工程中的yml配置文件,添加如下配置属性

#指定应用名称
spring:
 application:
   name: shop-eureka-server
---
#执行peer1的配置信息
spring:
 profiles: eureka1
server:
 port: 8761
eureka:
 instance:
   hostname: eureka1
 client:
   service-url:
     defaultZone: http://eureka2:8762/eureka
---
#执行peer2的配置信息

参考:https://www.cnblogs.com/jing99/p/11576133.html

5 Eureka替换方案Consul

5.1 Eureka闭源影响

    在Euraka的GitHub上,宣布Eureka 2.x闭源。近这意味着如果开发者继续使用作为 2.x 分支上现有工作 repo 一部分发布的代码库和工件,则将自负风险。

5.2 Eureka的替换方案

  Zookeeper            

  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包 括:配置维护、域名服务、分布式同步、组服务等。 Consul consul是近几年比较流行的服务发现工具,工作中用到,简单了解一下。consul的三个主要应用场景: 服务发现、服务隔离、服务配置。 Nacos Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管 理和服务管理平台。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性 集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地 构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原 生范式) 的服务基础设施。

5.2 什么是consul

5.2.1 consul 概述

  Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服 务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实 现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。 使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和 Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。 Consul 的优势: 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心 的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中 心功能的支持。 支持健康检查。 etcd 不提供此功能。 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。 官方提供 web 管理界面, etcd 无此功能。 综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究。 特性: 服务发现 健康检查 Key/Value 存储多数据中心

5.2.2 consul与Eureka的区别

(1)一致性 Consul强一致性(CP) 服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认 为注册成功 Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。 Eureka保证高可用和最终一致性(AP) 服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否 replicate成功 当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提 供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。

(2)开发语言和使用 eureka就是个servlet程序,跑在servlet容器中 Consul则是go编写而成,安装启动即可

5.2.3 Consul的核心知识

  Gossip协议 传统的监控,如ceilometer,由于每个节点都会向server报告状态,随着节点数量的增加server的压力 随之增大。在所有的Agent之间(包括服务器模式和普通模式)运行着Gossip协议。服务器节点和普通 Agent都会加入这个Gossip集群,收发Gossip消息。每隔一段时间,每个节点都会随机选择几个节点发送Gossip消息,其他节点会再次随机选择其他几个节点接力发送消息。这样一段时间过后,整个集群都能收到这条消息。示意图如下:

RAFT一致性算法

  为了实现集群中多个ConsulServer中的数据保持一致性,consul使用了基于强一致性的RAFT算法。 在Raft中,任何时候一个服务器可以扮演下面角色之一:

1. Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader;

2. Follower: 类似选民,完全被动;

3. Candidate(候选人): 可以被选为一个新的领导人。

Leader全权负责所有客户端的请求,以及将数据同步到Follower中(同一时刻系统中只存在一个 Leader)。Follower被动响应请求RPC,从不主动发起请求RPC。Candidate由Follower向Leader转换 的中间状态 关于RAFT一致性算法有一个经典的动画http://thesecretlivesofdata.com/raft/,其中详细介绍了选举,数据同步的步骤。

5.2.4 Consul 常见问题

(1)节点和服务注销 当服务或者节点失效,Consul不会对注册的信息进行剔除处理,仅仅标记已状态进行标记(并且不可使用)。如果担心失效节点和失效服务过多影响监控。可以通过调用HTTP API的形式进行处理。

(2)健康检查与故障转移  在集群环境下,健康检查是由服务注册到的Agent来处理的,那么如果这个Agent挂掉了,那么此节点的健康检查就处于无人管理的状态。 从实际应用看,节点上的服务可能既要被发现,又要发现别的服务,如果节点挂掉了,仅提供被发现的 功能实际上服务还是不可用的。当然发现别的服务也可以不使用本机节点,可以通过访问一个Nginx实 现的若干Consul节点的负载均衡来实现。

 

 感谢阅读,借鉴了不少大佬资料,如需转载,请注明出处,谢谢!https://www.cnblogs.com/huyangshu-fs/p/13876009.html

 

posted on 2022-09-15 23:40  ys-fullStack  阅读(1192)  评论(0编辑  收藏  举报