热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kong插件应用(熔断限流,黑白名单,认证(basic,key,jwt,hmac,),授权,加密,zipkin链路跟踪,日志,prometheus可视化,爬虫控制插件)

kong插件应用(熔断限流,黑白名单,认证(basic,key,jwt,hmac,),授权,加密,zipkin链路跟踪,日志,prometheus可视化,爬虫控制插件),Go语言社

进大厂,身价翻倍的法宝来了!

主讲内容:docker/kubernetes 云原生技术,大数据架构,分布式微服务,自动化测试、运维。

视频地址:ke.qq.com/course/419718


全栈工程师开发手册 (作者:栾鹏)
架构系列文章

kong安装部署以及kong-dashboard参考:https://blog.csdn.net/luanpeng825485697/article/details/85287291

插件概述

插件之于kong,就像Spring中的aop功能。

在请求到达kong之后,转发给后端应用之前,你可以应用kong自带的插件对请求进行处理,合法认证,限流控制,黑白名单校验,日志采集等等。同时,你也可以按照kong的教程文档,定制开发属于自己的插件。

kong的插件分为开源版和社区版,社区版还有更多的定制功能,但是社区版是要收费的。

目前,KONG开源版本一共开放28个插件,如下:

acl、aws-lambda、basic-auth、bot-detection、correlation-id、cors、datadog、file-log、galileo、hmac-auth、http-log、ip-restriction、jwt、key-auth、ldap-auth、loggly、oauth2、rate-limiting、request-size-limiting、request-termination、request-transformer、response-ratelimiting、response-transformer、runscope、statsd、syslog、tcp-log、udp-log

以上插件,主要分五大类,Authentication认证,Security安全,Traffic Control流量控制,Analytics & Monitoring分析&监控,Logging日志,其他还有请求报文处理类。

熔断request-termination插件

该插件用来定义指定请求或服务不进行上层服务,而直接返回指定的内容.用来为指定的请求或指定的服务进行熔断.
在这里插入图片描述

这样再访问指定的服务就会返回403错误,消息为So long and thanks for all the fish!

可以参考:https://docs.konghq.com/hub/kong-inc/request-termination/

限流rate-limiting插件

安装rate-limiting插件

在这里插入图片描述

可以不用配置redis,不过要设置限制方法,我设置了每秒不超过2次。

当请求超过2次,会出现

{ "message": "API rate limit exceeded" }

说明:

根据年、月、日、时、分、秒设置限流规则,多个限制同时生效。

比如:每天不能超过10次调用,每分不能超过3次。

当一分钟内,访问超过3次,第四次就会报错。

当一天内,访问次数超过10次,第十一次就会报错。

IP黑白名单ip-restriction限制插件

IP限制插件,是一个非常简单的插件,可以设置黑名单IP,白名单IP这个很简单。

规则:

IP黑白名单,支持单个,多个,范围分段IP(满足CIDR notation规则)。多个IP之间用逗号,分隔。

CIDR notation规范如下:

10.10.10.0/24 表示10.10.10.*的都不能访问。

关于CIDR notation的规则,不在本文讨论范围内,请自行查阅https://zh.wikipedia.org/wiki/%E6%97%A0%E7%B1%BB%E5%88%AB%E5%9F%9F%E9%97%B4%E8%B7%AF%E7%94%B1

1.设置黑名单IP

在这里,我将我自己的IP设置成黑名单.

在这里插入图片描述

似乎我安装的kong-dashboard黑白名单写反了。

基本认证Basic Authentication插件

在Consumers 页面,添加Basic Auth

在这里插入图片描述

输入用户名和密码,我这里设置为luanpeng luanpeng。计算认证头。获取luanpeng:luanpeng字符串的base64编码。

可以直接在linux下输出

$ echo "luanpeng:luanpeng"|base64 bHVhbnBlbmc6bHVhbnBlbmcK

在插件页面,设置Basic Auth 绑定目标service,这样请求目标service就需要在http头中添加

Authorization Basic bHVhbnBlbmc6bHVhbnBlbmcK

在这里插入图片描述

设置Basic Auth表单域参数介绍:

