golang现代化高性能URL短链接微服务插件库url-shortener的使用
Golang现代化高性能URL短链接微服务插件库url-shortener的使用
项目简介
url-shortener是一个基于Golang开发的URL短链接服务,支持MySQL数据库存储,使用自然数(ID)和短字符串之间的双射转换算法。
安装方法
使用Docker Compose
docker-compose up --build
使用现有MySQL数据库
- 编辑.env文件添加MySQL连接字符串
- 运行mysql_init/create_table.sql初始化数据库表
- 启动服务
go run main.go
使用示例
创建短链接
curl -X POST -H "Content-Type:application/json" -d "{\"url\": \"http://www.google.com\"}" http://localhost:8081/shorten
预期输出:
{"url":"localhost:8081/3"}
重定向测试
curl -v localhost:8081/3
预期输出:
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8081 (#0)
> GET /3 HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 303 See Other
< Location: http://www.google.com
< Date: Mon, 04 Jun 2018 08:03:13 GMT
< Content-Length: 48
< Content-Type: text/html; charset=utf-8
<
<a href="http://www.google.com">See Other</a>.
完整示例代码
package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"github.com/gorilla/mux"
_ "github.com/go-sql-driver/mysql"
)
// URL结构体
type URL struct {
ID int `json:"id"`
URL string `json:"url"`
}
// 数据库连接
var db *sql.DB
func main() {
// 初始化数据库连接
initDB()
defer db.Close()
// 创建路由
router := mux.NewRouter()
// 路由处理
router.HandleFunc("/shorten", shortenURL).Methods("POST")
router.HandleFunc("/{id}", redirectURL).Methods("GET")
// 启动服务器
log.Fatal(http.ListenAndServe(":8081", router))
}
// 初始化数据库连接
func initDB() {
var err error
db, err = sql.Open("mysql", os.Getenv("DB_CONN"))
if err != nil {
log.Fatal(err)
}
err = db.Ping()
if err != nil {
log.Fatal(err)
}
}
// 创建短链接
func shortenURL(w http.ResponseWriter, r *http.Request) {
var url URL
err := json.NewDecoder(r.Body).Decode(&url)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 插入数据库
res, err := db.Exec("INSERT INTO urls(url) VALUES(?)", url.URL)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 获取ID
id, err := res.LastInsertId()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 返回短链接
shortURL := fmt.Sprintf("localhost:8081/%d", id)
json.NewEncoder(w).Encode(map[string]string{"url": shortURL})
}
// 重定向
func redirectURL(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
var url string
err := db.QueryRow("SELECT url FROM urls WHERE id = ?", id).Scan(&url)
if err != nil {
http.Error(w, "URL not found", http.StatusNotFound)
return
}
http.Redirect(w, r, url, http.StatusSeeOther)
}
许可证
本项目采用MIT开源许可证。
更多关于golang现代化高性能URL短链接微服务插件库url-shortener的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang现代化高性能URL短链接微服务插件库url-shortener的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang现代化高性能URL短链接微服务插件库url-shortener使用指南
url-shortener
是一个用Go语言编写的高性能URL短链接服务库,它提供了简单易用的API来创建、管理和重定向短链接。下面我将详细介绍如何使用这个库。
安装
首先安装url-shortener
库:
go get github.com/yourusername/url-shortener
基本使用
1. 初始化短链接服务
package main
import (
"fmt"
"log"
"net/http"
"github.com/yourusername/url-shortener/pkg/shortener"
"github.com/yourusername/url-shortener/pkg/store"
)
func main() {
// 初始化存储(这里使用内存存储,生产环境建议使用Redis或数据库)
storage := store.NewMemoryStore()
// 创建短链接服务实例
shortenerService := shortener.NewShortener(storage)
// 设置HTTP路由
http.HandleFunc("/shorten", func(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
originalURL := r.FormValue("url")
if originalURL == "" {
http.Error(w, "URL is required", http.StatusBadRequest)
return
}
// 生成短链接
shortURL, err := shortenerService.Shorten(originalURL)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "Short URL: %s", shortURL)
})
// 重定向路由
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
shortCode := r.URL.Path[1:] // 去掉前导斜杠
if shortCode == "" {
http.Error(w, "Not found", http.StatusNotFound)
return
}
originalURL, err := shortenerService.Resolve(shortCode)
if err != nil {
http.Error(w, "URL not found", http.StatusNotFound)
return
}
http.Redirect(w, r, originalURL, http.StatusMovedPermanently)
})
// 启动服务器
log.Println("Server started on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
2. 使用Redis作为存储后端
对于生产环境,建议使用Redis作为存储后端:
// 初始化Redis存储
redisStore, err := store.NewRedisStore(&store.RedisConfig{
Addr: "localhost:6379",
Password: "", // 无密码
DB: 0, // 默认DB
})
if err != nil {
log.Fatalf("Failed to connect to Redis: %v", err)
}
// 使用Redis存储创建短链接服务
shortenerService := shortener.NewShortener(redisStore)
3. 自定义短链接生成策略
url-shortener
允许自定义短链接生成策略:
// 自定义ID生成器
customIDGenerator := func(originalURL string) string {
// 这里可以实现你自己的ID生成逻辑
// 例如使用哈希+base64编码
h := sha256.New()
h.Write([]byte(originalURL))
return base64.URLEncoding.EncodeToString(h.Sum(nil))[:8]
}
// 使用自定义ID生成器创建短链接服务
shortenerService := shortener.NewShortenerWithOptions(storage, shortener.Options{
IDGenerator: customIDGenerator,
})
高级功能
1. 添加链接过期时间
// 创建带有过期时间的短链接
expiration := time.Now().Add(24 * time.Hour) // 24小时后过期
shortURL, err := shortenerService.ShortenWithExpiration(originalURL, expiration)
2. 添加点击统计
// 获取短链接的点击次数
clickCount, err := shortenerService.GetClickCount(shortCode)
if err != nil {
// 处理错误
}
fmt.Printf("Short link %s has been clicked %d times\n", shortCode, clickCount)
3. 作为中间件使用
url-shortener
可以作为中间件集成到现有web框架中:
// 使用Gin框架示例
router := gin.Default()
// 添加短链接路由
router.POST("/shorten", func(c *gin.Context) {
originalURL := c.PostForm("url")
shortURL, err := shortenerService.Shorten(originalURL)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"short_url": shortURL})
})
// 添加重定向路由
router.GET("/:shortCode", func(c *gin.Context) {
shortCode := c.Param("shortCode")
originalURL, err := shortenerService.Resolve(shortCode)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "URL not found"})
return
}
c.Redirect(http.StatusMovedPermanently, originalURL)
})
性能优化
url-shortener
在设计时就考虑了高性能:
- 使用高效的内存管理
- 支持连接池(对于Redis存储)
- 最小化锁竞争
- 使用高效的ID生成算法
部署建议
-
对于高流量场景,建议:
- 使用Redis集群作为存储后端
- 部署多个实例并使用负载均衡
- 启用HTTP缓存头
-
监控指标:
- 请求延迟
- 存储后端性能
- 错误率
总结
url-shortener
是一个功能强大且易于使用的Go语言URL短链接库,它提供了:
- 简单直观的API
- 多种存储后端支持
- 高性能设计
- 可扩展的架构
- 丰富的功能集
通过上述示例,您可以快速集成url-shortener
到您的应用中,构建自己的高性能短链接服务。