Springboot最佳实践:构建短url

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Springboot最佳实践:构建短url

欢迎使用,在本教程中,我们将使用Redis和Springboot来演示URL缩短器(也称为Tiny URL)应用程序。该应用程序将创建原始URL并将其存储在Redis内存缓存中。


1.简介

在继续学习本教程之前,我们将了解一些通用术语,例如Spring Boot,Docker和Redis的简介。

1.1什么是Spring Boot?

  • Spring Boot是一个模块,可为Spring框架提供快速的应用程序开发功能,包括自动配置独立代码生产就绪代码
  • 它创建打包为jar的应用程序,并使用嵌入式servlet容器(例如Tomcat,Jetty或Undertow)直接启动应用程序因此,无需部署战争文件
  • 它通过提供入门模板来简化Maven配置,并有助于解决依赖关系冲突。它会自动识别所需的依赖项并将其导入到应用程序中
  • 它有助于删除样板代码,额外的注释和xml配置
  • 它提供了强大的批处理功能,并管理其余端点
  • 它提供了一个高效的jpa-starter库,可以有效地将应用程序与关系数据库连接
  • 它提供了微服务架构和云配置,可集中管理所有与应用程序相关的配置属性。

1.2什么是Docker?

在当今世界,Docker是一个重要术语,

  • 通常在CI / CD平台中使用,该平台在容器中打包和运行具有其依赖项的应用程序
  • 是Linux容器的标准
  • 一个集装箱就是一个运行时,在任何Linux内核的运行,并提供一个私人机器般的Linux下的空间

1.2.1 Docker术语

  • 图片:Docker容器的表示形式,即Java中的JAR或WAR文件
  • 容器:Docker的运行时,即已部署并正在运行的Docker映像。例如,可执行的Spring Boot jar
  • 引擎:管理,创建和运行Docker容器的代码
  • 中心:公共开发人员注册表,用于分发其代码
  • 仓库:与Docker相关的映像的集合,即同一应用程序的不同版本

1.3什么是Redis?

  • Redis是用C编程语言编写的开源内存中数据存储
  • 提供具有可选持久性的分布式内存中键值数据库
  • 通常用作数据库,缓存或消息代理,并支持不同类型的数据库类型,例如字符串,列表,映射,集合或排序集合等。
  • 它的速度很快,并且操作本质上是原子的(即两个客户端可以同时访问数据,而Redis服务器将接收更新的值)
  • 提供实用程序,例如缓存和消息队列

2. Spring Boot URL缩短器

这是实施本教程的系统指南。

2.1申请先决条件

从本教程开始,我们希望目前的用户已经完成Docker安装。如果有人需要完成Docker安装,请观看视频。

让我们开始构建应用程序!

3.从Docker Hub提取Redis镜像并启动它

要启动Redis并在localhost环境上工作,我们将从Docker中提取Redis映像并启动容器。用户可以参考以下命令来拉取映像,然后再启动容器。

Docker命令

## Docker commands
## step1 - Pulling redis image from docker hub
docker pull redis
## step2 - Running the container
docker run -d -p 6379:6379 --name my-redis redis

如果一切顺利,则将Docker映像成功从中拉出并成功启动。您可以使用该docker ps -a命令来验证容器是否已成功启动。

4.创建一个Spring Boot应用程序

以下是开发应用程序涉及的步骤。

4.1 Maven依赖

在这里,我们指定了Spring Boot,Redis,Lombok,Guava和Commons Validator的依赖关系。Maven将自动解决其他依赖关系。更新文件将具有下面的代码。

pom.xml

<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- project properties -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.springboot.redis.tinyurl</groupId>
    <artifactId>SpringbootTinyUrl</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-validator</groupId>
            <artifactId>commons-validator</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            </dependency>
    </dependencies>
    <build>
        <!-- to make the application as fat jar so that spring boot libraries are
            included -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4.2应用程序属性

在以下位置创建一个新的属性文件:SpringbootTinyUrl/src/main/resources/并将应用程序和Redis配置添加到该文件。

application.properties

# Application configuration.
## You can change the server port configuration as per their configuration idea.
server.port=10091
# Redis configuration.
## As we are running Redis on Docker we are setting up its configuration.
spring.redis.host=localhost
spring.redis.port=6379

4.3 Java类

让我们编写此应用程序中涉及的所有Java类。

4.3.1实现/主类

将以下代码添加到主类,以从main方法引导应用程序。永远记住,spring boot应用程序的入口点是包含@SpringBootApplication注释和静态main方法的类。

Runner.java

package com.springboot.redis.tinyurl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@SpringBootApplication
public class Runner {
    public static void main(String[] args) {
        SpringApplication.run(Runner.class, args);
        log.info("Springboot and tinyurl application started successfully.");
    }
}

4.3.2模型类

将以下代码添加到模型类。

UrlDto.java

package com.springboot.redis.tinyurl.model;
import com.google.common.hash.Hashing;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
@Getter
@AllArgsConstructor
public class UrlDto {
    private final String id;
    private final String url;
    private final LocalDateTime created;
    public static UrlDto create(final String url) {
        final String id = Hashing.murmur3_32().hashString(url, StandardCharsets.UTF_8).toString();
        return new UrlDto(id, url, LocalDateTime.now());
    }
}

