方案选择
成熟方案 Spring Cloud
Spring Cloud 是业界成熟的微服务解决方案,开箱即用的全家桶
用途 | Spring Cloud |
---|---|
服务发现 | Eureka |
配置中心 | Config |
API 网关 | Zuul |
客户端负载均衡器 | Ribbon |
声明式HTTP客户端 | Feign |
熔断、降级、限流 | Hystrix |
链路跟踪 | Sleuth ( 对Zipkin的封装 ) |
日志分析 | ELK ( Third Party ) |
认证服务 | OAuth2 tokens |
监控面板 | Turbine + Hystrix Dashboard |
终极方案 Kubernetes + Istio
为什么
以 Spring Cloud 为例的微服务架构中,除了微服务自身模块(也就是应用的业务逻辑)之外,其它的绝大部分模块,例如:服务发现、配置中心、链路跟踪、日志监控等等,都是通用的,都可以【下沉】到平台级别,做到一体化。
其实这也是 PaaS 平台要实现的目标,而 Kubernetes + Istio 可以很好地帮助微服务实现此目标。
最后,我们只需要关心具体的业务逻辑,其它的一切都可以交给平台来实现。
所以说,以 Kubernetes + Istio 为代表的服务网格 ( Service Mesh ) 是微服务的终极方案。
怎么做
Istio 已经到了 1.11 版本,但业界大规模使用,特别是大厂的应用还不普遍。目前阶段,最好是持续关注 + 深入学习。
一个有趣的案例, JHipster + Istio 解决方案。
可选方案 Spring Cloud Alibaba
阿里的 Spring Cloud 解决方案,正在孵化阶段。
Spring Cloud
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。
Eureka - 服务发现
- **Eureka 是一个基于REST的服务,用于服务的的注册与发现 **
- **Sureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心, **
- **Eureka 又可细分为 Eureka Server 和 Eureka Client ( @EnableDiscoveryClient ) **
pom.xml
1 | <dependency> |
application.yml
- Eureka高可用配置,1. 两台,互相注册,2. 三台,1向2,3注册,..… 3. 多台,类似,..…
- prefer-ip-address: true 设置IP查找
- register-with-eureka: false 是否注册到 eureka, 高可用配置时默认为true
- enable-self-preservation: false 默认为true, 开发模式下设为false, 生产环境下要恢复默认
1 | # Eureka高可用配置,1. 两台,互相注册,2. 三台,1向2,3注册,... 3. 多台,类似,... |
EurekaApplication.java
1 |
|
Config - 配置中心
pom.xml
1 | <dependency> |
application.yml
1) 配置 gitee.com 服务器 uri: https://gitee.com/dreamstep36/config-repo
2) 配置 gitlab 服务器,必须以 .git 结尾 uri: http://192.168.1.99/michael/config-repo.git
1 | spring: |
ConfigApplication.java
1 |
|
Zuul - 服务网关
pom.xml
1 | <dependency> |
bootstrap.yml
bootstrap.yml 先于 application.yml 加载,因为要通过 eureka-server 找到 config-server 获取配置
Eureka server 高可用配置如下
1 | spring: |
ApiGatewayApplication.java
1 |
|
Feign - 声明式服务调用
- 依赖改为 spring-cloud-starter-openfeign
- @FeignClient 一般在Api( or Client ) 包中配置,与 hystrix 整合使用,fallback 参数指定的类返回 null
- Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果
- 注意:负载均衡是加在客户端中,而不是服务端中
pom.xml
1 | <dependency> |
@EnableFeignClients
1 |
|
ProductClient.java
1 |
|
Ribbon - 负载均衡工具
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括Feign,也是基于Ribbon实现的工具。
Ribbon工作时分为两步:第一步先选择 Eureka Server, 它优先选择在同一个Zone且负载较少的Server;第二步再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询、随机、根据响应时间加权等。
RestTemplate
ConfigBean 添加新注解 @LoadBalanced, 用于加入 Ribbon 配置
1 |
|
Feign
Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果
Hystrix - 限流 降级 熔断
Hystrix熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它也是基于Netflix的开源框架 Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。