Elasticsearch On Springboot

本文介绍了SpringBoot 2.5.0与Elasticsearch 7.12.0的整合方法,包括使用HTTP协议的REST客户端和Spring Data Elasticsearch。文中展示了配置示例、领域模型定义以及服务层的简单操作,如保存和查找数据。注意不同版本间的兼容性问题,并提供了完整的pom.xml配置。

序言

目前了解到java整合Elasticsearch有3中方式cuiyaonan2000@163.com

  1. 使用Elasticsearch提供的9300端口的TCP协议进行交互---将在es8.X被取消
  2. 使用Elasticsearch提供的9200端口的HTTP协议进行交互(其中又分为Java Low Level REST ClientJava Hight Level REST Client)
  3. 使用springboot封装的就JPA的形式进行交互.(这个是我们主要的整合方式,同理不支持事务)

另外就是pringboot整合elasticsearch需要注意版本,不同的版本可能有不同的问题:这个肯定是去Springboot的官网去找cuiyaonan2000@163.com

官方网址: Spring Data Elasticsearch - Reference Documentation

整合

这里使用的

  1. Elasticsearche:7.12.0
  2. springboot:2.5.0

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>demons</artifactId>
        <groupId>cui.yao.nan</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>elasticsearch</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <dubbo.version>2.7.3</dubbo.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>



    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

</project>

domain

package cui.yao.nan.elasticsearch.domain;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

@Data
@Document(indexName = "book")
public class Book {

    @Id
    private String id;

    @Field(name="name")
    private String name;

    @Field(name = "price")
    private Long price;

}

@Document

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {

    String indexName();//索引库的名称,个人建议以项目的名称命名

    @Deprecated
    String type() default "";//类型,7.x之后以废弃

    short shards() default 1;//默认分区数

    short replicas() default 1;//每个分区默认的备份数

    String refreshInterval() default "1s";//刷新间隔

    String indexStoreType() default "fs";//索引文件存储类型

    boolean createIndex() default true; //是否创建索引

    VersionType versionType() default VersionType.EXTERNAL; //版本
}

@Field

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {

    @AliasFor("name")
    String value() default ""; //属性别名

    @AliasFor("value")
    String name() default ""; //属性别名

    FieldType type() default FieldType.Auto; //属性类型,默认自动根据参数类型自动属性的类型

 	boolean index() default true; //默认情况下分词

    DateFormat format() default DateFormat.none; //时间格式化

    String pattern() default "";

    boolean store() default false; //默认情况下不存储原文

    String searchAnalyzer() default ""; //指定字段搜索时使用的分词器

    String indexAnalyzer() default "";//指定字段建立索引时指定的分词器

    String[] ignoreFields() default {};//忽略某些字段

    //以下是一些不常用的设置
    boolean includeInParent() default false;
    String[] copyTo() default {};
    int ignoreAbove() default -1;
    boolean coerce() default true;
    boolean docValues() default true;
    boolean ignoreMalformed() default false;
    IndexOptions indexOptions() default IndexOptions.none;
    boolean indexPhrases() default false;
    IndexPrefixes[] indexPrefixes() default {};
    boolean norms() default true;
    String nullValue() default "";
    int positionIncrementGap() default -1;
    Similarity similarity() default Similarity.Default;
    TermVector termVector() default TermVector.none;
    double scalingFactor() default 1;
    int maxShingleSize() default -1;
}

Service

package cui.yao.nan.elasticsearch.service;

import cui.yao.nan.elasticsearch.dao.ArticleRepository;
import cui.yao.nan.elasticsearch.dao.BookRepository;
import cui.yao.nan.elasticsearch.domain.Article;
import cui.yao.nan.elasticsearch.domain.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ArticleService {

    @Autowired
    private ArticleRepository articledao;

    @Autowired
    private BookRepository bookdao;

    public void add(){
        Article article = new Article();
        article.setDes("我是文章的没描述");
        article.setName("我是文章的名字");
        Book book = new Book();
        book.setPrice(12l);
        book.setName("我是书本的名字");
        articledao.save(article);
        bookdao.save(book);
    }

    public void search(){

        Iterable<Book> bookList = bookdao.findAll();

        Iterable<Article> articleList = articledao.findAll();

        System.out.println(bookList.toString()+" "+articleList.toString());

    }


}

Launch Class

package cui.yao.nan.elasticsearch;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyConfig {


    // 这里在war形式下就没什么用了
    public static void main(String[] args) {
    	SpringApplication.run(MyConfig.class, args);
    }
    

}

搜索结果

