springcloud服务注册

第一阶段课程Spring Cloud技术点

Eureka:服务注册与发现,用于服务管理。

Feign: web调用客户端,能够简化HTTP接口的调用。

Ribbon:基于客户端的负载均衡。

Hystrix:熔断降级,防止服务雪崩。

Zuul:网关路由,提供路由转发、请求过滤、限流降级等功能。

Config:配置中心,分布式配置管理。

Sleuth:服务链路追踪

Admin:健康管理

微服务特性

独立运行在自己进程中。

一系列独立服务共同构建起整个系统。

一个服务只关注自己的独立业务。

轻量的通信机制RESTful API

使用不同语言开发

全自动部署机制

微服务组件介绍

不局限与具体的微服务实现技术。

  • 服务注册与发现:服务提供方将己方调用地址注册到服务注册中心,让服务调用方能够方便地找到自己;服务调用方从服务注册中心找到自己需要调用的服务的地址。

  • 负载均衡:服务提供方一般以多实例的形式提供服务,负载均衡功能能够让服务调用方连接到合适的服务节点。并且,服务节点选择的过程对服务调用方来说是透明的。

  • 服务网关:服务网关是服务调用的唯一入口,可以在这个组件中实现用户鉴权、动态路由、灰度发布、A/B测试、负载限流等功能。

    灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
    
  • 配置中心:将本地化的配置信息(Properties、XML、YAML等形式)注册到配置中心,实现程序包在开发、测试、生产环境中的无差别性,方便程序包的迁移,也是无状态特性。

  • 集成框架:微服务组件都以职责单一的程序包对外提供服务,集成框架以配置的形式将所有微服务组件(特别是管理端组件)集成到统一的界面框架下,让用户能够在统一的界面中使用系统。Spring Cloud就是一个集成框架。

  • 调用链监控:记录完成一次请求的先后衔接和调用关系,并将这种串行或并行的调用关系展示出来。在系统出错时,可以方便地找到出错点。

  • 支撑平台:系统微服务化后,各个业务模块经过拆分变得更加细化,系统的部署、运维、监控等都比单体应用架构更加复杂,这就需要将大部分的工作自动化。现在,Docker等工具可以给微服务架构的部署带来较多的便利,例如持续集成、蓝绿发布、健康检查、性能监控等等。如果没有合适的支撑平台或工具,微服务架构就无法发挥它最大的功效。

    1. 蓝绿部署是不停老版本,部署新版本然后进行测试,确认OK,将流量切到新版本,然后老版本同时也升级到新版本。
    2. 灰度是选择部分部署新版本,将部分流量引入到新版本,新老版本同时提供服务。等待灰度的版本OK,可全量覆盖老版本。
    
    灰度是不同版本共存,蓝绿是新旧版本切换,2种模式的出发点不一样。
    

微服务优点

  1. 独立部署。不依赖其他服务,耦合性低,不用管其他服务的部署对自己的影响。
  2. 易于开发和维护:关注特定业务,所以业务清晰,代码量少,模块变的易开发、易理解、易维护。
  3. 启动块:功能少,代码少,所以启动快,有需要停机维护的服务,不会长时间暂停服务。
  4. 局部修改容易:只需要部署 相应的服务即可,适合敏捷开发。
  5. 技术栈不受限:java,node.js等
  6. 按需伸缩:某个服务受限,可以按需增加内存,cpu等。
  7. 职责专一。专门团队负责专门业务,有利于团队分工。
  8. 代码复用。不需要重复写。底层实现通过接口方式提供。
  9. 便于团队协作:每个团队只需要提供API就行,定义好API后,可以并行开发。

微服务缺点

  1. 分布式固有的复杂性:容错(某个服务宕机),网络延时,调用关系、分布式事务等,都会带来复杂。

  2. 分布式事务的挑战:每个服务有自己的数据库,有点在于不同服务可以选择适合自身业务的数据库。订单用MySQL,评论用Mongodb等。目前最理想解决方案是:柔性事务的最终一致性。

    刚性事务:遵循ACID原则,强一致性。
    柔性事务:遵循BASE理论,最终一致性;与刚性事务不同,柔性事务允许一定时间内,不同节点的数据不一致,但要求最终一致。
    
    BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩写。BASE理论是对CAP中AP的一个扩展,通过牺牲强一致性来获得可用性,当出现故障允许部分不可用但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终达到一致状态。满足BASE理论的事务,我们称之为“柔性事务”。
    
  3. 接口调整成本高:改一个接口,调用方都要改。

  4. 测试难度提升:一个接口改变,所有调用方都得测。自动化测试就变的重要了。API文档的管理也尤为重要。推荐:yapi。

  5. 运维要求高:需要维护 几十 上百个服务。监控变的复杂。并且还要关注多个集群,不像原来单体,一个应用正常运行即可。

  6. 重复工作:比如java的工具类可以在共享common.jar中,但在多语言下行不通,C++无法直接用java的jar包。

代码步骤

  1. pom.xml
  2. application.yml
  3. java代码

