登山不以艰险而止,则必臻乎峻岭矣
1. 微服务
1.1 定义
微服务是一种高内聚,低耦合架构风格,James Lewis,Martin Fowler
1.2 解决方案
序号 | 名称 | API | 通信 | 服务注册与发现 | 熔断机制 |
---|---|---|---|---|---|
1 | Cloud NetFlix 一站式解决方案 | zuul组件 | 基于Httpclient —Http通信方式:同步、阻塞 | Eureka | Hystrix |
2 | Apache Dubbo Zookeeper半自动,需要整合别人的 | 无,需要自己实现 | Dubbo | Zookeeper | 无,借助Hystrix |
3 | Spring Cloud Alibaba 一站式解决方案,更简单 | Zuul 和 Gateway组件 | Dubbo | Nacos | Sentinel |
1.3 优缺点
序号 | 优点 | 缺点 |
---|---|---|
1 | 松耦合 | 开发人员要处理分布式系统的复杂性 |
2 | 单一职责原则 | 多服务运维难度,随着服务的增加,运维的压力也在增大 |
3 | 易于和第三方集成 | 服务间通信成本 |
4 | 易于修改和维护等 | 数据一致性等 |
1.4 技术栈
微服务条目 | 技术 |
---|---|
服务开发 | springboot, spring, springmvc |
服务配置与管理 | Netflix公司的Archaius, 阿里的Diamond等 |
服务注册与发现 | Eureka, Consul, Zookeeper等 |
服务调用 | Rest, RPC, gRPC |
服务熔断器 | Hystrix, Envoy等 |
负载均衡 | Ribbon, Nginx等 |
服务接口调用(客户端调用服务的简化工具) | Feign等 |
消息队列 | Kafka, RabbitMQ, ActiveMQ等 |
服务配置中心管理 | SpringCloudConfig, cher等 |
服务路由(API网关) | zuul等 |
服务监控 | Zabbix, Nagios, Metrice, Specatator等 |
全链路追踪 | Zipkin, Brave, Dapper等 |
服务部署 | Docker, OpenStack, Kubernetes等 |
数据流操作开发包 | SpringCloud Stream(封装与Redis, Rabbit, KafKa等发送接收消息) |
事务消息总线 | SpringClound Bus |
1.5 微服务架构
阿里:dubbo+HFS
京东:JSF
新浪:Motan
当当网: DubboX
功能点/服务框架 | Netflix/SpringCloud | Motan | gRPC | Thrift | Dubbo/DubboX |
---|---|---|---|---|---|
功能定位 | 完整的微服务框架 | RPC框架,但整合了ZK或Consul,实现集群环境的基本服务注册发现 | RPC框架 | RPC框架 | 服务框架 |
支持Rest | 是,Ribbon支持多种可拔插的序列号选择 | 否 | 否 | 否 | 否 |
支持RPC | 否 | 是(Hession2) | 是 | 是 | 是 |
支持多语言 | 是(Rest形式) | 否 | 是 | 是 | 否 |
负载均衡 | 是(服务端zuul+客户端Ribbon),zuul-服务,动态路由,云端负载均衡Eureka(针对中间层服务器) | 是(客户端) | 否 | 否 | 是(客户端) |
配置服务 | Netfix Archaius,Spring Cloud Config Server 集中配置 | 是(Zookeeper提供) | 否 | 否 | 否 |
服务调用链监控 | 是(zuul),zuul提供边缘服务,API网关 | 否 | 否 | 否 | 否 |
高可用/容错 | 是(服务端Hystrix+客户端Ribbon) | 是(客户端) | 否 | 否 | 是(客户端) |
典型应用案例 | Netflix | Sina | |||
社区活跃程度 | 高 | 一般 | 高 | 一般 | 2017年后重新开始维护,之前中断了5年 |
学习难度 | 中等 | 低 | 高 | 高 | 低 |
文档丰富程度 | 高 | 一般 | 一般 | 一般 | 高 |
其他 | Spring Cloud Bus为我们的应用程序带来了更多管理端点 | 支持降级 | Netflix内部在开发集成gRPC | IDL定义 | 实践的公司比较多 |
2. SpringCloud
2.1 定义
SpringCloud,基于SpringBoot提供了-套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
springcloud学习1
springcloud中文API文档
SpringCloud中国社区
SpringCloud中文网
2.2 Dubbo 和 SpringCloud对比
最大区别:Spring Cloud 抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式
名称/服务 | Dubbo | SpringCloud |
---|---|---|
服务注册中心 | Zookeeper | Spring Cloud Netfilx Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | Spring Boot Admin |
断路器 | 不完善 | Spring Cloud Netfilx Hystrix |
服务网关 | 无 | Spring Cloud Netfilx Zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总栈 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
2.3 版本
spring-boot-starter-parent | spring-cloud-dependencles | ||
---|---|---|---|
版本号 | 发布日期 | 版本号 | 发布日期 |
2.0.2.RELEASE | 2018-05 | Fomchiey.BULD-SNAPSHOT | 2018-x |
2.0.6.RELEASE | 2018-10 | Fomchiey-SR2 | 2018-10 |
2.1.4.RELEASE | 2019-04 | Greenwich.SR1 | 2019-03 |
3. SpringCloud开发
3.1 导入依赖
1 |
|
3.2 进行新建springboot项目或者maven项目
- springcloud-api
- springcloud-provider
- springcloud-consumer
3.3 springcloud-api编写
- pom.xml
1 |
|
- User.java
1 |
|
3.4 springcloud-provider编写
- pom.xml
1 |
|
- application.yml
1 | server: |
- UserMapper.java
1 |
|
- UserMapper.xml
1 |
|
- UserService.java
1 | package com.xxy.springcloud.service; |
- UserServiceImpl.java
1 | package com.xxy.springcloud.service; |
- UserController.java
1 | package com.xxy.springcloud.controller; |
- 启动类UserProvider_8081
1 | package com.xxy.springcloud; |
3.5 springcloud-consumer编写
- pom.xml
1 |
|
- application.yml
1 | server: |
- config.java
1 | package com.xxy.springcloud.config; |
- UserConsumerController.java
1 | package com.xxy.springcloud.controller; |
- 启动类UserConsumer_80.java
1 | package com.xxy.springcloud; |
- 输入
localhost/consumer/select/100
测试
4. Eureka服务注册与发现
此已经过时,了解思想即可,nacos
4.1 简述
- 定义
Eureka是Netflix的一个子模块,遵循AP原则,实现服务注册和发现,Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper
- 基本架构
- Eureka Server:提供服务注册与发现。和zookeeper客户端一样
- Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到
- Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务
4.2 开发
- 导入依赖pom.xml
1 |
|
- 配置application.yml
1 | server: |
- 启动类EurekaServer_7001.java
1 | package com.xxy.springcloud; |
- 输入
localhost:7001
进行测试
4.3 注册和发现提供者端
导入依赖
进行配置
1 | eureka: |
- 启动类增加@EnableEurekaClient
1 |
|
- 输入
localhost:7001
进行测试
4.4 自我保护机制
某时刻某一个微服务不可以用了 , eureka不会立刻清理,依旧会对该微服务的信息进行保存!
默认情况下,如果EurekaServer在一定时间内没有接收到某 个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。 但是当网络分区故障发生时,微服务与Eureka之间无法正常通行,以上行为可能变得非常危险了—- 因为微服务本身其实是健康的,此时本不应该注销这个服务。Eureka通过 自我保护机制来解决这个问题–当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障) , 那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务) .当网络故障恢复后,该EurekaServer节 点会自动退出自我保护模式。
自我保护模式是-种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮和稳定
在SpringCloud中, 可以使用 eureka. server. enable-self-preservation = false 禁用自我保护模式[不推荐关闭自我保护机制]
4.5 Eureka集群环境配置
对应的 Eureka Server服务的状态是UP,
则不会向另外两个节点(eureka7002,eureka7003)发送请求,
相应地页面上也就没有显示。一旦停止 eureka7001 服务注册中心,则 user-8001 服务会向 eureka7002 发送注册请求。
- 导入依赖
- 进行配置
1 | server: |
- 分别配置启动类
4.6 Eureka和Zookeeper
Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。
- 简述
- RDBMS (Mysql. Oracle. sqlServer) ==> ACID
- NoSQL (redis. mongdb) ==>CAP
- CAP
CAP的三进二: CA、AP、 CP
- C (Consistency) 强一致性
- A (Availabilty)可用性
- P (Partition tolerance)分区容错性
- CAP核心
- CA:单点集群,满足-致性,可用性的系统,通常可扩展性较差
- CP: 满足- -致性,分区容错性的系统,通常性能不是特别高
- AP:满足可用性。分区容错性的系统,通常可能对一致性要求低一些
- 对比
对比/对象 | Eureka | Zookeeper |
---|---|---|
CAP | AP | CP |
5. Ribbno负载均衡
5.1 简述
- 定义
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端负载均衡的工具,Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址
- 负载均衡分类
- 集中式LB
即在服务的消费方和提供方之间使用独立的LB设施,如Nginx, 由该设施负责把访问请求通过某种策略转发至服务的提供方
- 进程式LB
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器
5.2 开发
- 导入依赖
1 | <!--Eureka--> |
- 进行配置和扩展
1 | server: |
1 |
|
1 | //消费者 运行方式80可省略 例:localhost/consumer/dept/list |
- 开发
1 | //声明提供者的localhost路径 |
- 修改算法
- 在不能被全局引入下创建RuleConfig
1 | //自定义Ribbon配置的负载均衡类,客户端RibbonConfiguration中已存在的组件与FooConfiguration中的任何组件组成(后者通常会覆盖前者) |
- 更改算法
1 | public class DiyRandomRule extends AbstractLoadBalancerRule { |
- 引用注解
1 | //消费者 运行方式80可省略 例:localhost/consumer/dept/list |
6. Feign负载均衡
6.1 简述
- 定义
Feign旨在使编写Java Http客户端变得更容易
- Feign与Ribbon的区别
Ribbon和Feign都是用于调用其他服务的,不过方式不同。
不同点 | Ribbon | Feign |
---|---|---|
风格 | RestFul | 面向接口 |
启动类使用的注解 | @RibbonClient | @EnableFeignClients |
服务的指定位置 | Ribbon是在@RibbonClient注解上声明 | Feign则是在定义抽象方法的接口中使用@FeignClient声明 |
调用方式不同 | Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。 | Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致 |
6.2 开发
- springcloud-api
- 导入依赖
1 | <dependency> |
- DeptClientService.java
1 |
|
- springcloud-consumer-dept-feign
- 导入依赖
1 | <dependency> |
- DeptConsumerController
1 |
|
- DeptConsumer_feign启动类
1 | //消费者 运行方式80可省略 例:localhost/consumer/dept/list |
7. Hystrix 服务熔断
7.1 简述
- 定义
分布式系统面临的问题: 复杂分布式结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失效,Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一 个依赖出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
- 用处
- 服务降级
- 服务熔断
- 服务限流
- 接近实时的监控等等
- 服务熔断
熔断机制是对应雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况, 当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand.
7.2 服务熔断
- 导入依赖
1 | <dependency> |
- 进行配置或者扩展
- 配置文件
1 | server: |
- 启动类@EnableHystrix
1 | package com.xxy.springcloud; |
- 开发controller
1 |
|
- 输入
http://localhost:8082/user/select/数据库没有的id
进行测试
7.3 服务降级
被动服务熔断会服务降级,主动关闭服务也会服务降级,熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,服务降级处理是在客户端实现完成的,与服务端没有关系
- 配置
1 | #开启降级Feign Hystrix |
- 在springcloud-api中或者新建的springcloud-api-feign项目中的service包中创建DeptClientServiceFallbackFactory降级服务类
1 | //Hystrix 降级,当服务端关闭后的提示信息 |
- 增加注解@FeignClient(value = “SPRINGCLOUD-PROVIDER-DEPT”,fallbackFactory = DeptClientServiceFallbackFactory.class)
1 |
|
7.4 Dashboard流监控
- 导包
1 | <dependency> |
- 配置
1 | #Hystrix的dashboard流监控 端口 |
- 启动类@EnableHystrixDashboard
1 |
|
- 在
springcloud-provider-hystrix
中启动类
1 | package com.xxy.springcloud; |
- 输入
localhost:8001/actuator/hystrix.stream
进行测试
8. Zuul路由网关
已经过时,了解思想即可,推荐GetWay
8.1 简述
- 定义
Zuul包含了对请求的路由和过滤两个最主要的功能,Zuul服务最终还是会注册进Eureka,代理+路由+过滤三大功能
- Zuul组件
- zuul-core–zuul核心库,包含编译和执行过滤器的核心功能
- zuul-simple-webapp–zuul Web应用程序示例,展示了如何使用zuul-core构建应用程序
- zuul-netflix–lib包,将其他NetflixOSS组件添加到Zuul中,例如使用功能区进去路由请求处理
- zuul-netflix-webapp–webapp,它将zuul-core和zuul-netflix封装成一个简易的webapp工程包
8.2 Zuul开发
- 导依赖
1 | <!--Zuul路由网关 9527端口--> |
- 配置
可以在
C:\Windows\System32\drivers\etc\hosts
模拟zuul网关
1 | 127.0.0.1 www.lijie.com |
1 | server: |
9. SpringCloud config分布式配置中心
9.1 简述
- 定义
Spring Cloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
- 组成
Spring Cloud Config 分为服务端和客户端两部分;
服务端也称为分布式配置中心,它是一 个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口。
- 解决的问题
- 集中管理配置文件
- 不同环境,不同配置,动态化的配置更新,分环境部署,比如/dev /test/ /prod /beta /release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
- 当配置发生变动时,服务不需要重启,即可感知到配置的变化,井应用新的配置
- 将配置信息以REST接口的形式暴露
9.2 config-server开发
新建gitee仓库
初始化git
1 | # 显示当前的Git配置 |
- 新建application.yml文件
1 | spring: |
- 提交码云
1 | GitBash打开命令工具 |
- 导入依赖
1 |
|
- 配置application.yml
1 | server: |
- 启动类加@EnableConfigServe
1 |
|
- 输入
localhost:3344/application-dev.yml
进行测试
9.3 config-client开发
- 新建config-client.yml文件
1 | #启动环境选择的配置 |
- 提交到码云
1 | GitBash打开命令工具 |
- 导入依赖
1 |
|
- 创建application.yml,并配置
1 | #用户级别的配置 配置去读取谁 |
- 创建bootstrap.yml,配置
1 | # 系统级别的配置 |
- 启动类
1 | package com.xxy.springcloud; |
- Controller
1 | package com.xxy.springcloud.controller; |
- 输入
http://localhost:8201/config
进行测试,结果为:
applicationName: springcloud-config-client-deveurekaServer: http://localhost:7001/eurekaport: 8201
9.4 实际开发
- 修改eureka配置文件,将配置加入码云中
- config-eureka.yml
1 | spring: |
- 将user:8081提供者配置文件改变
- config-user.yml
1 | spring: |
- 提交到码云
1 | GitBash打开命令工具 |
- 新建项目,导入依赖
1 |
|
- applicaation.yml
1 | spring: |
- bootstrap.yml
1 | # 系统级别的配置 |
其他复制 springcloud-eureka所有的内容,除配置文件,进行测试
http://localhost:3344/config-eureka-dev.yml
,http://localhost:7001/
复制springcloud-provider-user所有内容
修改application.yml
1 | spring: |
- 新增bootstrap.yml文件
1 | # 系统级别的配置 |
- 分别输入
http://localhost:3344/config-user-dev.yml
,http://localhost:7001/
,localhost:8081/user/select/
进行测试,能够显示结果说明Springcloud config成功
10. 总结
本文以Springcloud Netflix为例子主要了解了微服务的网关 、服务注册与发现、负载均衡(通信)、服务熔断,其他的像监控、Spring Cloud Config,这些,其他微服务像Spring Alibaba可以以此为例子学习和对比。