表单域名称 默认值 描述
name(必填) 插件名称,在这里该插件名称为:basic-auth
config.hide_credentials(选填) false boolean类型,告诉插件,是否对上游API服务隐藏认证信息。如果配置true,插件将会把认证信息清除,然后再把请求转发给上游api服务。
config.anonymous(选填) String类型,用来作为匿名用户,如果认证失败。如果空,当请求失败时,返回一段4xx的错误认证信息。
key认证key-Auth插件

该插件很简单,利用提前预设好的关键字名称,如下面设置的keynote = apices,然后为consumer设置一个key-auth 密钥,假如key-auth=test@keyauth。

在请求api的时候,将apikey=test@keyauth,作为一个参数附加到请求url后,或者放置到headers中。

在插件页面添加key-auth插件
在这里插入图片描述

配置consumer key-auth
在这里插入图片描述

key-auth两种方式可通过校验

curl http://xxx.xx.xx.xx:xxx/xxx -H 'apikey: luanpeng' http://xxx.xxx.xxx.xxx:xxx/xxx?apikey=luanpeng

如果选中key_in_body, 则必须在传递body的参数中加入{“apikey”:“xxxx”}来实现认证.

HMAC认证

先启动HMAC插件,设置绑定的service和rout,以启动hmac验证。然后在Consumers页面中Hmac credentials of Consumer设置中添加一个username和secret。

在这里插入图片描述

准备生成http的header中的签名。请求是使用该签名。这里附上python的调用包

# kong_hmac.py import base64 import hashlib import hmac import re from wsgiref.handlers import format_date_time from datetime import datetime from time import mktime def create_date_header(): now = datetime.now() stamp = mktime(now.timetuple()) return format_date_time(stamp) def get_headers_string(signature_headers): headers = "" for key in signature_headers: if headers != "": headers += " " headers += key return headers def get_signature_string(signature_headers): sig_string = "" for key, value in signature_headers.items(): if sig_string != "": sig_string += "n" if key.lower() == "request-line": sig_string += value else: sig_string += key.lower() + ": " + value return sig_string def md5_hash_base64(string_to_hash): m = hashlib.md5() m.update(string_to_hash) return base64.b64encode(m.digest()) # sha1签名算法,字符串的签名,并进行base64编码 def sha1_hash_base64(string_to_hash, secret): h = hmac.new(secret, (string_to_hash).encode("utf-8"), hashlib.sha1) return base64.b64encode(h.digest()) def generate_request_headers(username, secret, url, data=None, content_type=None): # Set the authorization header template auth_header_template = ( 'hmac username="{}",algorithm="{}",headers="{}",signature="{}"' ) # Set the signature hash algorithm algorithm = "hmac-sha1" # Set the date header date_header = create_date_header() # 产生GMT格式时间 # print('GMT时间:',date_header) # Set headers for the signature hash signature_headers = {"date": date_header} # Determine request method if data is None or content_type is None: request_method = "GET" else: request_method = "POST" # MD5 digest of the content base64md5 = md5_hash_base64(data) # Set the content-length header content_length = str(len(data)) # Add headers for the signature hash signature_headers["content-type"] = content_type signature_headers["content-md5"] = base64md5 signature_headers["content-length"] = content_length # Strip the hostname from the URL target_url = re.sub(r"^https?://[^/]+/", "/", url) # print('请求路径:',target_url) # Build the request-line header request_line = request_method + " " + target_url + " HTTP/1.1" # print('request_line:',request_line) # Add to headers for the signature hash signature_headers["request-line"] = request_line # Get the list of headers headers = get_headers_string(signature_headers) # 转化为list # print('签名的属性名称:',headers) # Build the signature string signature_string = get_signature_string(signature_headers) # 获取要签名的字符串 # print('要签名的字符串:',signature_string) # Hash the signature string using the specified algorithm signature_hash = sha1_hash_base64(signature_string, secret) # 签名 # print('签名后字符串:',signature_hash) # Format the authorization header auth_header = auth_header_template.format( username, algorithm, headers, signature_hash.decode('utf-8') ) if request_method == "GET": request_headers = {"Authorization": auth_header, "Date": date_header} else: request_headers = { "Authorization": auth_header, "Date": date_header, "Content-Type": content_type, "Content-MD5": base64md5, "Content-Length": content_length, } return request_headers

调用该包,demo如下

