Spring-cloud-gateway网关
Spring-cloud-gateway是spring-cloud官方提供的第二代网关框架,取代了netflix-xuul1.0,毕竟netflix已经不做更新了,而且Spring-cloud-gateway的性能相比之下更高效,功能更强大;
Spring-cloud-gateway是由webfliux+netty+reactor实现的响应式API网关;
核心功能
路由
路由是网关的基本功能,它由URL+断言工厂+filter组成,针对于一个请求路径,如果断言为真说明请求的URL和配置的留有匹配;
断言
当请求gateway的时候,断言工厂根据当前的断言规则来进行请求路径的匹配,断言工厂有很多,比如基于请求的时间,基于发起请求的IP地址,请求的目的IP,基于cookie,基于http请求头等等,总结就是它能根据http请求来更灵活的进行路由,
过滤器
过滤器可以对请求响应做处理
Nignx和gateway区别
简单的说gateway 是前端工程 到 后台服务器之间的一个 对内网关,nginx是用户到 前端工程 的网关,对外网关,gateway 更偏向于业务
Nginx是基于服务端的负载均衡,而gateway是基于客户端的负载均衡,也就是本地的负载均衡,当请求到gateway时,gateway这里有一个服务列表,在gateway本地来选择好去哪里;
(个人理解):基于客户端的负载均衡是可以自动发现并更新服务的,配合微服务的注册中心,不需要重复配置路由的ip,而服务端的负载均衡,是需要手动配置的,请求需要路由到哪里,特别是微服务,当服务数量比较多的时候,用ningx一个一个去配置运维起来就很麻烦;
过滤器工厂(局部过滤器):
针对某个路由,过滤器处理去设置路由规则,还能对请求和响应报文做处理
全局过滤器(配置即生效):
对所有的请求和响应做处理;
Skywalking链路追踪
当一个大型的微服务项目,服务数量几十上百个,
当出现问题,如何实现快速定位?
服务之间的调用链路,依赖关系如何快速理清?
当服务性能出现问题,如何进行接口的性能分析?
这些都可以通过链路追踪来解决;
Skywalking是一个国产开源框架,个人开源框架;既不属于spring-boot,也不属于spring-cloud,它是基于字节码注入的调用链路分析;
jvm设计之初,就考虑了虚拟机状态的监控,程序debug,线程和内存分析等功能,并在1.5版本之后,形成了一套接口JVMTI,也就是探针技术,它的实现有两种方式
1是在程序运行前,通过premain()来,添加拦截器,在类加载之前完成对字节码的修改,
另一种是在程序运行中修改字节码文件;
像我们平时用到的idea中的debug模式,就是基于它来实现的;
skywalking组成
Skywalking agent:和业务系统绑定在一起的,负责收集各种监控数据(一般安装在业务系统的服务器上)
Skywalking oapservice:负责处理监控数据,处理前端的请求(它启动后,会暴露两个地址,一个是用来接收agent收集的信息,一个是用来接受处理前端的请求,这个都可以在配置中进行更改)
Skywalking webapp:前端界面,负责展示数据
数据库:用于存储监控数据
Skywalking部署(为了方便目前在windos环境)
1.下载
下载地址
下载完成后,进行解压,解压路径不能有中文,不然启动会报错,另外它的webapp的端口号默认8080,建议进行修改,在webapp/webapp.yml中进行修改,修改完成后即可启动,run.bat
注意:skywalking9.0之后的版本,agent是分开的,所以我们需要单独下载,下载解压后,在server的解压包中新建agent目录,并复制进去
- agent端的搭建
它是用的上面提到的探针技术中,在main启动前的premain中加入拦截器的方式,来实现的,所以我们也不需要修改代码,只需要在jvm启动时添加参数即可,
-javaagent:agent启动包的路径 -DSW_AGENT_NAME=项目名称,如果用了注册中心,最好和服务名一致 -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=aollector连接地址也就是服务端暴露的收集信息的地址 |
示例
-javaagent:D:/soft/apache-skywalking-apm-9.0.0/apache-skywalking-apm-bin/agent/skywalking-agent.jar -DSW_AGENT_NAME=order_sky -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 |
然后启动,在webapp上就可以看到调用链路了
当然也可以根据自己的业务,自定义调用链路,引入相关依赖,然后用添加相应的注解配置就可以;这里就不详细介绍了;