sis最新ip,微服务网关存储请求数据到Elasticsearch

大家好,今天小编来为大家解答以下的问题,关于sis最新ip,微服务网关存储请求数据到Elasticsearch这个很多人还不知道,现在让我们一起来看看吧!

通过两个过滤器来做请求信息的记录,通过网关流水号在redis中存储一个hash的数据结构将我们需要的信息保存起来。在网关处理完成后将流水号插入到redis的一个队列中,由另外一个服务(task)监控redis队列并将hash数据存储到es中。

platform-cloud/platform-cloud-web/platform-cloud-web-gateway/src/main/resources/application.yml

CacheParams将请求参数和请求内容存入redis中。

类名:CacheParamsGatewayFilterFactory

platform-cloud/platform-cloud-web/platform-cloud-web-gateway/src/main/java/com/tinem/platform/web/gateway/filter/CacheParamsGatewayFilterFactory.java

/*n*Copyright2013-2019theoriginalauthororauthors.n*n*LicensedundertheApacheLicense,Version2.0(the"License");n*youmaynotusethisfileexceptincompliancewiththeLicense.n*YoumayobtainacopyoftheLicenseatn*n*https://www.apache.org/licenses/LICENSE-2.0n*n*Unlessrequiredbyapplicablelaworagreedtoinwriting,softwaren*distributedundertheLicenseisdistributedonan"ASIS"BASIS,n*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.n*SeetheLicenseforthespecificlanguagegoverningpermissionsandn*limitationsundertheLicense.n*/nnpackagecom.tinem.platform.web.gateway.filter;nnimportcn.hutool.core.util.StrUtil;nimportcom.google.common.net.HttpHeaders;nimportcom.tinem.platform.module.pojo.co.GatewayHeadName;nimportcom.tinem.platform.module.pojo.co.RedisKeyEnum;nimportcom.tinem.platform.web.gateway.util.GatewayUtil;nimportlombok.extern.slf4j.Slf4j;nimportorg.springframework.beans.factory.annotation.Value;nimportorg.springframework.cloud.gateway.filter.GatewayFilter;nimportorg.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;nimportorg.springframework.data.redis.core.StringRedisTemplate;nimportorg.springframework.stereotype.Component;nnimportjavax.annotation.Resource;nimportjava.util.Hashtable;nimportjava.util.Map;nimportjava.util.concurrent.TimeUnit;nn/**n*GatewayFilterthatmodifiestheresponsbody.n*/n@Slf4jn@ComponentnpublicclassCacheParamsGatewayFilterFactoryextendsnAbstractGatewayFilterFactory<Object>{nn@Value("${spring.profiles.active}")nStringactive;n@ResourcenStringRedisTemplatestringRedisTemplate;nn@OverridenpublicGatewayFilterapply(Objectconfig){nreturn(exchange,chain)->{nStringgatewayRequestId=GatewayUtil.getReq(exchange);nnMap<String,String>req=newHashtable<>(30,1);nn//--------浏览器信息------------nreq.put(HttpHeaders.USER_AGENT,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(HttpHeaders.USER_AGENT),""));nreq.put(HttpHeaders.ORIGIN,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(HttpHeaders.ORIGIN),""));nreq.put(HttpHeaders.REFERER,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(HttpHeaders.REFERER),""));nreq.put(HttpHeaders.HOST,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(HttpHeaders.HOST),""));nn//---------cloudflare------nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_IP,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst("Cf-Connecting-Ip"),""));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_IP_COUNTRY,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst("Cf-Ipcountry"),""));nn//---------请求参数缓存------nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_TIMESTAMP,String.valueOf(GatewayUtil.getReqTimestamp(exchange)));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_SERVICE,GatewayUtil.getApiService(exchange));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_METHOD,GatewayUtil.getApiMethod(exchange));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_VERSION,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_VERSION),""));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_API_REQUEST_ID,GatewayUtil.getApiReq(exchange));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_JWT,GatewayUtil.getJwt(exchange));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CHARSET,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CHARSET),""));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_LANG,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_LANG),""));nnreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_SIGN_TYPE,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_SIGN_TYPE),""));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_SIGN,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_SIGN),""));nnreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CRYPTO_TYPE,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CRYPTO_TYPE),""));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CRYPTO_KEY,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CRYPTO_KEY),""));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CRYPTO_IV,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_CRYPTO_IV),""));nnreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_DEBUG,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_DEBUG),""));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_DEVICE,StrUtil.emptyToDefault(exchange.getRequest().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_DEVICE),""));nn//---------网关参数缓存------nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQUEST_ID,gatewayRequestId);nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_ACCEPT_TIMESTAMP,String.valueOf(GatewayUtil.getReqAcceptTimestamp(exchange)));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_JTI,GatewayUtil.getJit(exchange));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_CLIENT_ID,GatewayUtil.getClient(exchange));nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_ENV,active);nnStringuserId=exchange.getAttribute(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_USER_ID);nif(StrUtil.isNotEmpty(userId)){nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_USER_ID,userId);n}n//---------请求内容------nStringrequestBody=exchange.getAttribute(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_BODY);nif(StrUtil.isNotBlank(requestBody)){nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_REQ_BODY,requestBody);n}nn//---------将数据保存到redis------nStringkey=RedisKeyEnum.gateway_req_info.getKey(gatewayRequestId);nstringRedisTemplate.opsForHash().putAll(key,req);n//---------设置10分钟后过期------nstringRedisTemplate.expire(key,10,TimeUnit.MINUTES);nreturnchain.filter(exchange);n};n}n}n

CacheResponse将请求返回数据和请求的状态码状态信息存储到redis中。

类名:CacheResponseGatewayFilterFactory

platform-cloud/platform-cloud-web/platform-cloud-web-gateway/src/main/java/com/tinem/platform/web/gateway/filter/CacheResponseGatewayFilterFactory.java

/*n*Copyright2013-2019theoriginalauthororauthors.n*n*LicensedundertheApacheLicense,Version2.0(the"License");n*youmaynotusethisfileexceptincompliancewiththeLicense.n*YoumayobtainacopyoftheLicenseatn*n*https://www.apache.org/licenses/LICENSE-2.0n*n*Unlessrequiredbyapplicablelaworagreedtoinwriting,softwaren*distributedundertheLicenseisdistributedonan"ASIS"BASIS,n*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.n*SeetheLicenseforthespecificlanguagegoverningpermissionsandn*limitationsundertheLicense.n*/nnpackagecom.tinem.platform.web.gateway.filter;nnimportcn.hutool.core.util.StrUtil;nimportcom.alibaba.fastjson.JSON;nimportcom.tinem.platform.module.pojo.co.GatewayHeadName;nimportcom.tinem.platform.module.pojo.co.RedisKeyEnum;nimportcom.tinem.platform.web.gateway.util.GatewayUtil;nimportcom.tinem.platform.web.gateway.util.MDCUtil;nimportlombok.extern.slf4j.Slf4j;nimportorg.reactivestreams.Publisher;nimportorg.springframework.cloud.gateway.filter.GatewayFilter;nimportorg.springframework.cloud.gateway.filter.GatewayFilterChain;nimportorg.springframework.cloud.gateway.filter.NettyWriteResponseFilter;nimportorg.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;nimportorg.springframework.core.Ordered;nimportorg.springframework.core.io.buffer.DataBuffer;nimportorg.springframework.data.redis.core.StringRedisTemplate;nimportorg.springframework.http.server.reactive.ServerHttpResponse;nimportorg.springframework.http.server.reactive.ServerHttpResponseDecorator;nimportorg.springframework.stereotype.Component;nimportorg.springframework.web.server.ServerWebExchange;nimportreactor.core.publisher.Mono;nnimportjavax.annotation.Resource;nimportjava.util.Hashtable;nimportjava.util.Map;nimportjava.util.concurrent.TimeUnit;nn/**n*GatewayFilterthatmodifiestheresponsbody.n*/n@Slf4jn@ComponentnpublicclassCacheResponseGatewayFilterFactoryextendsnAbstractGatewayFilterFactory<Object>{n@ResourcenStringRedisTemplatestringRedisTemplate;nn@OverridenpublicGatewayFilterapply(Objectconfig){nModifyResponseGatewayFiltergatewayFilter=newModifyResponseGatewayFilter();nreturngatewayFilter;n}npublicclassModifyResponseGatewayFilterimplementsGatewayFilter,Ordered{n@OverridenpublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){nreturnchain.filter(exchange.mutate().response(decorate(exchange)).build());n}nn@SuppressWarnings("unchecked")nServerHttpResponsedecorate(ServerWebExchangeexchange){nreturnnewServerHttpResponseDecorator(exchange.getResponse()){nn@OverridenpublicMono<Void>writeWith(Publisher<?extendsDataBuffer>body){nthis.cacheResponse(exchange);nreturnsuper.writeWith(body);n}nn@OverridenpublicMono<Void>writeAndFlushWith(nPublisher<?extendsPublisher<?extendsDataBuffer>>body){nthis.cacheResponse(exchange);nreturnsuper.writeAndFlushWith(body);n}nprivatevoidcacheResponse(ServerWebExchangeexchange){nnMDCUtil.set(exchange);nnStringresTimestamp=exchange.getResponse().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_RES_TIMESTAMP);nStringgatewayResCode=exchange.getResponse().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_RES_CODE);nStringgatewayResSuccess=exchange.getResponse().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_RES_SUCCES);nStringgatewayResMessage=exchange.getResponse().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_GATEWAY_RES_MESSAGE);nnMap<String,String>req=newHashtable<>(7,1);nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_RES_TIMESTAMP,resTimestamp);nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_RES_CODE,gatewayResCode);nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_RES_SUCCES,gatewayResSuccess);nreq.put(GatewayHeadName.X_PLATFORM_GATEWAY_RES_MESSAGE,gatewayResMessage);nnStringresCode=exchange.getResponse().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_RES_CODE);nStringresSuccess=exchange.getResponse().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_RES_SUCCESS);nStringresMessage=exchange.getResponse().getHeaders().getFirst(GatewayHeadName.X_PLATFORM_RES_MESSAGE);nreq.put(GatewayHeadName.X_PLATFORM_RES_CODE,StrUtil.nullToDefault(resCode,""));nreq.put(GatewayHeadName.X_PLATFORM_RES_SUCCESS,StrUtil.nullToDefault(resSuccess,""));nreq.put(GatewayHeadName.X_PLATFORM_RES_MESSAGE,StrUtil.nullToDefault(resMessage,""));nnStringgatewayRequestId=GatewayUtil.getReq(exchange);nStringkey=RedisKeyEnum.gateway_req_info.getKey(gatewayRequestId);ntry{nstringRedisTemplate.opsForHash().putAll(key,req);n}catch(Exceptione){nlog.error("rediscacheerror:{},{}",key,JSON.toJSONString(req));nlog.error("",e);n}n//---------设置5分钟后过期------nstringRedisTemplate.expire(key,5,TimeUnit.MINUTES);n//---------加入redis队列------nstringRedisTemplate.opsForList().rightPush(RedisKeyEnum.gateway_req_info_query.getKey(),gatewayRequestId);nlog.info("requestinfotoredisquery.");n}n};n}nn@OverridenpublicintgetOrder(){nreturnNettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER-2;n}nn}n}将Redis中数据同步到ES

