微服务架构之技术选型及架构设计
学习目标:
- 能够进行微服务的技术选型
- 能够搭建开发具备服务注册发现、客户负载均衡、服务间通信的微服务架构
- 熟练使用SpringCloud Eurek、SpringCloud Ribbon、restTemplate 等组件开发完成
- 掌握SpringCloud Eureka、SpringCloud Ribbon、restTemplate的基本原理
- 进行微服务的架构设计
- 开发微服务代码脚手架
- 技术选型三要素
- 保持技术面的广度和深度
- 把握和分析技术选型的优缺点
- 紧密结合项目和团队的情况
二、SpringCloud介绍
Springcloud一个工具组件集,快速搭建分布式环境的通用模式(如:服务注册与发现、负载均衡、分布式配置、分布追踪、断路器等)
SpringCloud基于SpringBoot开发,每个组件都对应一个起步依赖。
组件之间可以整合到一起发挥作用。
二、微服务技术选型
三、微服务架构设计
如何进行架构设计:
深入了解业务,满足功能性需求
非功能性需求关注扩展性,稳定性,可维护性,伸缩性,高可用,高性能
坚持kiss(Keep It Simple, Stupid)原则,防止简单问题复杂化。
- 服务注册与发现
注册中心:接受服务提供者的注册,提供服务注册者的存储信息(如:IP、端口号、服务名)与微服务保持心跳。心跳如果不能保持则注销该实例。
服务提供者:注册自己的服务到服务中心,服务提供者向注册中心发送自己的信息以及一些健康状态。
服务消费者:定期向注册中心发送查询请求,以定期获得服务提供者的一些信息(如:IP,端口号,服务名)。
获取信息之后,服务消费者就可以通过服务调用,向服务提供者发起请求。当服务提供者向注册中心发起注册和注销时,服务消费者能够接受到注册中心的通知(只有zooKeeper具备改功能)。通过变更通知服务消费者可以实时获取服务消费者的变更信息。
- Spring Cloud Eureka
Eureka简介:
Eureka是一个服务发现组件,基于REST的服务,包含Service和Client
Eureka架构图:
Eureka特点:
1. Eureka支持跨机房的高可用
2.Eureka的数据一致性是最终一致性
3.EurekaClient 会对数据进行缓存,降低数据压力。即使Eureka宕机也会重缓存中获取服务注册信息。
创建Eureka Server:
- 创建Spring Boot工程,添加eureka-server的起步依赖
- 配置文件添加eureka server相关配置
- 启动类添加注解 @EnableEurekaServer
例:第一步:
第二步:
第三步:
创建服务提供者:
- pom文件添加eureka的起步依赖
- 配置文件添加eureka.client及eureka.instance相关配置
- 启动类注解@EnableDiscoveryClient
例:
第一步:
第二步:
第三步:
创建服务消费者:
- Pom文件添加eureka的起步依赖
- 配置文件添加eureka.client相关配置
- 启动注解@EnableDiscoveryClient
例:
第一步:
第二步:
第三步:
Eureka高可用:
- 创建两个application.properties配置
- 配置到不同的profile中
- 指定profile参数分别启动
Eureka架构图:
有两个eurekaServer互相进行注册,每个eurekaServer里面都有一个服务注册表。是来自服务提供者的一些实例信息和服务信息的。
evictTimer使eurekaServer每隔一段时间回去扫描服务注册表,去扫描所有的服务是否持续发送心跳,如果没有持续发送心跳服务实例会从服务注册表中移除。
当服务实例存活低于85%(默认值)会开启自我保护模式开关,自我保护模式开关开启之后就会影响evicTimer,会关闭evicTimer。就导致所有的服务不在进行注销操作。
服务提供者会向eureka集群发送三个操作:
- 服务注册:在服务提供者启动之后,会将我们服务提供者提供的一些实例信息。也就是eureka实例开头的一些信息同步给eurekaServer。
- 定期会发送renew续约操作。
- 在服务关闭时会送cancel操作
服务提供者中有两个定时器,一个是发送续约心跳的定时器,另外是一个instanceReplicate去同步instance信息
服务消费者:里面有一个服务注册表,包含了eurekaServer中的所有注册信息。fetchRegistry定时器会向服务注册表定期的去发送fetchRegistry以获取所有的服务注册表的信息这样就可以实时的去更新服务注册表
eurekaClient会将服务注册表进行缓存,当eurekaServer不可用时,会去服务注册表中取到缓存的一些信息。
Eureka特性:
- Eureka通过相互注册与复制支持高可用
- Eureka支持用户认证
- Eureka Client支持注册表缓存(容错机制)
- Eureka的保护模式(解决网络分区故障)
- 服务提供方上报健康检查信息
- Eureka支持RESTful API(附Rest端点)
Eureka缺点:
不支持时间(注册、注销、失效)通知
- 服务通信组件RestTemplate
RestTemplate接入:
- 创建 httpclient bean
- 创建RestTempalte bean
- 添加注解@LoadBanlanced
@LoadBalanced //spring 对restTemplate bean进行定制,加入loadbalance拦截器进行ip:port的替换
RestTemplate二次封装:
- 支持直连访问
- 构建请求更容易
服务接口通用协议:
协议数据格式{“code”:”0”,”msg”:”ok”,”result”:{.....}}
借助logbook输出HTTP日志:
- Pom添加logbook依赖
- 在服务提供者工程添加logbook filter以输出日志
- 在服务消费者工程httpclient添加logbook拦截器
- Spring Cloud Ribbon
Ribbon介绍:
- Netfix公司发布的客户端负载均衡器
- 已集成在 Spring Cloud Netflix套件中
服务消费者接入ribbon(通过Eureka整合):
- Pom增加Ribbon起步依赖(可选)
- RestTemplate添加@LoadBalanced注解
- 触发服务调用观察日志
服务消费者接入ribbon(脱离Eureka):
- Pom增加Ribbon起步依赖(移除eureka及enableDiscoverClient)
- 配置文件添加listOfServers等配置
Java代码自定义Ribbon配置
- 创建客户端配置类
- 通过@RibbonClient指定客户端配置类
- 微服务代码脚手架搭建
单体服务被拆分成许多微小的服务,每个微小的服务都是一个工程。如果说我们起一个新的工程都需要从头去编写代码的话,效率非常低下。我们将所有的组件以及公共的代码抽取出来,放到一个脚手架代码工程中。这样每次创建新的服务,都能从脚手架代码中解读出来。
微服务代码脚手架组件:
- 服务注册发现组件(eureka)
- 负载均衡组件(Ribbon)
- 服务通信组件(RestTemplate)
- 数据访问层代码(连接池,数据库)
- 异常统一处理
- Http日志组件、json解析器