微服务(一)

最近学习完了互联网架构,正在进行复习,想写一点东西来加深自己的印象,顺便记录一下学习过程。这是我的第一篇文章,根据课上的笔记进行整理总结的一部分包括微服务的简介,eureka,ribbon,zuul,config,hystrix,feign,这里刚写完eureka和ribbon。
1.什么是微服务
微服务是一种构建应用的架构方案。与传统的单体项目结构不同,微服务可将
应用拆分出多个核心功能,每个功能都可以被称为一项服务。每个服务都可以进行单独的构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。
从字面上理解,“微”就是进行纵向拆分后,和原有功能相比变得小了;“服务”服务体现在调用,只要是一个具有功能的web应用,被别人调用,就可以称为一个服务。
1.1 微服务的特点
1.独立,每个web应用都可以看成一个微服务
2.易于开发和维护
3.不会因为一个服务故障从而导致整个项目无法正常运行
2.微服务框架
常用的微服务框架
• springboot+dubbo
• springboot+springcloud
• springboot+springcloud+alibaba cloud
springcloud:spring的一个子项目,由多个成熟组件组成的一套框架技术
• Eureka:服务治理
• ribbon:客户端调用服务
• Zuul:网关
• Config:配置组件
• feign:客户端调用服务
• Hystrix:熔断器
3.Eureka服务治理组件
3.1 eureka概括
Netflix公司的一个服务治理组件,被springcloud团队引入,成为springcloud框架的核心组件。
3.2 eureka治理组件的原理
eureka服务端:管理治理所有的客户端(为服务提供者)
eureka客户端:具有被调用功能的每一个微服务
1.客户端功能
当添加了一个eureka-client组件到一个springboot工程时,依赖,属性,注解会启动一个eureka-client进程,完成和服务端的交互
○ 注册:程序启动时会携带自身的信息,包括服务名称,包括ip地址,包括端口号,等参数,以http协议请求访问 defaultZone
可以通过 eureka.client.register-with-eureka=true/false决定当前客户端是否进行注册
○ 抓取注册信息:在启动之后,客户端默认每隔30秒中,继续访问服务端接口,进行抓取注册信息的功能,将服务端所有注册好的信息,同步到本地
可以通过 eureka.client.fetch-registry=true/false决定开启关闭抓取功能
○ 心跳续约:为了让注册中心动态管理存活的有效的客户端,客户端默认每隔30秒中,向服务端发送一次心跳存活请求.在服务端接到请求,更新客户端信息时间戳.

同一个服务,可以有多个客户端作为服务提供者同时注册在注册中心
2.服务端功能
管理注册信息:接收到客户端注册时,会接受参数(客户端服务名称,ip,port,等等),在内存生成一个双层的map对象
Map<String ,Map<String,String>>
第一层map的key值:服务名称
第一层map的value值:第二层map对象(管理所有同服务名称的服务提供者)
第二层map的key值:区分不同实例的名字
第二层map的value值:保存了该节点该服务提供者详细信息的instance对象(ip,port,时间戳)
超时剔除:服务端启动定时任务,每隔60秒钟运行一次定时任务,扫描所有注册信息instance对象时间戳,计算判断,如果发现有超过90秒心跳,将会作为超时的实例从注册信息中删除。
保护机制:正常的微服务集群,肯定会因为故障,网络延迟导致总是有超时的实例从注册信息提出.网络故障的面积非常大,影响了集群中大部分的节点发送心跳,如果严格执行超时提出,导致微服务集群注册信息丢失,整个集群的功能瘫痪.设置了一个超时剔除的阈值(15%,超过总体节点数量15%,同一时间剔除),开启保护机制,不剔除任何服务信息.
3.注册中心的高可用结构
单独的注册中心,无法保证微服务集群的高可用.需要注册中心的高可用结构保障服务的正常访问使用.
高可用结构
多个注册中心,相互注册,相互抓取,相互同步管理的注册信息
4.ribbon组件
4.1ribbon概括
springcloud中基础组件,通过eureka客户端抓取注册信息,实现负载均衡的计算,完成服务的调用.可以通过服务名称进行服务调用
微服务的调用客户端组件,一切在springcloud的微服务被调用的逻辑全部都是ribbon实现的
4.2ribbon的工作原理
○ eureka-client客户端组件从eureka-server抓取了注册信息,包含服务名称下的所有服务实例
○ 访问ribbon工程时,调用一个特殊RestTemplate,http请求都会经过ribbon拦截
ribbon拦截逻辑

  1. 从url中解析解析域名作为服务名称
  2. 通过服务名称从map中拿到key值对应实例列表
  3. 负载均衡计算,从列表中计算拿到一个实例(ip:port)
  4. 将实例的ip和端口拼接在原有url域名最终发送出去
    zuul过滤器
    String filterType
    返回值表示了过滤器的类型,zuul网关中根据需求不同,拦截不同点对应不同的类型:pre route error post
    □ pre:刚进入网关就执行的过滤器
    □ route:完成路由计算之后的过滤器
    □ error:前两种出现异常,进入error
    □ post:所有的过滤器最后执行,执行一些收尾工作
    int filterOrder
    当前过滤器的执行顺序,同一种类型的过滤器方法的返回值越小,执行顺序越靠前
    boolean shouldFilter
    判断当前请求是否需要进入过滤器逻辑,进行过滤计算.判断之后返回true,进过过滤,false不进入过滤
    Object run
    当shouldFilter返回值是true,调用run方法拦截该请求,执行过滤逻辑,甚至拦截逻辑.