<think>嗯,用户想找关于基于SpringBoot的在线订购系统的设计与实现的资料。首先,我需要回忆一下SpringBoot的相关知识,以及如何构建一个在线订购系统。可能需要考虑系统架构、模块划分、技术选型等方面。 首先,系统设计通常分为前端和后端。后端使用SpringBoot,可能需要Spring MVC处理Web请求,Spring Data JPA或MyBatis作为ORM框架,Spring Security做安全控制。数据库方面,MySQL或PostgreSQL都是常见的选择。此外,可能需要集成支付接口,比如支付宝或微信支付,这里需要处理第三方API的调用和安全性。 然后,用户认证和授权是关键部分。Spring Security可以配置OAuth2或者JWT来实现安全的用户认证。订单管理模块需要考虑状态机,处理订单的创建、支付、发货、取消等状态转换。库存管理需要保证并发下的数据一致性,可能需要使用乐观锁或者分布式锁。 缓存方面,可以使用Redis来缓存热点数据,比如商品信息,减少数据库压力。消息队列如RabbitMQ或Kafka可以用于异步处理订单,比如发送确认邮件或短信,提高系统的响应速度和削峰填谷。 性能优化方面,数据库索引的设计很重要,特别是在查询订单和商品时。分库分表可能在大数据量下需要考虑,但初期可能用不到。前端可以用Vue.js或React来构建,通过REST API与后端交互。 可能还需要考虑微服务架构,将系统拆分成用户服务、商品服务、订单服务、支付服务等,每个服务独立部署,通过Spring Cloud进行服务治理,比如Eureka做服务发现,Feign做服务间调用,Hystrix处理熔断。 在实现过程中,单元测试和集成测试也很重要,使用JUnit和Mockito来保证代码质量。持续集成/持续部署(CI/CD)可以通过Jenkins或GitHub Actions自动化部署流程。 用户提供的引用中,引用[2]提到了开发工具如IntelliJ IDEA和Eclipse,这些确实适合SpringBoot开发。引用[3]提到了Hystrix和Ribbon,这在微服务中用于熔断和负载均衡,可能相关。引用[1]关于事务管理的书,可能在处理订单和支付时的事务管理有帮助,需要确保事务的ACID特性,比如使用@Transactional注解。 可能遇到的问题包括分布式事务的处理,比如订单服务和库存服务之间的数据一致性,可以考虑使用Saga模式或者消息队列最终一致性。安全性方面,防止SQL注入、XSS攻击,确保支付接口的安全通信。 用户可能需要具体的实现步骤或代码示例,比如如何配置Spring Security,如何集成支付API,如何设计数据库表结构。此外,部署环境的选择,比如使用Docker容器化,Kubernetes编排,云服务如AWS或阿里云。 总结来说,回答需要涵盖系统架构设计、技术选型、关键模块实现、安全与性能优化,以及相关工具和框架的使用,结合用户提供的引用内容,给出切实可行的方案。</think>### 基于SpringBoot的在线订购系统设计与实现 #### 1. **系统架构设计** - **分层架构**:通常采用MVC模式,分为控制层(Spring MVC)、服务层(业务逻辑)、数据访问层(Spring Data JPA/MyBatis)和数据库层(MySQL/PostgreSQL)[^2]。 - **模块划分**: - 用户管理:注册、登录、权限控制(Spring Security + JWT/OAuth2)。 - 商品管理:商品分类、库存管理、搜索功能(Elasticsearch可选)。 - 订单管理:购物车、订单生成、支付接口集成(支付宝/微信支付)。 - 支付模块:异步通知、事务管理(@Transactional注解)[^1]。 #### 2. **关键技术实现** - **RESTful API设计**: ```java @RestController @RequestMapping("/api/orders") public class OrderController { @Autowired private OrderService orderService; @PostMapping public ResponseEntity<Order> createOrder(@RequestBody OrderRequest request) { return ResponseEntity.ok(orderService.create(request)); } } ``` - **数据库设计**: - 商品表:`id`, `name`, `price`, `stock` - 订单表:`order_id`, `user_id`, `total_amount`, `status` - 使用索引优化查询(如`user_id`和`status`联合索引)。 - **事务管理**: ```java @Service public class PaymentService { @Transactional public void processPayment(Order order) { // 扣减库存 productRepository.decreaseStock(order.getProductId()); // 更新订单状态 orderRepository.updateStatus(order.getId(), "PAID"); } } ``` 引用事务管理策略可参考[^1]。 #### 3. **安全与性能优化** - **安全措施**: - 使用HTTPS加密通信。 - 防止SQL注入(MyBatis参数化查询)。 - 支付接口验签(如MD5/RSA签名校验)。 - **性能优化**: - 缓存热点商品数据(Redis)。 - 异步处理订单通知(RabbitMQ/Kafka)[^3]。 - 分库分表(ShardingSphere)。 #### 4. **部署与扩展** - **容器化部署**:通过Docker打包应用,Kubernetes管理集群。 - **监控**:集成Prometheus + Grafana监控系统资源与接口性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cuiyaonan2000

给包烟抽吧

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

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

打赏作者

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

抵扣说明:

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

余额充值