如何自己搭建短链接服务

如何自己搭建短链接服务

短链接我们或多或少都使用过,所谓短链接就是根据较长的原链接url生成一段较短的链接,访问短链接可以跳转到对应的原链接,这样做好处在于:1. url更加美观;2. 便于保存和传播;3. 某些网站内容发布有字数限制,短链接可以节约字数。

短链接实现的原理非常简单,可以概括为:

  1. 为每个原链接生成不重复的唯一短链接
  2. 将原链接和对应短链接成对保存到数据库
  3. 访问短链接时,web服务器将目标重定向到对应的原链接

这两天没事用SpringBoot+Redis做了一个短网址服务,支持web方式和api方式创建短网址。

其核心思想就是把生成的短网址与原网址在redis做k-v对应,当短网址k请求到来的时候取出原网址v直接重定向

为了防止短网址冲突,生成短网址的方式是采用获取原网址的md5方式。建议对短网址限时失效防止出现重复问题

代码全在GitHub地址:https://github.com/NiuXiangQian/u

项目过于简单,不准备继续维护

Web效果图

 

Api方式

post http://127.0.0.1:8080/api/v1/generate?ak=ak_123&sk=sk_123

type application/json

body {
    "url":"https://www.baidu.com/s?wd=a&rsv_spt=1&rsv_iqid=0xd1a6a2e5000e2bc1&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=1&rsv_sug2=0&rsv_btype=i&inputT=509&rsv_sug4=509",
    "valid":14400
 }
参数说明:url 传入的长网址
        valid 有效时间(秒),默认四个小时,可以不用穿,-1永久有效

respone {"code": 1,
        "success": true,
        "msg": "ok",
        "data": {
        	"orgUrl": "https://www.baidu.com/s?wd=a&rsv_spt=1&rsv_iqid=0xd1a6a2e5000e2bc1&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=1&rsv_sug2=0&rsv_btype=i&inputT=509&rsv_sug4=509",
        	"shortUrl": "http://127.0.0.1:8080/u/ff185ccd0439f762",
        	"shortTarget": "ff185ccd0439f762",
        	"validTime": 14400
        	}
        }

核心代码

创建短网址

接口

  /**
     * 生成一个短链接
     * @author nxq
     * @param apiGenerateReq:
     * @return com.github.niu.u.common.core.R<java.lang.String>
     */
    @PostMapping("/generate")
    public R<ShortUrlVo> generate(@Valid @RequestBody ApiGenerateReq apiGenerateReq) throws BaseException {
          ShortUrlVo shortURL = urlService.generate(apiGenerateReq.getUrl(),apiGenerateReq.getValid());
          return R.ok(shortURL);
    }

service 

   @Override
    public ShortUrlVo generate(String srcUrl, Long valid) throws BaseException {
        if (valid == null){
            valid = 60L * 60L *4L ;  // 默认有效时间4个小时
        }
        if (valid!= -1 && valid <0){
            throw new BaseException("有效时间非法");
        }
        srcUrl = srcUrl.trim();
       String shortURL =  MD5Util.encryptStr( srcUrl);
       String key = CommonCache.SHORT_URL+shortURL;
        redisTemplate.opsForValue().set(key,srcUrl);
       if (valid != -1){ // -1是永久有效
           redisTemplate.expire(key,valid, TimeUnit.SECONDS);
       }
        ShortUrlVo shortUrlVo = new ShortUrlVo();
       shortUrlVo.setOrgUrl(srcUrl)
               .setShortTarget(shortURL)
               .setValidTime(valid)
               .setShortUrl(generateShortUrl(shortURL));

        return shortUrlVo;
    }

接收短网址请求

    @GetMapping("/u/{shortUrl}")
    public void u(HttpServletResponse response, @PathVariable String shortUrl) throws IOException {
        if (StringUtils.isNotBlank(shortUrl)){
           String url =  redisTemplate.opsForValue().get(CommonCache.SHORT_URL+shortUrl);
           if (StringUtils.isNotBlank(url))
               if (!(url.startsWith("http://")||url.startsWith("https://"))){
                url = "http://"+url;
               }
              response.sendRedirect(url);

            } else{
                response.getWriter().write("url is lose efficacy");
            }
        }

    }

更多请查看github上说明

### Flask服务器连接超时解决方案 在处理Flask服务器的连接超时时,可以通过调整配置参数来优化其性能并减少超时的可能性。以下是几种常见的方法: #### 调整Werkzeug开发服务器默认设置 Flask内置的开发服务器基于Werkzeug,默认情况下并不适合生产环境使用。如果遇到连接超时问题,可以尝试通过修改`timeout`参数延长请求的最大等待时间[^1]。 ```python from flask import Flask app = Flask(__name__) if __name__ == "__main__": app.run(timeout=300) # 设置超时时间为300秒 ``` 需要注意的是,上述代码中的`timeout`并非标准参数,在实际应用中可能需要依赖其他方式实现更复杂的控制逻辑[^2]。 #### 使用多线程或多进程模式运行Flask 为了提高并发能力,可以在启动Flask服务时启用多线程或多进程支持。这有助于缓解因高负载引起的响应延迟和超时现象[^3]。 ```python if __name__ == "__main__": app.run(threaded=True, processes=4) # 启用多线程与多个工作进程 ``` #### 配置Gunicorn作为WSGI容器 对于生产环境中部署的Flask应用程序来说,推荐采用像Gunicorn这样的高性能WSGI HTTP Server替代自带的服务端口监听器。它提供了丰富的选项用于定制化行为,其中包括worker数量以及request timeout时限等重要属性设定[^4]。 安装gunicorn并通过命令行指定相关参数即可完成基本配置: ```bash pip install gunicorn gunicorn --workers=4 --bind=0.0.0.0:8000 --timeout=120 my_flask_app:app ``` 这里设置了四个工作者进程(worker),绑定到本机所有IP地址上的8000端口,并将单次请求允许的最大持续时间设为120秒。 #### 实施反向代理架构设计 当项目规模较大或者对外提供公开访问接口时,通常会引入Nginx/Apache之类的Web服务器充当反向代理角色。它们能够有效屏蔽来自客户端不稳定网络状况所造成的短时间断开重连影响,从而间接改善整体系统的稳定性表现[^5]。 例如,在nginx.conf文件里添加如下片段定义上游目标位置及其对应的行为准则: ```nginx http { upstream flask_server { server 127.0.0.1:8000 fail_timeout=0; } server { listen 80; location / { proxy_pass http://flask_server; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; } } } ``` 此段落描述了如何利用Nginx管理后端Flask实例间的通信关系,同时大幅提升了可容忍的操作间隔长度至十分钟级别。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java劝退师、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值