4.3.3配置类

将以下代码添加到配置类。默认情况下,Spring Boot是自动配置的,可与字符串基础键/值对Redis模板一起使用。但是,在本教程中,我们将密钥存储为字符串,并将值存储为JSON对象。

RedisConfig.java

package com.springboot.redis.tinyurl.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.springboot.redis.tinyurl.model.UrlDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;
    // Setting up the Redis template object.
    @SuppressWarnings({"rawtypes", "unchecked"})
    @Bean
    public RedisTemplate<String, UrlDto> redisTemplate() {
        final Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(UrlDto.class);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        final RedisTemplate<String, UrlDto> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        return redisTemplate;
    }
}

4.3.4控制器类

将以下代码添加到控制器类,在该类中将使用这些方法创建较短的URL并获取原始URL,以换取较短的URL。

TinyUrlController.java

package com.springboot.redis.tinyurl.controller;
import com.springboot.redis.tinyurl.exception.TinyUrlError;
import com.springboot.redis.tinyurl.model.UrlDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.validator.routines.UrlValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
@RequestMapping(value = "/rest/url")
public class TinyUrlController {
    @Autowired
    private RedisTemplate<String, UrlDto> redisTemplate;
    @Value("${redis.ttl}")
    private long ttl;
    @PostMapping
    public ResponseEntity create(@RequestBody final String url) {
        // Using commons-validator library to validate the input URL.
        final UrlValidator urlValidator = new UrlValidator(new String[]{"http", "https"});
        if (!urlValidator.isValid(url)) {
            // Invalid url return HTTP 400 bad request.
            return ResponseEntity.badRequest().body(new TinyUrlError("Invalid URL."));
        }
        // If valid URL, generate a hash key using guava's murmur3 hashing algorithm.
        final UrlDto urlDto = UrlDto.create(url);
        log.info("URL id generated = {}", urlDto.getId());
        // Store both hasing key and url object in redis.
        redisTemplate.opsForValue().set(urlDto.getId(), urlDto, ttl, TimeUnit.SECONDS);
        // Return the generated id as a response header.
        return ResponseEntity.noContent().header("id", urlDto.getId()).build();
    }
    @GetMapping(value = "/{id}")
    public ResponseEntity getUrl(@PathVariable final String id) {
        // Get from redis.
        final UrlDto urlDto = redisTemplate.opsForValue().get(id);
        if (Objects.isNull(urlDto)) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new TinyUrlError("No such key exists."));
        } else {
            log.info("URL retrieved = {}", urlDto.getUrl());
        }
        return ResponseEntity.ok(urlDto);
    }
}

5.运行应用程序

6.项目演示

打开Postman工具,然后单击以下URL。

// Create short url
http://localhost:10095/rest/url
// Get original url from url id
http://localhost:10095/rest/url/{{urlId}}

7.总结

在本节中,我们了解到:

  • Spring Boot,Redis和Docker简介
  • 将Redis与Spring Boot应用程序集成以构建URL缩短程序API
  • 使用Postman工具创建短网址并获取原始网址
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
63 4
|
3月前
|
Java API 数据库
如何使用Spring Boot构建RESTful API,以在线图书管理系统为例
【10月更文挑战第9天】本文介绍了如何使用Spring Boot构建RESTful API,以在线图书管理系统为例,从项目搭建、实体类定义、数据访问层创建、业务逻辑处理到RESTful API的实现,详细展示了每个步骤。通过Spring Boot的简洁配置和强大功能,开发者可以高效地开发出功能完备、易于维护的Web应用。
88 3
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
131 62
|
16天前
|
存储 安全 Java
Spring Boot 编写 API 的 10条最佳实践
本文总结了 10 个编写 Spring Boot API 的最佳实践,包括 RESTful API 设计原则、注解使用、依赖注入、异常处理、数据传输对象(DTO)建模、安全措施、版本控制、文档生成、测试策略以及监控和日志记录。每个实践都配有详细的编码示例和解释,帮助开发者像专业人士一样构建高质量的 API。
|
16天前
|
存储 Java API
在springboot中缩短一个url链接
URL缩短服务是现代应用中常见的需求,用于将长URL映射为简短的唯一代码,便于分享。该服务具备多种功能,如自动过期、访问统计、防止重复及安全机制。通过Spring Boot构建RESTful API,使用H2数据库存储数据,Java UUID生成短码,并通过定时任务清理过期URL。用户可通过API提交长URL获取短链接,查询访问量,系统会自动重定向并记录访问次数。每天午夜自动清理过期URL,确保数据整洁。此项目结构清晰,涵盖实体类、Repository、Service和Controller等核心组件,适合快速开发和扩展。
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
128 5
|
2月前
|
安全 JavaScript Java
SpringBoot解决跨域最佳实践
本文介绍了跨域问题的起因及最佳实践,重点讲解了SpringBoot中如何利用`CorsFilter`解决跨域问题。首先解释了由于浏览器的同源策略限制导致的跨域现象,然后提出了在服务端入口处解决跨域问题的建议,最后详细展示了三种SpringBoot中配置跨域的方法:使用默认配置、自定义配置规则以及通过配置文件管理跨域设置,以适应不同的应用场景。
|
2月前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
57 1
|
2月前
|
Java
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
49 2
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
124 2