SpringCloudAlibaba下篇(GateWay,Skywalking)(超级无敌认真好用,万字收藏篇!!!!)

SpringCloudAlibaba下篇(GateWay,Skywalking)

1 GateWay

1.1 什么是网关

⼤家都知道的是在微服务架构中⼀个系统会被拆分为很多个微服务。那么作为客户端要如何去调⽤这么多的微服务呢如果没有⽹关的存在我们只能在客户端记录每个微服务的地址然后分别去调⽤。

在这里插入图片描述

这样的架构存在的问题

① 每个业务都会需要鉴权、限流、权限校验、跨域等逻辑如果每个业务都各自为战自己造轮子实现一遍会很蛋疼完全可以抽出来放到一个统一的地方去做。

② 如果业务量比较简单的话这种方式前期不会有什么问题但随着业务越来越复杂比如淘宝、亚马逊打开一个页面可能会涉及到数百个微服务协同工作如果每一个微服务都分配一个域名的话一方面客户端代码会很难维护涉及到数百个域名另一方面是连接数的瓶颈想象一下你打开一个APP通过抓包发现涉及到了数百个远程调用这在移动端下会显得非常低效.

③ 后期如果需要对微服务进行重构的话也会变的非常麻烦需要客户端配合你一起进行改造比如商品服务随着业务变的越来越复杂后期需要进行拆分成多个微服务这个时候对外提供的服务也需要拆分成多个同时需要客户端配合你进行改造非常蛋疼。

网关就是用来解决上述问题的

关注稳定与安全

  • 全局性流控
  • 日志统计
  • 防止SQL注入
  • 防止Web攻击
  • 屏蔽工具扫描
  • 黑白IP名单
  • 证书/加解密处理

提供更好的服务

  • 服务级别流控
  • 服务降级与熔断
  • 路由与负载均衡、灰度策略
  • 服务过滤、聚合与发现
  • 权限验证与用户等级策略
  • 业务规则与参数校验
  • 多级缓存策略

所谓的API网关就是指系统的统一入口它封装了应用程序的内部结构为客户端提供统一服务一些与业务本身功能无关的公共逻辑可以在这里实现诸如认证、鉴权、监控路由转发等等。
添加上API网关之后系统的架构图变成了如下所示:

在这里插入图片描述

1.2 GateWay介绍

Spring Cloud Gateway是由WebFlux + Netty + Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作也不能构建成war包

Spring Cloud Gateway旨在为微服务架构提供一种简单且有效的API路由的管理方式并基与Filter提供网关的基本功能例如说安全认证、监控、限流等等。

用来代提Zuul的性能是zuul的1.6倍

