golang现代化高性能URL短链接微服务插件库url-shortener的使用

Golang现代化高性能URL短链接微服务插件库url-shortener的使用

项目简介

url-shortener是一个基于Golang开发的URL短链接服务,支持MySQL数据库存储,使用自然数(ID)和短字符串之间的双射转换算法。

Build Status Go Report Card GoDoc

安装方法

使用Docker Compose

docker-compose up --build

使用现有MySQL数据库

  1. 编辑.env文件添加MySQL连接字符串
  2. 运行mysql_init/create_table.sql初始化数据库表
  3. 启动服务
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在设计时就考虑了高性能:

  1. 使用高效的内存管理
  2. 支持连接池(对于Redis存储)
  3. 最小化锁竞争
  4. 使用高效的ID生成算法

部署建议

  1. 对于高流量场景,建议:

    • 使用Redis集群作为存储后端
    • 部署多个实例并使用负载均衡
    • 启用HTTP缓存头
  2. 监控指标:

    • 请求延迟
    • 存储后端性能
    • 错误率

总结

url-shortener是一个功能强大且易于使用的Go语言URL短链接库,它提供了:

  • 简单直观的API
  • 多种存储后端支持
  • 高性能设计
  • 可扩展的架构
  • 丰富的功能集

通过上述示例,您可以快速集成url-shortener到您的应用中,构建自己的高性能短链接服务。

回到顶部