赞
踩
写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。
本文关键字:腾讯云、云原生、云数据库、Serverless、云函数
云原生的概念已经出现好一阵了,各大云服务厂商都在争相打磨自己的相关产品,无论是云数据库还是云函数或是其它的功能性产品都在努力的做到Serverless。这样既方便管理,也能节约成本,同时还能提升效率,作为开发者还是有必要了解一下。
TDSQL是腾讯云自研的新一代云原生关系型数据库。支持Serverless计费模式,随用随停,按量付费,并且方便管理,便于快速扩容,兼容MySQL。
SCF是腾讯云提供的无服务器执行环境,可以在无服务器的情况下运行代码。并且结合云IDE可以直接在线修改,省去了打包发布的麻烦,并且自带多环境切换,更加便于调试和发布上线。
首先来到函数服务的管理界面:
首先切换地区,因为在后面的例子中,会结合云数据库,所以这里的地区推荐选择上海或广州,然后我们点击新建【使用官方模板创建一个函数】:
直接搜索博客可以看到一个基于Python的简单案例,支持API访问,继续点击下一步:
这里函数名称可以自定义,注意地域是否正确,描述如果有需要可以修改。
开启日志投递可以看到日志信息,很产生很少的费用,触发器配置这里选择暂不创建即可。然后勾选同意并单击完成。
等待创建后,会自动跳转到函数管理界面,我们可以切换到函数代码来查看在线编辑器,目前已经更换为云IDE:
目前已经有了一个使用静态数据的案例,我们先将完成API的创建,然后再结合TDSQL。
云函数开始运行后,我们需要为其设置访问的API。当然,同样需要在云函数中为其提供响应的支持,在这个例子中,主要提供了两个功能:
如果需要,我们可以扩展更多,现在我们先为已经有的两个功能来创建相应的调用API。首先打开API管理界面【第一次使用需要完成开通和授权流程】:
可以看到如下结果:
使用本地工具测试也可通过:
其它API可以使用相同的配置流程。
目前在活动页面可以免费获得分布式数据库TDSQL MySQL版 1核2G一个月:
如果需要开启公网访问,需要按以下步骤操作:
现在云函数和数据库都已经就位,接下来稍微修改一下云函数中的代码,改为从数据库中动态读取数据,感兴趣的小伙伴也可以添加更多功能。
创建一个blog数据库,编码使用UTF-8:
CREATE DATABASE blog CHARACTER SET utf8mb4;
根据原有代码的样例数据创建一个与之结构相匹配的数据表:
USE blog;
CREATE TABLE IF NOT EXISTS articles (
id INT PRIMARY KEY AUTO_INCREMENT,
category VARCHAR(255) NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
time DATETIME NOT NULL
);
将样例数据插入到数据表中:
INSERT INTO articles (category, title, content, time) VALUES
('blog', 'hello world', 'first blog! hello world!', '2017-12-05 13:45:00'),
('blog', 'record info', 'record work and study!', '2017-12-06 08:22:00'),
('python', 'python study', 'python study for 2.7', '2017-12-06 18:32:00');
现在我们的所有数据已经在数据库中了,接下来我们做亿点点修改,将样例数据改为查询语句:
# -*- coding: utf-8 -*- import sys import logging import json import pymysql from datetime import datetime logging.basicConfig(level=logging.INFO, stream=sys.stdout) logger = logging.getLogger() logger.setLevel(level=logging.INFO) logger.info('Loading function') db_config = { 'host': 'sh-xxx.sql.tencentcdb.com', 'port': 24747, 'user': 'blog', 'password': 'xxx', 'database': 'blog', 'charset': 'utf8mb4' } def get_db_connection(): return pymysql.connect(**db_config) def format_datetime(obj): if isinstance(obj, datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') raise TypeError("Type not serializable") def main_handler(event, context): logger.info('start main_handler') if "requestContext" not in event.keys(): return {"errorCode": 410, "errorMsg": "event is not come from api gateway"} if event["requestContext"]["path"] != "/article/{articleId}" and event["requestContext"]["path"] != "/article": return {"errorCode": 411, "errorMsg": "request is not from setting api path"} conn = get_db_connection() try: with conn.cursor(pymysql.cursors.DictCursor) as cursor: if event["requestContext"]["path"] == "/article" and event["requestContext"]["httpMethod"] == "GET": # 获取文章列表 cursor.execute("SELECT id, category, title, time FROM articles") articles = cursor.fetchall() for article in articles: article['time'] = format_datetime(article['time']) return articles elif event["requestContext"]["path"] == "/article/{articleId}" and event["requestContext"]["httpMethod"] == "GET": # 获取文章内容 articleId = int(event["pathParameters"]["articleId"]) cursor.execute("SELECT * FROM articles WHERE id = %s", (articleId,)) article = cursor.fetchone() if article: article['time'] = format_datetime(article['time']) return article else: return {"errorCode": 412, "errorMsg": "article is not found"} finally: conn.close() return {"errorCode": 413, "errorMsg": "request is not correctly execute"}
在函数代码界面,更新替换代码后,需要点击部署按钮,以发布最新版本。确认右上角显示已部署,测试时也可以考虑开启自动部署,保存后即会部署。
本例中,环境已经内置了PyMySQL来连接数据库,所以我们只需要更新代码就可以了。如果需要安装其它依赖也可以参考文档,使用pip命令进行安装。
代码部署完毕后,再次调用API进行测试:
获取某个文章内容的API可以参考如下配置:
至此,我们所有的操作均在无服务器下进行,代码的更新和部署也十分的方便,如果有帮助请点赞留言,支持一下!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。