# get示例 username = 'vesionbook' secret = 'vesionbook'.encode('utf-8') url = 'http://192.168.11.127:30309/arctern' request_headers = generate_request_headers(username, secret, url) print('请求头:',request_headers) r = requests.get(url, headers=request_headers) print('Response code: %dn' % r.status_code) print(r.text) jwt认证插件

先为Consumer消费者建立jwt凭证

在这里插入图片描述

在线JWT编码和解码https://jwt.io/

在这里插入图片描述

图中HEADER 部分声明了验证方式为 JWT,加密算法为 HS256

PAYLOAD 部分原本有 5 个参数

{ "iss": "kirito", # Consumer的jwt中设置的key "iat": 1546853545, # 签发时间戳 "exp": 1546853585, # 过期时间戳 "nbf": 1546853585 # 生效日期 "aud": "cnkirito.moe", "sub": "250577914@qq.com", }

这里面的前五个字段都是由 JWT 的标准(RFC7519)所定义的。

  • iss: 该 JWT 的签发者,(验证的时候判断是否是签发者)
  • sub: 该 JWT 所面向的用户,(验证的时候判断是否是所有者)
  • aud: 接收该 JWT 的一方,标识令牌的目标受众。(验证的时候判断我是否是其中一员)
  • exp(expires): 什么时候过期,这里是一个 Unix 时间戳,精确到s, ,它必须大于jwt的签发时间
  • iat(issued at): 在什么时候签发的,精确到s的时间戳, claims_to_verify配置参数不允许设置iat
  • nbf:定义jwt的生效时间
  • jti:jwt唯一身份标识,主要用来作为一次性token来使用,从而回避重放攻击

iss 这一参数在 Kong 的 Jwt 插件中对应的是curl http://127.0.0.1:8001/consumers/kirito/jwt 获取的用户信息中的 key 值。

而其他值都可以选填.

在页面上VERIFY SIGNATURE中填入自己的secret, 也就是在kong的dashboard中消费者创建jwt证书时的secret.

我们使用 jwt 官网(jwt.io)提供的 Debugger 功能快速生成我们的 Jwt, 由三个圆点分隔的长串便是用户身份的标识了.

打开kong的jwt插件
在这里插入图片描述

在key_claim_name中定义存储key的字段名称. 我们是使用的iss字段.
COOKIE_names表示如果使用COOKIE传递证书, 则COOKIE中的名称.
claims_to_verify表示验证证书中哪些字段, 我这里验证证书的发布时间和过期时间.

然后在header中携带证书信息就可以了.
在这里插入图片描述

Jwt 也可以作为 QueryString 参数携带在 get 请求中

curl http://localhost:8000/hello/hi?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2Y252WVNGelRJR3lNeHpLU2duTlUwdXZ4aXhkWVdCOSJ9.3iL4sXgZyvRx2XtIe2X73yplfmSSu1WPGcvyhwq7TVE

如果在插件配置中设置了COOKIE_names为luanpeng-COOKIE

则在发送中

--COOKIE luanpeng-COOKIE=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJYSnFRMXpSQVhUWk52dlNHZ1Nsb1FyejczOFBqT0hFZyIsImV4cCI6MTUyNTc5MzQyNSwibmJmIjoxNTI1Nzc1NDI1LCJpYXQiOjE1MjU3NzU0MjV9.0Cv8rJkXTMNKAvPTOBV1w0UYVhRx3XRb6xJofxloRuA

不同配置下,可能返回证书未生效, 证书已过期, 或者返回正常结果

通常用户需要自己写一个服务去帮助 Consumer 生成自己的 Jwt,自然不能总是依赖于 Jwt 官方的 Debugger,当然也没必要重复造轮子(尽管这并不难),可以考虑使用开源实现,在jwt官网上Libraries for Token Signing/Verification部分 根据自己使用的语言,选择对应的包,来实现证书生成器. 最好可以直接集成到api网关中.

这里用python实现了一个简单的签名生成器

import sys import os dir_common = os.path.split(os.path.realpath(__file__))[0] + '/../' sys.path.append(dir_common) # 将根目录添加到系统目录,才能正常引用common文件夹 from aiohttp import web import asyncio import logging import uvloop import time,datetime import jwt asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) routes = web.RouteTableDef() # 返回客户的json信息 def write_response(status,message,result): respOnse={ 'status':status, # 状态,0为成功,1为失败 'message':message, # 错误或成功描述。字符串 'result':result # 成功的返回结果,字典格式 } return response @routes.get('/') async def hello(request): return web.Response(text="Hello, world") # 签名 @routes.post('/sign') async def sign(request): # 异步监听,只要一有握手就开始触发 try: data = await request.json() # 等待post数据完成接收,只有接收完成才能进行后续操作.data['key']获取参数 except Exception as e: logging.error("image file too large or cannot convert to json") return web.json_response(write_response(1,"image file too large or cannot convert to json",{})) logging.info('license sign request start, data is %s,%s' % (data, datetime.datetime.now())) if "username" not in data or 'password' not in data: logging.error("username or password not in data") return web.json_response(write_response(2, "username or password not in data", {})) payload = { "iss": data['username'], "iat": int(time.time()), "exp": int(time.time()) + 60*60, # 有效期一个小时 } encoded_jwt = jwt.encode(payload, data['password'], algorithm='HS256') encoded_jwt = encoded_jwt.decode('utf-8') logging.info('license sign request finish %s, %s' % (datetime.datetime.now(),encoded_jwt)) header = {"Access-Control-Allow-Origin": "*", 'Access-Control-Allow-Methods': 'GET,POST'} result = write_response(0, "success",encoded_jwt) # 同时放在COOKIE中 header['COOKIE']='--COOKIE aicloud-COOKIE='+encoded_jwt return web.json_response(result,headers=header) # 校验 @routes.post('/check') async def check(request): # 异步监听,只要一有握手就开始触发 try: data = await request.json() # 等待post数据完成接收,只有接收完成才能进行后续操作.data['key']获取参数 except Exception as e: logging.error("image file too large or cannot convert to json") return web.json_response(write_response(1,"image file too large or cannot convert to json",{})) logging.info('license check request start, data is %s,%s' % (data,datetime.datetime.now())) if "username" not in data or 'password' not in data or 'sign' not in data: logging.error("username or password or sign not in data") return web.json_response(write_response(2, "username or password or sign not in data", {})) encoded_jwt = data['sign'].encode('utf-8') payload = jwt.decode(encoded_jwt, data['password'], algorithms=['HS256']) if payload['iss']!=data['username']: logging.error("iss in sign != username") return web.json_response(write_response(3, "username error", {})) elif payload['iat']>time.time(): logging.error("sign not effective") return web.json_response(write_response(4, "sign not effective", {})) elif payload['exp'] ACL授权插件

该插件相当于授权插件,授权必须建立在认证的基础上,认证和授权是相互独立的。

ACL策略插件

策略分组规则:

1).为用户分配授权策略组