Spring Cloud Gateway 功能特征

  • 基于Spring Framework 5,Project Reactor和 Spring Boot 2.0进行构建;
  • 动态路由:能够匹配任何请求属性;
  • 支持路径重写;
  • 集成Spring Cloud服务发现功能(Nacos、Eruka) ;
  • 可集成流控降级功能(Sentinel、Hystrix) ;
  • 可以对路由指定易于编写的Predicate(断言和Filter (过滤器);

路由(route)

  • 路由是网关中最基础的部分路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真则说明请求的URL和配置的路由匹配.

断言(predicates)

  • Java8中的断言函数SpringCloud Gateway中的断言函数美型是Spring5.0框架中的SeverWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息比如请求头和参数等

过滤器(Filter)

  • SpringCloud Gateway中的filter分为Gateway Filler和Global Filter。Filter可以对请求和响应进行处理。

Gateway核⼼架构

路由( Route ) 是 gateway 中最基本的组件之⼀表示⼀个具体的路由信息载体。主要定义了下⾯的⼏个信息:

id路由标识符区别于其他 Route 。

uri路由指向的⽬的地 uri 即客户端请求最终被转发到的微服务。

order⽤于多个 Route 之间的排序数值越⼩排序越靠前匹配优先级越⾼。

predicate断⾔的作⽤是进⾏条件判断只有断⾔都返回真才会真正的执⾏路由。

filter过滤器⽤于修改请求和响应信息。

  • 执行流程

1.3 GataWay的基本使用

① 引入依赖

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

② 配置GataWay

spring:
  application:
    name: huozhexiao-gateway
  cloud:
    gateway:
      routes: #路由规则列表指定当请求满足条件转到对应服务
        - id: order-router   # 路由唯一标识
          uri: http://localhost:7001 #需要转发的地址
          # 配置断言用于路由规则匹配
          predicates:
            - Path=/order-server/**
            # http://localhost:7010/order-server/order/add 路由到↓
            # http://localhost:7001/order-server/order/add
          filters:
            - StripPrefix=1 #转发前去掉第一层路径
#        - id: stock-router

访问:http://localhost:7010/order-server/order/add

1.4 GataWay整合Nacos

① 引入依赖

 		<!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--负载均衡的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

② 配置Nacos和GataWay整合

spring:
  application:
    name: huozhexiao-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.198.129:4399
        password: nacos
        username: nacos
    gateway:
      routes: #路由规则列表指定当请求满足条件转到对应服务
        - id: order-router   # 路由唯一标识
#        - id: stock-router
          uri: lb://order-service #需要转发的地址 lb:负载均衡
          # 配置断言用于路由规则匹配
          predicates:
            - Path=/order-server/**
            # http://localhost:7010/order-server/order/add 路由到↓
            # http://localhost:7001/order-server/order/add
          filters:
            - StripPrefix=1 #转发前去掉第一层路径
      

访问:http://localhost:7010/order-server/order/add

  • 简写
spring:
  application:
    name: huozhexiao-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.198.129:4399
        password: nacos
        username: nacos
     gateway:
        discovery:
		  locator:
 		     enabled: true # 让gateway可以发现nacos中的微服务

访问:http://localhost:7010/order-server/order/add

1.5 断言路由工厂

作用:当请求 gateway 时 使用断言进行匹配如果匹配成功正常路由转发反之返回404

类型:

内置断言路由工厂

自定义路由断言工厂

1.5.1 内置断言路由工厂

SpringCloud Gateway 包括许多内置的断⾔⼯⼚所有这些断⾔都与 HTTP 请求的不同属性匹配。具体如下

  • 基于Datetime类型的断⾔⼯⼚

此类型的断⾔根据时间做判断主要有三个

AfterRoutePredicateFactory 接收⼀个⽇期参数判断请求⽇期是否晚于指定⽇期。 BeforeRoutePredicateFactory 接收⼀个⽇期参数判断请求⽇期是否早于指定⽇期。 BetweenRoutePredicateFactory 接收两个⽇期参数判断请求⽇期是否在指定时间段内。

predicates:
  - After=2023-05-27T23:16:55.889-07:00[Asia/Shanghai] # 匹配上海时间2023年5月27日23:16之后提出的请求
  - Before=2023-05-27T23:16:55.889-07:00[Asia/Shanghai] # 匹配上海时间2023年5月27日23:16之前提出的请求
  - Between=2023-05-27T23:16:55.889-07:00[Asia/Shanghai], 2023-05-30T23:16:55.889-07:00[Asia/Shanghai]   #匹配上海时间2023年5月27日23:16-上海时间2023年5月30日23:16之间提出的请求
  • 基于Cookie的断⾔⼯⼚

CookieRoutePredicateFactory接收两个参数 cookie 名字和⼀个正则表达式。

predicates:
 - Cookie=huozhexiao, hu. #匹配具有名为huozhexiao其值与hu.正则表达式
  • 基于Header的断⾔⼯⼚

HeaderRoutePredicateFactory接收两个参数标题名称和正则表达式。 判断请求 Header 是否具有给定名称且值与正则表达式匹配。

predicates:
 - Header=X-Request-Id, \d+ #匹配有一个名为X-Request-Id其值与\d+正则表达式的请求
  • 基于Host的断⾔⼯⼚

HostRoutePredicateFactory接收⼀个参数主机名模式。判断请求的 Host 是否满⾜匹配规则。

predicates:
 - Host=**.baidu.com #匹配是否是来源于baidu.com的请求。
  • 基于Method请求⽅法的断⾔⼯⼚

MethodRoutePredicateFactory接收⼀个参数判断请求类型是否跟指定的类型匹配。

predicates:
 - Method=GET #只接收get请求
  • 基于Path请求路径的断⾔⼯⼚

PathRoutePredicateFactory接收⼀个参数判断请求的 URI 部分是否满⾜路径规则。

predicates:
 - Path=/huozhexiao/* # 只有请求路径中带有huozhexiao的请求被接受
  • 基于Query请求参数的断⾔⼯⼚

QueryRoutePredicateFactory 接收两个参数请求 param 和正则表达式 判断请求参数是否具有给定名称且值与正则表达式匹配。

predicates:
 - Query=name, huozhe.+ # 请求参数中必须有name参数并且名称中要以huozhe开头
  • 基于远程地址的断⾔⼯⼚

RemoteAddrRoutePredicateFactory接收⼀个 IP 地址段判断请求主机地址是否在地址段中。根据请求 IP 进⾏路由判断接收 CIDR 表示法 IPv4 或 IPv6 的字符串列表列表最⼩⻓度为1作为参数 例如 192.168.1.6/ 24 其中 192.168.1.6 是 IP 地址 24 是⼦⽹掩码。

predicates:
 - RemoteAddr=192.168.1.1/24  # 匹配请求的远程地址是192.168.1.(1-25)
  • 基于路由权重的断⾔⼯⼚

WeightRoutePredicateFactory接收⼀个[组名,权重], 然后对于同⼀个组内的路由按照权重转发。

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

这条路线将把大约80%的流量转发到weighthigh.org约20%的流量流向weighlow.org

  • XForwarded远程地址路由断言工厂

XForwarded Remote Addr路由谓词工厂采用以下列表(最小大小为1)sources这是CIDR符号(IPv4或IPv6)字符串例如192.168.0.1/16(哪里192.168.0.1是IP地址并且16是子网掩码)。

这个路由谓词允许根据X-Forwarded-ForHTTP头。

这可以用于反向代理如负载平衡器或web应用程序防火墙其中只有当请求来自这些反向代理使用的IP地址的可信列表时才应该允许该请求。

spring:
  cloud:
    gateway:
      routes:
      - id: xforwarded_remoteaddr_route
        uri: https://example.org
        predicates:
        - XForwardedRemoteAddr=192.168.1.1/24

此路由匹配如果X-Forwarded-For标题包含例如192.168.1.10.

1.5.2 自定义断言路由工厂

自定义路由断言工厂需要继承AbstractRoutePredicateFactory类重写appy方法的逻辑。

在appy方法中可以通过 exchange.getReuest()拿到 ServerHttpRequest() 对象。从而可以求取到清求的参数、请求方式、请求头等信息。

注意命名要以RoutePredicateFactory结尾

@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config>{
    public MyRoutePredicateFactory() {
        super(MyRoutePredicateFactory.Config.class);
    }

    public List<String> shortcutFieldOrder() {
        return Arrays.asList("name");
    }

    @Override
    public Predicate<ServerWebExchange> apply(final MyRoutePredicateFactory.Config config) {
        return new GatewayPredicate() {
            public boolean test(ServerWebExchange exchange) {
                if (config.getName().equals("huozhexiao")){
                    return true;
                }else {
                    return false;
                }
            }
        };
    }
    //接受配置文件断言信息
    public static class Config {
       private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
  • 配置

              predicates:
                - My=huozhexiao
    

1.6 过滤器工厂

在 Gateway 中 Filter 的⽣命周期只有两个 prepost

  • PRE 这种过滤器在请求被路由调⽤之前调⽤。可利⽤这种过滤器实现身份验证、在集群中选择请求的微服 务、记录调试信息等。

  • POST这种过滤器在路由到微服务以后执⾏。可⽤来为响应添加标准的 HTTP Header 、收集统计信息和指 标、将响应从微服务发送给客户端等。

在这里插入图片描述

Gateway 的过滤器从作⽤范围可分为两种: GatewayFilter 与 GlobalFilter 。

  • GatewayFilter应⽤到单个路由或者⼀个分组的路由上。

  • GlobalFilter应⽤到所有的路由上。

1.6.1 内置局部过滤器工厂

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

过滤器工厂作用参数
AddRequestHeader为原始请求添加HeaderHeader的名称及值
AddRequestParameter为原始请求添加请求参数参数名称及值
AddResponseHeader为原始响应添加HeaderHeader的名称及值
DedupeResponseHeader剔除响应头中重复的值需要去重的Header名称及去重策略
Hystrix为路由引入Hystrix的断路器保护HystrixCommand的名称
FallbackHeaders为fallbackUri的请求头中添加具体的异常信息Header的名称
PrefixPath为原始请求路径添加前缀前缀路径
PreserveHostHeader为请求添加一个preserveHostHeader=true的属性路由过滤器会检查该属性以决定是否要发送原始的Host
RequestRateLimiter用于对请求限流限流算法为令牌桶keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus
RedirectTo将原始请求重定向到指定的URLhttp状态码及重定向的url
RemoveHopByHopHeadersFilter为原始请求删除IETF组织规定的一系列Header默认就会启用可以通过配置指定仅删除哪些Header
RemoveRequestHeader为原始请求删除某个HeaderHeader名称
RemoveResponseHeader为原始响应删除某个HeaderHeader名称
RewritePath重写原始的请求路径原始路径正则表达式以及重写后路径的正则表达
RewriteResponseHeader重写原始响应中的某个HeaderHeader名称值的正则表达式重写后的值
SaveSession在转发请求之前强制执行WebSession::save操作
secureHeaders为原始响应添加一系列起安全作用的响应头无支持修改这些安全响应头的值
SetPath修改原始的请求路径修改后的路径
SetResponseHeader修改原始响应中某个Header的值Header名称修改后的值
SetStatus修改原始响应的状态码HTTP 状态码可以是数字也可以是字符串
StripPrefix用于截断原始请求的路径使用数字表示要截断的路径的数量
Retry针对不同的响应进行重试retries、statuses、methods、series
RequestSize设置允许接收最大请求包的大小。如果请求包大小超过设置的值则返回 413 Payload Too Large请求包大小单位为字节默认值为5M
ModifyRequestBody在转发请求之前修改原始请求体内容修改后的请求体内容
ModifyResponseBody修改原始响应体的内容修改后的响应体内容
Default为所有路由添加过滤器过滤器工厂名称及值

每个过滤器工厂都对应一个实现类并且这些类的名称必须以GatewayFilterFactory结尾

1.6.2 自定义局部过滤器

继承AbstractGatewayFilterFactory

@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("value");
    }

    public MyGatewayFilterFactory() {
        super(MyGatewayFilterFactory.Config.class);
    }

    @Override
    public GatewayFilter apply(MyGatewayFilterFactory.Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                /*
                 * 1.获取name参数
                 * 2. 如果!=value不放行反正放行
                 * */
                String name = exchange.getRequest().getQueryParams().getFirst("name");
                if (StringUtils.isNotBlank(name)){
                    if (config.getValue().equals(name)){
                        chain.filter(exchange);
                    }else {
                        exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                        return exchange.getResponse().setComplete();
                    }
                }
                //正常请求

                return chain.filter(exchange);
            }
        };
    }

    public static class Config {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}
  • 配置

              filters:
                 - My=huozhexiao
    

