SpringBoot笔记
引入spring-boot-starter-cache依赖
@EnableCaching
在SpringBoot启动器上添加注解,开启缓存。
@Cacheable
在方法上添加此注解,若不指定key则以传入参数生成key,缓存该方法的返回参数。
@CacheEvict
在方法上添加此注解,若不指定key则以传入参数生成key,删除该缓存。
@CachePut
在方法上添加此注解,若不指定key则以传入参数生成key,调用该方法后更新缓存。
引入spring-boot-starter-data-redis依赖,SpringBoot会自动切换
application.properties中添加redis主机地址:spring.redis.host=192.168.37.135
@Autowired
StringRedisTemplate stringRedisTemplate;//键值对都为String的操作器
@Autowired
RedisTemplate redisTemplate;//键值对都为对象的操作器,对象需继承序列号接口
自定义RedisTemplate可实现不同的序列化方式,默认为jdk序列化方式。
添加自定义缓存管理器(需定义泛型),在service里添加@CacheConfig(cacheManager="")注解指定缓存管理器。
@Async
此注解标注在方法或类型上,可开启异步处理。
@EnableScheduling
在SpringBoot启动器上添加注解,开启定时任务。
@Scheduled
可以在方法和注解类型上添加注解,设置任务的定时规则。
引入spring-boot-starter-mail
配置application.properties
注入邮件发送bean
发送简单邮件
发送带附件的邮件
引入jar包
spring-boot-starter-security
创建一个配置类,继承WebSecurityConfigurerAdapter,需要注解@EnableWebSecurity开启,重写configure(HttpSecurity http)和configure(AuthenticationManagerBuilder auth)
引入依赖
判断是否已认证div sec:authorize="isAuthenticated()"
获取姓名span sec:authentication="name"/span,
获取角色span sec:authentication="principal.authorities"/span/h2
根据角色判断是否展示div sec:authorize="hasRole('VIP1')"
参考链接:
docker中运行RabbitMQ服务
在网页管理端可进行交换器的创建与消息队列的创建与绑定。
交换器路由键,不同的队列
@EnableRabbit
在SpringBoot启动器上添加注解,开启基于注解的RabbitMQ模式。
docker中安装运行Elasticsearch服务,限制内存大小256MB(默认为2G)。
地址:
查询文档
添加文档
{
请求体
}
删除文档
检查文档是否存在
搜索文档
地址:
{
请求体
}
导入jest的jar包。
配置地址
spring.elasticsearch.jest.uris=
配置地址
创建实体类存储器接口继承ElasticsearchRepositoryT,ID
添加文档
GET /index/type/_search?q=字段:搜索值
QueryBuilder的使用:
Dubbo是分布式服务框架,主要解决各服务调用的问题(即RPC)。
Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
引入dubbo的jar包
引入zookeeper客户端的jar包
在application.properties里添加
在实现类里添加
在application.properties里添加
需实现接口类
添加application.yml
@EnableEurekaServer
在SpringBoot启动器上添加注解,开启注册中心功能。
添加application.yml
添加application.yml
@EnableDiscoveryClient
在SpringBoot启动器上添加注解,开启发现服务功能。
引入依赖
引入spring-boot-starter-actuator依赖
Spring Boot整合ElasticSearch实现增删改查基本示例
ElasticSearch被命名为大数据搜索引擎,在文件检索、数据存储方面具有天然的优势。而SpringBoot作为服务整合中间件,在服务组装方面是一款万能粘合器,本文主要提供Spring Boot整合ElasticSearch基本增删改示例。
ElasticSearch安装过程可参考博主之前笔文:
ElasticSearch基本介绍可参考博主之前笔文:
Maven工程引入:
org.springframework.boot
spring-boot-starter-data-elasticsearch
注意:ElasticSearch版本号与Spring Boot版本号是有关联的,本文笔者Spring Boot版本号是2.1.6,因此安装的ElasticSearch版本号是7.7.0。
package com.opendi.generator.elasticsearch.model;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.List;
@Data
@Document(indexName="post", type="post",shards=1,replicas = 0)
public class Post {
@Id
private String id;
private String title;
@Field(type=FieldType.Nested)
private List tags;
}
package com.opendi.generator.model;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Data
@Document(indexName = "book", type = "_doc", shards = 1, replicas = 0)
public class BookBean {
@Id
private String id;
@Field(type = FieldType.Keyword)
private String title;
@Field(type = FieldType.Keyword)
private String author;
@Field(type = FieldType.Keyword)
private String postDate;
public BookBean(){}
public BookBean(String id, String title, String author, String postDate){
this.id=id;
this.title=title;
this.author=author;
this.postDate=postDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPostDate() {
return postDate;
}
public void setPostDate(String postDate) {
this.postDate = postDate;
}
@Override
public String toString() {
return "BookBean{" +
"id='" + id + ''' +
", title='" + title + ''' +
", author='" + author + ''' +
", postDate='" + postDate + ''' +
'}';
}
}
package com.opendi.generator.elasticsearch.mapper;
import com.opendi.generator.elasticsearch.model.Post;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface PostRepository extends ElasticsearchRepository {
Page findByTitle(String title, Pageable pageable);
}
package com.opendi.generator.dao;
import com.opendi.generator.model.BookBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
* 接口关系:
* ElasticsearchRepository -- ElasticsearchCrudRepository -- PagingAndSortingRepository -- CrudRepository
*/
public interface BookRepository extends ElasticsearchRepository {
//Optional findById(String id);
Page findByAuthor(String author, Pageable pageable);
Page findByTitle(String title, Pageable pageable);
}
使用了ElasticSearch里面的操作工具对数据进行操作。
package com.opendi.generator.elasticsearch.service;
import com.opendi.generator.elasticsearch.model.Post;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import java.util.Optional;
public interface PostService {
Post save(Post post);
Optional findOne(String id);
Iterable findAll();
Page findByTitle(String title, PageRequest pageRequest);
}
指定操作对象:
package com.opendi.generator.elasticsearch.service.impl;
import com.opendi.generator.elasticsearch.mapper.PostRepository;
import com.opendi.generator.elasticsearch.model.Post;
import com.opendi.generator.elasticsearch.service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class PostServiceImpl implements PostService {
@Autowired
private PostRepository postRepository;
@Override
public Post save(Post post) {
postRepository.save(post);
return post;
}
@Override
public Optional findOne(String id) {
return postRepository.findById(id);
}
@Override
public Iterable findAll() {
return postRepository.findAll();
}
@Override
public Page findByTitle(String title, PageRequest pageRequest) {
return postRepository.findByTitle(title, pageRequest);
}
}
package com.opendi.generator.service;
import com.opendi.generator.model.BookBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import java.util.List;
import java.util.Optional;
public interface BookService {
Optional findById(String id);
BookBean save(BookBean blog);
void delete(BookBean blog);
Optional findOne(String id);
List findAll();
Page findByAuthor(String author, PageRequest pageRequest);
Page findByTitle(String title, PageRequest pageRequest);
}
package com.opendi.generator.service.impl;
import com.opendi.generator.dao.BookRepository;
import com.opendi.generator.model.BookBean;
import com.opendi.generator.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service("blogService")
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookRepository")
private BookRepository bookRepository;
@Override
public Optional findById(String id) {
//CrudRepository中的方法
return bookRepository.findById(id);
}
@Override
public BookBean save(BookBean blog) {
return bookRepository.save(blog);
}
@Override
public void delete(BookBean blog) {
bookRepository.delete(blog);
}
@Override
public Optional findOne(String id) {
return bookRepository.findById(id);
}
@Override
public List findAll() {
return (List ) bookRepository.findAll();
}
@Override
public Page findByAuthor(String author, PageRequest pageRequest) {
return bookRepository.findByAuthor(author,pageRequest);
}
@Override
public Page findByTitle(String title, PageRequest pageRequest) {
return bookRepository.findByTitle(title,pageRequest);
}
}
会调用ElasticSearch底层功能进行操作,能够实现ElasticSearch增删改操作。
连接服务器ElasticSearch连接配置:
spring:
data:
elasticsearch:
cluster-name: es2018
cluster-nodes: 10.172.8.154:9300
repositories:
enabled: true
elasticsearch:
jest:
uris: http:// 10.172.8.154:9200
增加连接配置,这样就能连接ElasticSearch客户端了。
ElasticSearch在Controller操作:
package com.opendi.generator.controller;
import com.opendi.generator.model.BookBean;
import com.opendi.generator.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@RestController
public class ElasticController {
@Autowired
private BookService bookService;
@RequestMapping("/book/{id}")
@ResponseBody
public BookBean getBookById(@PathVariable String id){
Optional opt =bookService.findById(id);
BookBean book=opt.get();
System.out.println(book);
return book;
}
@RequestMapping("/save")
@ResponseBody
public void Save(){
System.setProperty("es.set.netty.runtime.available.processors", "false");
BookBean book=new BookBean("1","ES入门教程","程裕强","2018-10-01");
System.out.println(book);
bookService.save(book);
}
}
package com.opendi.generator.elasticsearch.controller;
import com.opendi.generator.elasticsearch.model.Post;
import com.opendi.generator.elasticsearch.model.Tag;
import com.opendi.generator.elasticsearch.service.PostService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Api(tags="ElasticSearch示例")
@RestController
public class PostController {
@Autowired
private PostService postService;
@ApiOperation(value="得到ES结果")
@GetMapping(value="getList")
public Listpage getList()/page
{
Listpage list = new ArrayListpage ();/page /page
Tag tag = new Tag();
tag.setId("1");
tag.setName("tech");
Tag tag2 = new Tag();
tag2.setId("2");
tag2.setName("elasticSearch");
Post post = new Post();
post.setId("1");
post.setTitle("This is post");
post.setTags(Arrays.asList(tag,tag2));
postService.save(post);
Post post2 = new Post();
post2.setId("2");
post2.setTitle("Biding2");
post2.setTags(Arrays.asList(tag));
postService.save(post2);
Page posts = postService.findByTitle("This is post", new PageRequest(0, 10));
Page posts2 = postService.findByTitle("Biding2", new PageRequest(0,10));
Page posts3 = postService.findByTitle("Biding2", new PageRequest(0,10));
list.add(posts);
list.add(posts2);
list.add(posts3);
return list;
}
}
控制台打印:
springboot整合es出现elasticsearch health check failed
使用springboot整合elasticsearch实现搜索功能, 配置如下:
可以确认es的9300端口、9200端口正常启动,可连接
但启动项目是报出如下错误:Elasticsearch health check failed相关错误信息
方法1:添加spring.elasticsearch.rest.uris配置,具体配置如下:
方法2:配置文件中,配置关闭对elasticsearch的健康检查
比较推荐方法1,方法2放弃对ES健康检测,虽然能消除异常,但还是觉得有点不靠谱
SpringBoot 整合 Elasticsearch 实现海量级数据搜索
今天给大家讲讲 SpringBoot 框架 整合 Elasticsearch 实现海量级数据搜索。
在上篇ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用。
实际的项目开发过程中,我们通常基于某些主流框架平台进行技术开发,比如 SpringBoot,今天我们就以 SpringBoot 整合 ElasticSearch 为例,给大家详细的介绍 ElasticSearch 的使用!
SpringBoot 连接 ElasticSearch,主流的方式有以下四种方式
还有一个需要大家注意的地方,那就是版本号的兼容!
为什么要这样做呢?主要原因就是 es 的服务端,高版本不兼容低版本;es6 和 es7 的某些 API 请求参数结构有着很大的区别,所以客户端和服务端版本号尽量保持一致。
废话也不多说了,直接上代码!
本文采用的 SpringBoot 版本号是 2.1.0.RELEASE ,服务端 es 的版本号是 6.8.2 ,客户端采用的是官方推荐的 Elastic Java High Level Rest Client 版本号是 6.4.2 ,方便与 SpringBoot 的版本兼容。
在 application.properties 全局配置文件中,配置 elasticsearch 自定义环境变量
至此,客户端配置完毕,项目启动的时候,会自动注入到 Spring 的 ioc 容器里面。
es 中最重要的就是索引库,客户端如何创建呢?请看下文!
所谓文档,就是向索引里面添加数据,方便进行数据查询,详细操作内容,请看下文!
本文主要围绕 SpringBoot 整合 ElasticSearch 接受数据的插入和搜索使用技巧,在实际的使用过程中,版本号尤其的重要,不同版本的 es,对应的 api 是不一样的。
SpringBoot 01 简单的爬取磁力搜索
这里使用了路径参数, 当然也可以直接使用请求体参数
这样请求时URL换成
我不是药神page=1
省去 构造函数以及Getter、Setter方法
这里请求成功之后,将数据交给parseData()方法进行数据解析
当然这里很多都是jsoup的用法具体查看对应的文档就可以了
怎么查看一个springboot项目的源代码在哪?
要查看Spring Boot项目的源代码,可以按照以下步骤操作:
打开Spring Boot项目的源码管理系统,如Git、SVN等。通常可以在项目文档或者配置文件中找到源码管理系统的地址或者链接。
克隆或者下载源码管理系统中的代码到本地计算机。通常可以使用Git或SVN客户端,或者通过Web界面下载源码包。
打开源代码编辑器,如IntelliJ IDEA、Eclipse等。这些编辑器都支持导入现有的Maven或Gradle项目。
在编辑器中打开项目的根目录,并导航到src/main/java目录。这个目录中应该包含项目的Java源代码,通常按照包名组织。
如果想要查看项目的依赖关系和配置文件等其他文件,可以导航到src/main/resources目录。
请注意,如果您没有项目的源代码访问权限,或者该项目是通过二进制包分发的,则可能无法查看源代码。