网站首页 > 技术文章 正文
- 必须安装Docker并运行docker守护进程。
- 运行docker命令的用户可能被添加到docker组,否则你可能需要sudo权限来运行这些命令。(可选)
- 在IP Geolocation API创建一个账户,并复制API密钥。
- 一个自签的证书。(https://getacert.com/selfsignedcert.html)
- 一个有效的域名。
在本教程中,我们将研究如何将一个运行ip-geolocation服务的flask应用程序、一个用于缓存的redis容器和一个配置了反向代理的nginx容器docker化。
- 我们将创建一个自定义的桥,以实现容器之间基于名字的通信。所有被创建的容器都将被连接到这个桥上。
- 请求由nginx容器接收,该容器被配置为反向代理服务器,将请求转发到配置的后端容器。
- 我们有3个API容器,运行一个flask应用程序,编码为联系所提供的API服务,以获取和服务所提供的IP地址的详细信息。
- 数据缓存服务是由redis容器提供的。 当我们第一次请求一个IP地址的详细信息时,API容器首先检查redis容器,看是否有任何缓存的信息。如果有的话,就直接从redis容器中提供详细信息。
- 如果没有,该容器就会与API服务提供商联系,收集数据,然后将其发送到redis容器中进行服务和缓存。
按照此文件创建一个秘密来存储你的API密钥。我们将配置API容器以从秘密管理器中获取密钥。
mkdir -p ip-geo/{conf,ssl} ; cd ip-geo/git clone https://github.com/sreehariskumar/ip-geo-location-finder.git
conf子目录用来保存nginx的配置文件,ssl子目录用来保存自签名的证书。
这些文件可以从git库中克隆。
cat app.py
import os
import requests
import json
import redis
from flask import Flask , jsonify , make_response
import boto3
def get_seceret(*,secret_name=None,secret_key=None,region_name=None):
secrets_client = boto3.client(service_name ="secretsmanager",region_name=region_name)
response = secrets_client.get_secret_value(SecretId=secret_name)
ipstack_secrets = json.loads(response['SecretString'])
return ipstack_secrets[secret_key]
def get_from_cache(*,host=None):
try:
redis_con = redis.Redis(host=redis_host,port=redis_port)
cached_result = redis_con.get(host)
if cached_result:
output = json.loads(cached_result)
output["cached"] = "True"
output["apiServer"] = hostname
return output
else:
return False
except:
return "Error In get_from_cache function."
def set_to_cache(*,host=None,ipgeolocation_key=None):
try:
redis_con = redis.Redis(host=redis_host,port=redis_port)
ipgeolocation_url = "https://api.ipgeolocation.io/ipgeo?apiKey={}&ip={}".format(ipgeolocation_key,host)
geodata = requests.get(url=ipgeolocation_url)
geodata = geodata.json()
geodata["cached"] = "False"
geodata["apiServer"] = hostname
redis_con.set(host,json.dumps(geodata))
redis_con.expire(host,3600)
return geodata
except:
return "Error In set_to_cache function."
app = Flask(__name__)
@app.route('/ip/<ip>',strict_slashes=False)
def ipstack(ip=None):
output = get_from_cache(host=ip)
if output:
return jsonify(output)
output = set_to_cache(host=ip,ipgeolocation_key=ipgeolocation_key)
return jsonify(output)
@app.route('/status',strict_slashes=False)
def check_status():
return make_response("",200)
if __name__ == "__main__":
hostname = os.getenv("HOSTNAME","none")
redis_port = os.getenv("REDIS_PORT","6379")
redis_host = os.getenv("REDIS_HOST",None)
app_port = os.getenv("APP_PORT","8080")
ipgeolocation_key = os.getenv("API_KEY", None)
ipgeolocation_key_from_secret = os.getenv("API_KEY_FROM_SECRETSMANAGER",False)
ipgeolocation_key_secret_name = os.getenv("SECRET_NAME",None)
ipgeolocation_key_name = os.getenv("SECRET_KEY",None)
aws_region = os.getenv("REGION_NAME",None)
if ipgeolocation_key_from_secret == "True":
ipgeolocation_key = get_seceret(secret_name=ipgeolocation_key_secret_name,
secret_key=ipgeolocation_key_name,
region_name=aws_region )
app.run(port=app_port,host="0.0.0.0",debug=True)
该代码设置了一个Flask网络应用程序,通过一个API端点提供IP地址的地理位置信息。该API调用一个外部服务ipgeolocation.io,以检索地理位置信息。该API旨在将ipgeolocation.io的响应缓存在Redis数据库中一段时间(1小时),以减少API调用次数并提高响应时间。
当API收到一个关于IP地理位置信息的请求时,它首先检查Redis数据库中的缓存响应。如果响应在缓存中,API会返回缓存的响应。如果响应不在缓存中,API会调用ipgeolocation.io来检索地理位置信息,并将响应存储在Redis数据库中,过期时间为1小时。然后API从ipgeolocation.io返回响应。
访问ipgeolocation.io的API密钥可以指定为环境变量或从AWS Secrets Manager中检索。
该代码使用了以下库。
- os: 提供了一种与底层操作系统互动的方式,如读取环境变量。
- requests: 向外部API发出HTTP请求。
- json:处理JSON数据格式。
- redis:提供一个与Redis数据库交互的Python客户端。
- flask:提供了一个用于构建和运行网络应用的框架。
- boto3:提供一个Python客户端,用于与AWS服务进行交互。
该应用程序可以从命令行或AWS Secrets Manager服务中获取API密钥的纯文本。在任何秘密管理器中存储你的敏感数据以确保安全是最理想的。
猜你喜欢
- 2025-01-15 IT运维面试问题总结-运维(Ceph、Docker、Apache、Nginx等
- 2025-01-15 zabbix通过自定义脚本监控Linux服务、docker nginx容器,图文详细
- 2025-01-15 将.NET Core 微服务和 Kubernetes 、 NGINX、Docker进行部署集成
- 2025-01-15 docker环境的nginx,配置了一个反向代理后端服务,访问 404,解决
- 2025-01-15 Nginx Proxy Manager - Docker 建站最佳伴侣
- 2025-01-15 Docker实战-使用NGINX实现4层的负载均衡
- 2025-01-15 Nginx日志切割方法(包含docker容器中nginx日志的切割)
- 2025-01-15 docker安装nginx搭建简单文件共享服务
- 2025-01-15 Docker部署web服务器之Nginx与PHP联合篇(三)
- 2025-01-15 Docker下安装超常用的nginx容器(alpine版)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)