1.6.3 内置全局过滤器工厂

无需配置、可直接使用

具体使用方法看官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters

在这里插入图片描述

1.6.4 自定义全局过滤器

继承GlobalFilter实现filter()方法

  • 自定义日志demo
@Component
public class LogFilter implements GlobalFilter {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        logger.info(exchange.getRequest().getPath().value());
        return chain.filter(exchange);
    }
}

Reactor Netty 访问日志

要启用Reactor Netty 访问日志请设置-Dreactor.netty.http.server.accessLogEnabled=true.

  • 它必须是Java系统属性而不是spring Boot属性。
  • 自定义鉴权demo
@Component
@Slf4j
public class TokenGlobalFilter implements GlobalFilter, Ordered {
    //鉴权
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("开始鉴权...");
        List<String> tokens = exchange.getRequest().getHeaders().get("token");
        if (tokens != null || tokens.size() == 0) {
            return error(exchange);
        }
        //获取token
        String token = tokens.get(0);
        log.info("token:{}",token);
        //token判断
        return chain.filter(exchange);
    }

    private Mono<Void> error(ServerWebExchange exchange) {
        // 浏览器没有携带token
        // 获取响应对象
        ServerHttpResponse response = exchange.getResponse();
        // 设置响应状态码
        response.setStatusCode(HttpStatus.resolve(403));
        // 设置返回格式
        response.getHeaders().set("ContentType", "application/json;charset=utf-8");
        // 设置返回的内容
        JsonResult result = new JsonResult(true,"200",null,"用户未登陆...");
        String str = JSONArray.toJSONString(result);
        DataBuffer data = response.bufferFactory().wrap(str.getBytes(StandardCharsets.UTF_8));
        log.info("⽤户未携带token,{}", str);
        return response.writeWith(Mono.just(data));
    }

    //优先级
    @Override
    public int getOrder() {
        return 1;
    }
}

