学习微服务系列(十二):服务治理
我们以上的文章说明了在微服务架构下的一些列的相关技术,当业务服务演进到微服务架构后,服务治理问题就会凸现出来。在微服务架构下,出现了新的服务问题,从而需要对微服务进行服务治理。那微服务又有哪些问题需要治理?
1、可观测性。微服务由于较单体应用有了更多的部署载体,需要对众多服务间的调用关系、状态有清晰的掌控。
2、流量管理与安全保护。由于微服务本身存在不同版本,在版本更迭过程中,需要对微服务间调用进行控制,以完成微服务版本更迭的平滑。这一过程中需要根据流量的特征(访问参数等)、百分比向不同版本服务分发,这也孵化出灰度发布、蓝绿发布、A/B测试等服务治理的细分主题。
可观测性
可观测性我们需要通过若干个APM软件来帮助我们监控服务的状态。包括硬件中的cpu负载,内存的情况以及网络的情况。系统软件层面的错误率接口响应时长,调用链路等信息。
一般我们常用的APM工具有:
Zipkin
这个是twitter开源出来的,Zipkin的java应用端是通过一个叫Brave的组件来实现对应用内部的性能分析数据采集。通过实现一系列的java拦截器,来做到对http/servlet请求、数据库访问的调用过程跟踪。然后通过在spring之类的配置文件里加入这些拦截器,完成对java应用的性能数据采集。用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
Grafana+zabbix
Zabbix 软件能够监控众多网络参数和服务器的健康度、完整性。Zabbix 使用灵活的告警机制,允许用户为几乎任何事件配置基于邮件的告警。这样用户可以快速响应服务器问题。
另外还有许多商用的APM软件:比如听云,博睿等。
流量管理与安全保护
流量管理与熔断保护,这里我具体介绍一下阿里的sentinel。我们先看一下sentinel的生态体系:
Sentinel 分为两个部分:
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
与Hystrix的比较:
接入控制台实时查看监控数据
需要先下载控制台的jar包,可以直接从 https://github.com/alibaba/Sentinel/releases 页面进行下载,也可以自己下载源码进行编译(https://github.com/alibaba/Sentinel/tree/master/sentinel-dashboard),推荐直接下载编译好的。下载之后直接使用以下命令启动即可。
java -Dserver.port=8333- Dcsp.sentinel.dashboard.server=localhost:8333 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.4.2.jar
-Dserver.port 指定控制台的端口
-Dproject.name 指定接入的应用名称
启动后访问 http://localhost:8333 即可跳转到控制台的主页,如下图:
这个控制台里面的操作我们就不进行讲解了,大家自己去尝试下就会了,比如说我们要看实时监控的数据,那么就点击第一个实时监控的菜单,可以看到下面的效果:
整个控制台页面都是中文说明,具体各个部分功能大家直接点击体验就好,可以看到每个URI的QPS啊,拒绝的QPS等信息。
客户端接入控制台
上面其实是把控制台自己接入进来了,如果要接入我们实际工作中的项目,该怎么接入?
客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。您可以通过 pom.xml 引入 JAR 包:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.1</version>
</dependency>
-Dcsp.sentinel.dashboard.server=localhost:8333
注:若您的应用为 Spring Boot 或 Spring Cloud 应用,您可以使用 Spring Cloud Alibaba,通过 Spring 配置文件来指定配置,具体配置我们下面再说。
Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。然后就可以在控制台上看到我们自己接入的应用了。并且通过配置可以增加各种限流机制。
springboot项目引入sentinel
pom文件增加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
properties文件增加
#sentinel控制台
spring.cloud.sentinel.transport.dashboard=localhost:8099
spring.cloud.sentinel.eager=true
sentinel控制台启动后直接启动springboot服务即可