类:GatewayReqSaveToElasticsearch

platform-cloud/platform-cloud-service/platform-cloud-service-task/src/main/java/com/tinem/platform/service/task/consumer/redis/GatewayReqSaveToElasticsearch.java

packagecom.tinem.platform.service.task.consumer.redis;nnimportcn.hutool.core.collection.CollUtil;nimportcn.hutool.core.date.DateUtil;nimportcn.hutool.core.util.StrUtil;nimportcn.hutool.http.HttpUtil;nimportcom.alibaba.fastjson.JSONObject;nimportcom.tinem.platform.module.pojo.co.GatewayHeadName;nimportcom.tinem.platform.module.pojo.co.RedisKeyEnum;nimportlombok.Data;nimportlombok.extern.slf4j.Slf4j;nimportorg.springframework.beans.factory.annotation.Configurable;nimportorg.springframework.boot.ApplicationArguments;nimportorg.springframework.boot.ApplicationRunner;nimportorg.springframework.boot.context.properties.ConfigurationProperties;nimportorg.springframework.dao.InvalidDataAccessApiUsageException;nimportorg.springframework.data.redis.core.StringRedisTemplate;nimportorg.springframework.stereotype.Component;nimportredis.clients.jedis.exceptions.JedisException;nnimportjavax.annotation.Resource;nimportjava.util.Date;nimportjava.util.HashMap;nimportjava.util.Map;nimportjava.util.NoSuchElementException;nimportjava.util.concurrent.TimeUnit;nn/**n*将网关请求信息保存到ES中n*//TODO可以优化成批量获取和批量插入n*/n@Slf4jn@Datan@Componentn@Configurablen@ConfigurationProperties(prefix="gateway.req.save.elasticsearch")npublicclassGatewayReqSaveToElasticsearchimplementsApplicationRunner{nn//执行线程数nprivateintthreadNum;n//es地址nprivateStringelasticsearchUrl;nn@ResourcenStringRedisTemplatestringRedisTemplate;nn@Overridenpublicvoidrun(ApplicationArgumentsargs)throwsException{nfor(inti=0;i<threadNum;i++){nThreadthread=newThread(()->{nwhile(true){ntry{n//从redis队列中获取请求流水,以阻塞队列方式,如果没有流水则最长等待1天nStringgatewayRequestId=stringRedisTemplate.opsForList().leftPop(RedisKeyEnum.gateway_req_info_query.getKey(),1,TimeUnit.DAYS);n//如果没有获取到流水号nif(StrUtil.isBlank(gatewayRequestId)){ncontinue;n}nStringredisGatewayRequestId=RedisKeyEnum.gateway_req_info.getKey(gatewayRequestId);n//从redis中获取请求信息nMap<Object,Object>req=stringRedisTemplate.opsForHash().entries(redisGatewayRequestId);nif(CollUtil.isEmpty(req)){ncontinue;n}n//将请求信息保存到ESnStrings=HttpUtil.post(StrUtil.format(elasticsearchUrl,newHashMap(){{nStringmillis=(String)req.getOrDefault(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_ACCEPT_TIMESTAMP,System.currentTimeMillis()+"");nput("date",DateUtil.formatDate(newDate(Long.parseLong(millis))));nput("env",req.get(GatewayHeadName.X_PLATFORM_GATEWAY_CONTEXT_ENV));nput(GatewayHeadName.X_PLATFORM_GATEWAY_REQUEST_ID,req.get(GatewayHeadName.X_PLATFORM_GATEWAY_REQUEST_ID));n}}),JSONObject.toJSONString(req));n//清理redis中的数据nstringRedisTemplate.delete(redisGatewayRequestId);nlog.debug(s);n}catch(InvalidDataAccessApiUsageExceptione){nif(e.getCause()instanceofJedisException&&e.getCause().getCause()instanceofNoSuchElementException){n//如果redis中没有数据,则睡眠60秒ntry{nThread.sleep(60*1000);n}catch(InterruptedExceptionex){nex.printStackTrace();n}n}else{nlog.error("",e);n}n}catch(Exceptione){nlog.error("",e);n}nn}n});nthread.setName("gatewayReqSaveElasticsearch-"+i);nthread.start();n}nn}n}n在ES中建立索引模版

请求:

地址:/_template/data-tinem-all-gateway-requestn方法:put

{n"index_patterns":["data-tinem-*-gateway-request-*"],//可以通过"book_*"和"bar*"来适配,template字段已过期n"order":0,//模板的权重,多个模板的时候优先匹配用,值越大,权重越高n"aliases":{n"data-tinem-all-gateway-request":{}//索引对应的别名n},n"settings":{n"number_of_shards":1,//索引分片数量n"number_of_replicas":1//副本数量n},n"mappings":{n"_source":{n"enabled":true//如果我们只关心查询的评分结果,而不用查看原始文档的内容,就设置"_source{"enabled":false}.——这能节省磁盘空间并减少磁盘IO上的开销.n},n"dynamic":"true",//只用定义的字段,关闭默认的自动类型推断n"properties":{n//收到请求的时间n"x-platform-gateway-accept-timestamp":{n"type":"date"n},n//客户端idn"x-platform-gateway-context-client_id":{n"type":"keyword",n"ignore_above":256n},n//用户idn"x-platform-gateway-context-user_id":{n"type":"keyword",n"ignore_above":256n},n//网关请求流水号n"x-platform-gateway-req-api_request_id":{n"type":"keyword",n"ignore_above":256n},n//请求报文n"x-platform-gateway-req-body":{n"type":"text"n},n//字符编码n"x-platform-gateway-req-charset":{n"type":"keyword",n"ignore_above":32n},n//加密算法:IVn"x-platform-gateway-req-crypto_iv":{n"type":"keyword",n"ignore_above":256n},n//加密算法:KEYn"x-platform-gateway-req-crypto_key":{n"type":"keyword",n"ignore_above":256n},n//加密算法n"x-platform-gateway-req-crypto_type":{n"type":"keyword",n"ignore_above":256n},n//是否开启debug模式n"x-platform-gateway-req-debug":{n"type":"keyword",n"ignore_above":256n},n//jwtn"x-platform-gateway-req-jwt":{n"type":"keyword",n"ignore_above":4096n},n//jwtjitn"x-platform-gateway-context-jti":{n"type":"keyword",n"ignore_above":64n},n//请求ipn"x-platform-gateway-req-ip":{n"type":"keyword",n"ignore_above":64n},n//请求IP归属地n"x-platform-gateway-req-ip-country":{n"type":"keyword",n"ignore_above":64n},n//设备IDn"x-platform-gateway-req-device":{n"type":"keyword",n"ignore_above":256n},n//浏览器信息n"User-Agent":{n"type":"keyword",n"ignore_above":1024n},n//请求来自于哪个站点n"Origin":{n"type":"keyword",n"ignore_above":1024n},n//该网页是从哪个页面链接过来的n"Referer":{n"type":"keyword",n"ignore_above":1024n},n//域名n"Host":{n"type":"keyword",n"ignore_above":1024n},n//语言n"x-platform-gateway-req-lang":{n"type":"keyword",n"ignore_above":256n},n//接口n"x-platform-gateway-req-method":{n"type":"keyword",n"ignore_above":256n},n//服务n"x-platform-gateway-req-service":{n"type":"keyword",n"ignore_above":512n},n//签名n"x-platform-gateway-req-sign":{n"type":"keyword",n"ignore_above":256n},n//签名算法n"x-platform-gateway-req-sign_type":{n"type":"keyword",n"ignore_above":256n},n//客户端发起请求的时间n"x-platform-gateway-req-timestamp":{n"type":"date"n},n//接口版本n"x-platform-gateway-req-version":{n"type":"keyword",n"ignore_above":256n},n//客户端请求流水号n"x-platform-gateway-request_id":{n"type":"keyword",n"ignore_above":256n},n//环境n"x-platform-gateway-request-env":{n"type":"keyword",n"ignore_above":256n},n//返回数据n"x-platform-gateway-res-body":{n"type":"text"n},n//返回状态码n"x-platform-gateway-res-code":{n"type":"keyword",n"ignore_above":256n},n//返回消息n"x-platform-gateway-res-message":{n"type":"keyword",n"ignore_above":256n},n//返回是否成功n"x-platform-gateway-res-succes":{n"type":"keyword",n"ignore_above":256n},n//服务返回时间n"x-platform-gateway-res-timestamp":{n"type":"date"n},n//业务返回码n"x-platform-res-code":{n"type":"keyword",n"ignore_above":256n},n//服务返回码n"x-platform-res-message":{n"type":"text"n},n//服务是否成功n"x-platform-res-success":{n"type":"keyword",n"ignore_above":256n},n//服务返回时间n"x-platform-res-timestamp":{n"type":"date"n}n}n}n}

一个请求报文的示例:

{n"_index":"data-tinem-test-gateway-request-2023-05-15",n"_type":"_doc",n"_id":"92c45a7d-c45f-4883-9c17-f1390081fd55",n"_version":1,n"_score":null,n"fields":{n"Origin":[n""n],n"x-platform-gateway-req-ip":[n""n],n"x-platform-gateway-res-timestamp":[n"2023-05-15T04:15:46.668Z"n],n"User-Agent":[n"PostmanRuntime/7.32.2"n],n"x-platform-gateway-res-succes":[n"true"n],n"x-platform-gateway-req-timestamp":[n"2023-05-15T04:15:46.306Z"n],n"x-platform-gateway-req-version":[n"0.0.1-SNAPSHOT"n],n"x-platform-gateway-req-sign":[n"df6bfe8deeaacf550a87fc376c016715cb1cc3a3c4af5a5f4872c217da95e3d5947d01ed52661e84fd76dbff8deeeee9ea768f6431c85e96284953a0b9ec50a6"n],n"x-platform-gateway-request_id":[n"92c45a7d-c45f-4883-9c17-f1390081fd55"n],n"x-platform-res-success":[n"true"n],n"x-platform-gateway-req-sign_type":[n"SHA512"n],n"x-platform-gateway-req-method":[n"/event.api"n],n"x-platform-gateway-req-crypto_key":[n""n],n"x-platform-gateway-res-message":[n"success"n],n"x-platform-gateway-req-lang":[n"en-us"n],n"x-platform-gateway-req-service":[n"platform-cloud-service-link"n],n"x-platform-res-code":[n"SUCCESS"n],n"x-platform-gateway-req-charset":[n"UTF-8"n],n"x-platform-gateway-context-jti":[n"7ced7a84-9595-4733-a5b0-e4aef3d3a40c"n],n"x-platform-gateway-request-env":[n"test"n],n"x-platform-gateway-req-crypto_iv":[n""n],n"Referer":[n""n],n"x-platform-gateway-req-ip-country":[n""n],n"Host":[n"gateway-platform.fuletec.club"n],n"x-platform-gateway-req-jwt":[n"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiYWxsIiwiYSIsImIiXSwiZ3JhbnRfdHlwZSI6ImNsaWVudF9jcmVkZW50aWFscyIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2ODQyMDczODIsImp0aSI6IjdjZWQ3YTg0LTk1OTUtNDczMy1hNWIwLWU0YWVmM2QzYTQwYyIsImNsaWVudF9pZCI6ImFkbWluLW5vLXNlY3VyaXR5In0.hIyxJnLRuOJNPalEuFDPa_kbcgyjTVrn_AZG07fuTRS79r2yz2Quk0lsPqUiIKBFo54jdMyLM3n5fwXravM8jQPDrYkvLk6MY6qXQ9vLi1LxVn9O5L0E8Q5gBdCFVjziY06F8KlBD5VaGs4elzt3ekWf1nwZGEqZBM8E49m76g7gFIh5OlrHOF1FPfFzDqRTb1rgHW9DmYJeXFnCEkQfUkt7LyVGT09CU6p4TlBIlPedvIArRdRdtgzZWst6bgyO2lqKFkz8F8XBC1g3rEajStTIjacJqdo8EgYDrL6iSFQMXKGhIXdAwi-65eeavyi_Y3udMEZHgHgYw9spKywEpQ"n],n"x-platform-res-message":[n"success"n],n"x-platform-gateway-req-api_request_id":[n"cb516c80-398c-487f-9e48-81f4b191ccb3"n],n"x-platform-gateway-req-crypto_type":[n""n],n"x-platform-gateway-req-body":[n"{\"id\":\"6028648677754028032\",\"ip\":\"222.90.214.224\",\"ua\":\"Mozilla/5.0(Macintosh;IntelMacOSX10_15_5)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.116Safari/537.36\"}"n],n"x-platform-gateway-accept-timestamp":[n"2023-05-15T04:15:46.482Z"n],n"x-platform-gateway-context-client_id":[n"admin-no-security"n],n"x-platform-gateway-req-device":[n""n],n"x-platform-gateway-req-debug":[n""n],n"x-platform-gateway-res-code":[n"SUCCESS"n]n},n"sort":[n1684124146482n]n}通过kibana监控微服务成功率进入创建图表界面选择Lens线性图表建立图表

这个图表中我们监控各个服务返回错误的数量变化。

通过x-platform-res-success:false限制只统计错误接口

在Y轴使用x-platform-gateway-req-service做细分

这样就能显示我们每个服务返回错误的数量。

也可以通过Kibana根据业务需要做其他维度的监控或者统计。

如果我们的图标特别复杂还可以通过第三方的图标工具直接从ES中取数据来展示

文章到此结束,如果本次分享的sis最新ip和微服务网关存储请求数据到Elasticsearch的问题解决了您的问题,那么我们由衷的感到高兴!