1.7 Gateway跨域配置

通过yml配置

spring:
   cloud:
   	 gateway:
	   globalcors:
		 cors-configurations:
		 	'[/**]:		//允许跨域访问访问的资源
			 allowedOrigins: "*"  //允许跨域访问的来源
             allowedMethods: 	//允许跨域请求的访问
             	- GET
			    - POST
			    - DELETE
			    - PUT
			    -OPTION

通过配置类配置

@configuration
public class corsconfig {
	@Bean
	public corswebFilter corsFilter() {
			corsconfiguration config = new corsconfiguration();
        	config.addAllowedMethod("*");
			config.addAllowedorigin("*");
            config.addAllowedHeader("*");
        	//允许访问的资源	
			UrlBasedCorsConfigurationSource source = new UrlBasedcorsconfigurationsource(new PathPatternParser());
        	source.registerCorsconfiguration("/**", config);
			return new corsWebFilter(source);
    }
}

1.8 Gataway整合sentinel流控降级

网关层限流可针对不同路由也可针对业务接口进行限流根据接口特征进行限流

官方文档:https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html

在这里插入图片描述

① 引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

②添加sentinel控制台配置

spring:
  application:
    name: huozhexiao-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.198.129:4399
        password: nacos
        username: nacos
    gateway:
      routes: #路由规则列表指定当请求满足条件转到对应服务
        - id: order-router   # 路由唯一标识   
          uri: lb://order-service #需要转发的地址 lb:负载均衡
          # 配置断言用于路由规则匹配
          predicates:
            - Path=/order/**
    sentinel:
      transport:
        dashboard: localhost:1234

整合流控降级详细配置

在这里插入图片描述

API分组:可定义一组api进行流控

在这里插入图片描述

降级规则

在这里插入图片描述

使用自定义异常进行降级处理

@PostConstruct
public void init(){
    BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
        @Override
        public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
            //自定义异常处理      
            return ServerResponse.status(HttpStatus.OK)
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(BodyInserters.fromValue(new JsonResult(true,HttpStatus.TOO_MANY_REQUESTS.toString(),null,"限流了")));
        }
    };
    //设置自定义异常
    GatewayCallbackManager.setBlockHandler(blockRequestHandler);
}

2 SkyWalking

在庞大的微服务体系中某个服务出现错误会很难解决SkyWalking链路追踪可以帮助我们理清整个服务调用链路解决问题

2.1 什么是SkyWalking

skywalking是一个国产开源框架2015年由吴晟开源2017年加入Apache孵化器。skywalking是分布式系统的应用程序性能监视工具专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。它是一款优秀的APM(Application Perfomance Management)工具包括了分布式追踪、性能指标分析、应用和服务依赖分析等。

  • 市场上的链路追踪框架对比

    链路追踪框架对比

    1. zipkin:zipkin是Twitter开源的调用链分析工具目前基于springcloud sleuth得到了广泛的使用特点是轻量使用部署简单。

    2. Pinpoint:Pinpoint是韩国人开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件U功能强大接入端无代码侵入

    3. SkyWlaking:SkyWlaking是本土开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件UI功能较强接入端无代码侵入。目前已加入Apache孵化器。

    4. CAT是大众点评开源的基于编码和配置的调用链分析应用监控分析日志采集监控报警等一系列的监控平台工具。

  • SkyWalking主要功能特性

    1.多种监控手段可以通过语言探针和service mesh获得监控的数据

    2.支持多种语言自动探针包括Java、.Net Core和Node JS等

    3.轻量高效无需大数据平台和大量的服务器资源

    4.模块化、UI、存储、集群管理都有多种机制可选

    5.支持告警

    6.优秀的可视化解决方案

2.2 SkyWalking服务端搭建

在这里插入图片描述

  • Skywalking agent和业务系统绑定在一起负责收集各种监控数据
  • Skywalking oapservice是负责处理监控数据的比如接受Skywalking agent的监控数据并存储在数据库中;接受Sky walking webapp的前端请求从数据库查询数据并返回数据给前端。
  • Skywalking oapservice通常以集群的形式存在。
  • Skywalking webapp前端界面用于展示数据。
  • 用于存储监控数据的数据库比如mysql、elasticsearch等。

2.2.1 下载SkyWalking

选择版本下载

在这里插入图片描述

  • 解压…

2.2.2 目录结构

在这里插入图片描述

新版本agent目录独立出去了需要自己下载

在这里插入图片描述

在这里插入图片描述

  • 启动bin/startup.sh会同时启动(oapservice和webapp)

    • 在webapp/webapp.yml修改webapp端口号,默认为8080

    • 在conf/application.yml修改oapservice端口 服务启动后会暴露11800和12800端口分别为收集监控数据的端口11800和接收前端请求的端口12800

2.2.3 接入微服务

启动微服务时添加配置

更多配置见:https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/configurations/

-javaagent:E:\skywalking\apache-skywalking-apm-bin\skywalking-agent\skywalking-agent.jar -DSW_AGENT_NAME=stock-service   #服务名
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800  #aollector连接地址

在这里插入图片描述

2.2.4 使用mysql持久化

SkyWalking默认使用h2进行持久化

  • 修改conf/application.yml文件

    • 选择mysql
    storage:
      selector: ${SW_STORAGE:mysql}
    
    • 配置mysql
      mysql:
        properties:
          jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://192.168.198.129:3306/swtest?rewriteBatchedStatements=true"}
          dataSource.user: ${SW_DATA_SOURCE_USER:root}
          dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
          dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
          dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
          dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
          dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
        metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
        maxSizeOfBatchSql: ${SW_STORAGE_MAX_SIZE_OF_BATCH_SQL:2000}
        asyncBatchPersistentPoolSize: ${SW_STORAGE_ASYNC_BATCH_PERSISTENT_POOL_SIZE:4}
    
    • 启动skywalking会自动建表

    • 报错:Failed to get driver instance for jdbcUrl=jdbc:mysql://192.168.198.129:3306/swtest?rewriteBatchedStatements=true

      缺少mysql驱动oap-libs中导入mysql驱动包即可

2.2.5 自定义链路追踪

如果我们希望对项目中的业务方法实现链路追踪方便我们排查问题可以使用如下的代码

  • 引入依赖
     <!--skyWalking工具类        跟agent版本对应-->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.12.0</version>
        </dependency>
  • 加入@Trace注解
    @Trace
    public Order create(Order order) {
        orderMapper.add(order);
        //扣减库存能否成功
        stockFegin.reduct(order.getProduct_id());
        int a = 1 / 0;
        return order;
    }
  • 加入@Tags@Tag

增加其他额外信息例如参数和返回信息

   @Trace
    @Tags({@Tag(key = "param",value = "arg[0]"),
            @Tag(key = "order",value = "returnObj")})
    public Order create(Order order) {
        orderMapper.add(order);

        //扣减库存能否成功
        stockFegin.reduct(order.getProduct_id());
        int a = 1 / 0;
        return order;

    }

2.3 告警

疑似出现异常或者出现异常进行告警

告警规则

SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件里面预先定义了一些常用的告警规则。如下;

  1. 过去3分钟内服务平均响应时间超过1秒。
  2. 过去2分钟服务成功率低于80%。
  3. 过去3分钟内服务响应时间超过1s 的百分比
  4. 服务实例在过去2分钟内平均响应时间超过1s并且实例名称与正则表达式匹配。
  5. 过去2分钟内端点平均响应时间超过1秒。
  6. 过去2分钟内数据库访问平均响应时间超过1秒。7.过去2分钟内端点关系平均响应时间超过1秒。

告警规则配置项的说明

  • Rule name规则名称也是在告警信息中显示的唯一名称。必须以_rule结尾前缀可自定义
  • Metrics name度量名称取值为oal脚本中的度量名目前只支持long、double和int类型。详见Official OAL script
  • Include names该规则作用于哪些实体名称比如服务名终端名可选默认为全部
  • Exclude names该规则作不用于哪些实体名称比如服务名终端名可选默认为空
  • Threshold阈值
  • OP 操作符目前支持 >、<、=
  • Period多久告警规则需要被核实一下。这是一个时间窗口与后端部署环境时间相匹配
  • Count在一个Period窗口中如果values超过Threshold值按op达到Count值需要发送警报
  • Silence period在时间N中触发报警后在TN -> TN + period这个阶段不告警。 默认情况下它和Period一样这意味着相同的告警在同一个Metrics name拥有相同的Id在同一个Period内只会触发一次
  • message告警消息

  • 学习来自于b站图灵
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring