微服务是一种架构风格。
说起微服务,不得不提到两个人:James Lewis和 Martin Fowler,他们在2014年发表了一篇文章Microservice
,正式将微服务这个理念概念化。当然,他们更多的是在阐述微服务是一种什么样的设计思想,而没有告诉我们微服务该使用什么样的技术栈。
通过这篇文章,大概可以总结下面几点:
- 微服务是一系列微小的服务
- 微服务运行在进程中
- 每个服务是独立开发的
- 每个服务是独立部署的
- 服务需要分布式管理
架构的演进之路
好的架构是演进出来的。
-
单一应用 All in one
- 容易测试
容易部署 - 开发效率低,代码维护难
部署不灵活,构建代码时间长
稳定性不高
扩展性不够
- 容易测试
-
垂直应用 MVC
- SSH
- Spring MVC
-
分布式架构 RPC
- 多个元素共同合作完成同一件事
- 不共享内存
-
流动式架构 SOA
- ESB 企业服务总线
-
微服务架构 Spring Cloud
- 服务注册发现 Eureka
- 客户端负载均衡 Ribbon
- 服务网关 Zuul
- 熔断器 Hystrix
- 统一配置中心 Config
-
云服务
- Docker
- Kubernetes (K8S)
SpringCloud
Spring Cloud 是一套开发工具集,是一个完整的微服务解决方案。
对比Dobbo?Dubbo是一款高性能Java RPC框架
由于Spring Cloud 各个版本间存在不兼容,我选择了如下版本,目前它们更为成熟稳定。
- Spring Boot
1.5.7.RELEASE
- Spring Cloud
Edgware.SR5
服务注册与发现
服务发现有两种方式
- 客户端发现
- Eureka
- 服务端发现
- 需要 Proxy
- Nginx
- Zookeeper (Dubbo)
- Kubernetes (K8S)
Eureka Server
1、 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
2、添加配置
eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3、添加注解
@EnableEurekaServer
自我保护机制
高可用方案
Eureka Server是整个微服务的注册中心,如果Server服务出现宕机,注册在其上面的服务之间调用就无法正常进行,所以需要部署高可用的注册中心。
Eureka 满足CAP理论中的AP,也就是说它本身是支持高可用的,只需要一些配置就可以完成。
对于单个Eureka节点来说:
如果有两个Eureka节点:
如果有多个Eureka节点(大于3个节点):
Eureka Client
1、 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2、 添加配置
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
3、 添加注解
@EnableEurekaClient
Ribbon
- 通过ServerList获取所有的可用服务列表
- 通过ServerListFilter过滤一些地址
- 通过IRule选择一个实例作为调用地址
Feign
- 是一个声明式REST客户端
- 采用了基于接口的注解
Config 统一配置中心
实现异步
客户端请求不会阻塞进程,服务端的响应可以是非及时的。
- 通知:单向请求,一般一对一
- 请求、异步响应
- 消息:可以一对多,服务端的消息被多个客户端消费
消息中间件
消息中间件可以做到异步、解耦、削峰。
服务网关 Zuul
-
服务网关的要素
- 稳定性,高可用
- 性能,并发性
- 安全性
- 扩展性
-
服务网关的解决方案
- Nginx
- Kong
- Tyk
- Spring Cloud Zuul
-
Zuul的特点
- 路由+过滤器
- 前置(Pre)+后置(Post)+路由(Route)+错误(Error)
-
Zuul的高可用
- 多个Zuul节点注册到Eureka Server
- 可以考虑Nginx与Zuul结合
-
Zuul的限流/鉴权
- 继承
ZuulFilter
- 重写
run()
方法
- 继承
服务容错 Hystrix
服务降级
- 优先保障核心业务,非核心服务不可用或者弱可用
1、 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2、 添加注解
@EnableCircuitBreaker
@HystrixCommand
3、 添加配置
- Circuit Breaker 断路器
服务追踪 Sleuth
主要功能点
- 定位慢调用
- Rest或RPC调用,慢SQL
- 定位错误/异常
- 调用链
- 将端对端调用,异常日志,调用耗时等呈现给用户
微服务扩充
在Spring Cloud 升级到Finchley
以后,多个组件的pom签名有所改变,主要涉及的都是Netflix家族产品。spring-cloud-starter-eureka
改名为spring-cloud-starter-netflix-eureka-client
,在starter上加入公司名,是不是很有区分度,是不是意味着会有其他公司增援?
2018年11月初,阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本。按照官方介绍,这个项目的目的是为了让大家基于所熟知的 Spring 框架,其优秀的设计模式和抽象理念,给使用阿里巴巴产品的 Java 开发者带来使用 Spring Boot 和 Spring Cloud 的更多便利。