看代码。

服务注册与发现

Eureka 单节点搭建

  1. pom.xml

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    有的教程中还引入spring-boot-starter-web,其实不用。因为上面的依赖已经包含了它。在pom中点此依赖进去,一共点4次spring-cloud-netflix-eureka-server,发现web的依赖。
    
    
  2. application.yml

    eureka: 
      client:
        #是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息
        register-with-eureka: false
        #是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false
        fetch-registry: false
        #设置服务注册中心的URL,用于client和server端交流
        service-url:                      
          defaultZone: http://localhost:7900/eureka/
    
  3. application.properties

    #是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息
    eureka.client.register-with-eureka=false
    #是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false
    eureka.client.fetch-registry=false
    #设置服务注册中心的URL,用于client和server端交流
    eureka.client.service-url.defaultZone=http://localhost:7900/eureka/
    
  4. 代码

    启动类上添加此注解标识该服务为配置中心
    @EnableEurekaServer
    
  5. PS:Eureka会暴露一些端点。端点用于Eureka Client注册自身,获取注册表,发送心跳。

  6. 简单看一下eureka server控制台,实例信息区,运行环境信息区,Eureka Server自身信息区。

Eureka 介绍

整体介绍

  1. 背景:在传统应用中,组件之间的调用,通过有规范的约束的接口来实现,从而实现不同模块间良好的协作。但是被拆分成微服务后,每个微服务实例的网络地址都可能动态变化,数量也会变化,使得原来硬编码的地址失去了作用。需要一个中心化的组件来进行服务的登记和管理。
  2. 概念:实现服务治理,即管理所有的服务信息和状态。
注册中心相当于买票乘车,只看有没有票(有没有服务),有就去买票(获取注册列表),然后乘车(调用)。不必关心有多少火车在运行。
  1. 注册中心好处:不用关心有多少提供方。

  2. 注册中心有哪些:Eureka,Nacos,Consul,Zookeeper等。

  3. 服务注册与发现包括两部分,一个是服务器端,另一个是客户端。

    Server是一个公共服务,为Client提供服务注册和发现的功能,维护注册到自身的Client的相关信息,同时提供接口给Client获取注册表中其他服务的信息,使得动态变化的Client能够进行服务间的相互调用。

    Client将自己的服务信息通过一定的方式登记到Server上,并在正常范围内维护自己信息一致性,方便其他服务发现自己,同时可以通过Server获取到自己依赖的其他服务信息,完成服务调用,还内置了负载均衡器,用来进行基本的负载均衡。

  4. 我们课程的Spring Cloud是用Eureka作为服务注册中心。

  5. Eureka:是一个RESTful风格的服务,是一个用于服务发现和注册的基础组件,是搭建Spring Cloud微服务的前提之一,它屏蔽了Server和client的交互细节,使得开发者将精力放到业务上。

  6. serverA从serverB同步信息,则serverB是serverA的peer。

  7. 上面例子中如果service-url为空,且register-with-eureka,fetch-registry为true,则会报错,Cannot execute request on any known server,因为server同时也是一个client,他会尝试注册自己,所以要有一个注册中心url去注册。

  8. Netflix开源的组件。包括server和client两部分。

    https://github.com/Netflix/Eureka
    

注册中心和微服务间的关系

client功能

  1. 注册:每个微服务启动时,将自己的网络地址等信息注册到注册中心,注册中心会存储(内存中)这些信息。
  2. 获取服务注册表:服务消费者从注册中心,查询服务提供者的网络地址,并使用该地址调用服务提供者,为了避免每次都查注册表信息,所以client会定时去server拉取注册表信息到缓存到client本地。
  3. 心跳:各个微服务与注册中心通过某种机制(心跳)通信,若注册中心长时间和服务间没有通信,就会注销该实例。
  4. 调用:实际的服务调用,通过注册表,解析服务名和具体地址的对应关系,找到具体服务的地址,进行实际调用。

server注册中心功能

  1. 服务注册表:记录各个微服务信息,例如服务名称,ip,端口等。

    注册表提供 查询API(查询可用的微服务实例)和管理API(用于服务的注册和注销)。

  2. 服务注册与发现:注册:将微服务信息注册到注册中心。发现:查询可用微服务列表及其网络地址。

  3. 服务检查:定时检测已注册的服务,如发现某实例长时间无法访问,就从注册表中移除。

组件:Eureka , Consul , ZooKeeper,nacos等。

服务注册

例子:api-listen-order

  1. pom.xml
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
  1. application.yml
#注册中心
eureka: 
  client:
    #设置服务注册中心的URL
    service-url:                      
      defaultZone: http://root:root@localhost:7900/eureka/

ps:不想注册,设置成false即可,实例演示结果:注册中心没有实例信息。找控制台204信息也没有找到。

spring: 
  cloud:
    service-registry:
      auto-registration:
        enabled: false

注册成功:

DiscoveryClient_API-LISTEN-ORDER/api-listen-order:30.136.133.9:port - registration status: 204