2).为api添加授权策略分组插件。

3).只有拥有api授权策略分组的用户才可以调用该api。

4).授权策略分组,必须建立在认证机制上,该策略生效的前提,api至少要开启任意一个auth认证插件。

在这里插入图片描述

如果为同一service启用的授权和认证,则光认证是不行的。必须还要授权。将用户设置为授权组。

上面的设置以后,只有属于白名单组的用户才能访问该service,但是究竟哪些用户属于这些组呢,这需要去Consumers页面设置。

在这里插入图片描述

如果想限制某些用户访问某些路径,可以在路由处添加几个路由匹配,对不同的路由匹配设置授权

链路跟踪Zipkin插件

Zipkin 是一款开源的分布式实时数据追踪系统。其主要功能是聚集来自各个异构系统的实时监控数据,用来追踪微服务架构下的系统延时问题。应用系统需要向 Zipkin 报告数据。Kong的Zipkin插件作为zipkin-client就是组装好Zipkin需要的数据包,往Zipkin-server发送数据。

所以首先要部署一个zipkin服务端:参考https://blog.csdn.net/luanpeng825485697/article/details/85772954

部署结束后打开http://xx.xx.xx.xx:9411/api/v2/spans?servicename=test看是否能正常打开

启动zipkin插件:

在插件页面启动插件配置参数

config.http_endpoint :Zipkin接收数据的地址,配置http://xx.xx.xx.xx:9411/api/v2/spans
config.sample_ratio : 采样的频率。设为0,则不采样;设为1,则完整采样。默认为0.001也就是0.1%的采样率, 再调试阶段建议设置采样率为1.