后面源码讲手动注册。

PS:

Eureka Server与Eureka Client之间的联系主要通过心跳的方式实现。心跳(Heartbeat)即Eureka Client定时向Eureka Server汇报本服务实例当前的状态,维护本服务实例在注册表中租约的有效性。

Eureka Client将定时从Eureka Server中拉取注册表中的信息,并将这些信息缓存到本地,用于服务发现。

服务调用

Eureka高可用

高可用:可以通过运行多个Eureka server实例并相互注册的方式实现。Server节点之间会彼此增量地同步信息,从而确保节点中数据一致。

搭建步骤

1.准备

准备2个节点部署eureka,也可以单机部署

修改本机host文件,绑定一个主机名,单机部署时使用ip地址会有问题

2.配置文件

节点 1:

#是否将自己注册到其他Eureka Server,默认为true 需要
eureka.client.register-with-eureka=true
#是否从eureka server获取注册信息, 需要
eureka.client.fetch-registry=true
#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://ek2.com:7902/eureka/
#主机名,必填
eureka.instance.hostname=ek1.com
management.endpoint.shutdown.enabled=true
#web端口,服务是由这个端口处理rest请求的
server.port=7901

节点 2:

#是否将自己注册到其他Eureka Server,默认为true 需要
eureka.client.register-with-eureka=true
#是否从eureka server获取注册信息, 需要
eureka.client.fetch-registry=true
#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://ek1.com:7902/eureka/
#主机名,必填
eureka.instance.hostname=ek2.com
management.endpoint.shutdown.enabled=true
#web端口,服务是由这个端口处理rest请求的
server.port=7902

节点 1:

如果有节点3,配置同上 改一下主机名和端口

略。。。

两个节点的话,如下图内容 就算成功了

使用Spring Boot2.x Actuator监控应用

开启监控

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

默认端点

Spring Boot 2.0 的Actuator只暴露了health和info端点,提供的监控信息无法满足我们的需求

在1.x中有n多可供我们监控的节点,官方的回答是为了安全….

开启所有端点

在application.yml中加入如下配置信息

*代表所有节点都加载

#开启所有端点
management.endpoints.web.exposure.include=*

所有端点都开启后的api列表

{"_links":{"self":{"href":"http://localhost:8080/actuator","templated":false},"archaius":{"href":"http://localhost:8080/actuator/archaius","templated":false},"beans":{"href":"http://localhost:8080/actuator/beans","templated":false},"caches-cache":{"href":"http://localhost:8080/actuator/caches/{cache}","templated":true},"caches":{"href":"http://localhost:8080/actuator/caches","templated":false},"health":{"href":"http://localhost:8080/actuator/health","templated":false},"health-path":{"href":"http://localhost:8080/actuator/health/{*path}","templated":true},"info":{"href":"http://localhost:8080/actuator/info","templated":false},"conditions":{"href":"http://localhost:8080/actuator/conditions","templated":false},"configprops":{"href":"http://localhost:8080/actuator/configprops","templated":false},"env":{"href":"http://localhost:8080/actuator/env","templated":false},"env-toMatch":{"href":"http://localhost:8080/actuator/env/{toMatch}","templated":true},"loggers":{"href":"http://localhost:8080/actuator/loggers","templated":false},"loggers-name":{"href":"http://localhost:8080/actuator/loggers/{name}","templated":true},"heapdump":{"href":"http://localhost:8080/actuator/heapdump","templated":false},"threaddump":{"href":"http://localhost:8080/actuator/threaddump","templated":false},"metrics":{"href":"http://localhost:8080/actuator/metrics","templated":false},"metrics-requiredMetricName":{"href":"http://localhost:8080/actuator/metrics/{requiredMetricName}","templated":true},"scheduledtasks":{"href":"http://localhost:8080/actuator/scheduledtasks","templated":false},"mappings":{"href":"http://localhost:8080/actuator/mappings","templated":false},"refresh":{"href":"http://localhost:8080/actuator/refresh","templated":false},"features":{"href":"http://localhost:8080/actuator/features","templated":false},"service-registry":{"href":"http://localhost:8080/actuator/service-registry","templated":false}}}

api端点功能

Health

会显示系统状态

{"status":"UP"}

shutdown

用来关闭节点

开启远程关闭功能

management.endpoint.shutdown.enabled=true

使用Post方式请求端点

{

"message": "Shutting down, bye..."

}

autoconfig

获取应用的自动化配置报告
beans

获取应用上下文中创建的所有Bean

configprops

获取应用中配置的属性信息报告

env

获取应用所有可用的环境属性报告

Mappings

获取应用所有Spring Web的控制器映射关系报告

info

获取应用自定义的信息

metrics

返回应用的各类重要度量指标信息

Metrics节点并没有返回全量信息,我们可以通过不同的key去加载我们想要的值

metrics/jvm.memory.max

Threaddump

1.x中为dump

返回程序运行中的线程信息

posted @ 2021-01-05 17:56  panda's  阅读(443)  评论(0编辑  收藏  举报