zipkin插件会每次请求,打上如下标签,推送到zipkin服务端

  • span.kind (sent to Zipkin as “kind”)
  • http.method
  • http.status_code
  • http.url
  • peer.ipv4
  • peer.ipv6
  • peer.port
  • peer.hostname
  • peer.service

可以参考:https://github.com/Kong/kong-plugin-zipkin

启用后,此插件会以与zipkin兼容的方式跟踪请求。

代码围绕一个opentracing核心构建,使用opentracing-lua库来收集每个Kong阶段的请求的时间数据。该插件使用opentracing-lua兼容的提取器,注入器和记者来实现Zipkin的协议。

提取器和注射器

opentracing“提取器”从传入的请求中收集信息。如果传入请求中不存在跟踪ID,则基于sample_ratio配置值概率地生成一个跟踪ID 。

opentracing“injector”将跟踪信息添加到传出请求中。目前,仅对kong代理的请求调用注入器; 它不尚未用于请求到数据库,或通过其他插件(如HTTP日志插件)。

日志

目前在Kong的 free plugins中,比较常用的有这么三个:Syslog、File-Log以及Http-Log,下面对这三种插件逐一分析一下。

Syslog

顾名思义,这个插件是把Kong中记录的日志给打印到系统日志中,开启插件之后只需要指定需要使用的API,无需做多余的配置,即可在/var/log/message中发现对应的日志信息,d 但是系统日志鱼龙混杂,如果需要用到ELK等日志分析工具时,需要做一次数据清洗工作。

File-Log

与Syslog一样,File-log的配置也很方便,只需要配置日志路劲就行,开启插件之后,会在对应的对应产生一个logFile。Syslog中提到需要做一些日志清洗工作,但是换成了File-log乍一看好像解决了之前的痛点,实则不然,官方建议这个插件不适合在生产环境中使用,会带来一些性能上的开销,影响正常业务。

Http-Log

http-log是我比较推荐的,它的原理是设置一个log-server地址,然后Kong会把日志通过post请求发送到设置的log-server,然后通过log-server把日志给沉淀下来,相比之前两种插件,这一种只要启一个log-server就好了,出于性能考虑,我用Rust实现了一个log-server,有兴趣可以参考看一下。

prometheus可视化

kong自带的prometheus插件,metrics比较少, 可以网上查一下丰富版的prometheus插件.

比如:https://github.com/yciabaud/kong-plugin-prometheus

现在用这个插件替换kong自带的插件.

最方便的安装方式,一般linux机器上都会自带 luarocks(lua包管理程序),这样一来我们只要把 Plugins 所在的文件夹给移动到服务器的任意目录,然后在该目录下,执行luarocks make 这样一来插件便会自动安装到系统中,不过需要注意的是,此时插件还需要进行手动开启,首先进入/etc/kong/目录,然后cp kong.conf.default kong.conf, 这里注意一定要复制一份单独的kong.conf文件,不能直接对kong.conf.default进行修改,这样是不生效的,然后取消plugin = bundled前面的注释,在这一行后面增加你的插件名,这里注意插件名是不包含前缀 kong-plugin的,重启Kong即可在可视化界面里发现

plugins = bundled,prometheus

在使用新插件之前,需要更新一下数据库:

bash ./resty.sh kong/bin/kong migrations up -c kong.conf 爬虫控制插件bot-detection

备注:

config.whitelist :白名单,逗号分隔的正则表达式数组。正则表达式是根据 User-Agent 头部匹配的。
config.blacklist :黑名单,逗号分隔的正则表达式数组。正则表达式是根据 User-Agent 头部匹配的。

这个字段是用来匹配客户端身份的, 比如是浏览器还是模拟器, 还是python代码.

这个插件已经包含了一个基本的规则列表,这些规则将在每个请求上进行检查。你可以在GitHub上找到这个列表 https://github.com/Kong/kong/blob/master/kong/plugins/bot-detection/rules.lua.


推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • “您可以从三个选项中(快速、便宜或好)选择两个”提出这个问题的人可能不是可观测性工程师。但也可能是,在可观测性方面,决定您 ... [详细]
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
author-avatar
你问什么只为她停留_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有