1. 项目架构
zookper + dubbo+springboot
-
API提供接口
-
service属于生产者,业务逻辑实现
-
web属于消费者
2. 开发核心jar
- redis和solr启动客户端的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
3. 将solr 组件托管到IOC
- 在生产者中托管SolrConfig.java
package com.itany.conf;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SolrConfig {
@Bean(name = "solrClient")
public HttpSolrClient solrClient(){
return new HttpSolrClient.Builder("http://localhost:8080/solr/t_user")//服务访问地址+redis库名字
.withConnectionTimeout(10000)//设置与服务端的连接超时时间
.withSocketTimeout(10000) //设置连接操作时间的超时时间
.build();
}
}
4. solr添加方法和查询所有数据方法实现类
- 在生产者中新建实现类BookServiceImpl实现API中的接口
package com.itany.book.service.impl;
import com.itany.book.service.IBookService;
import com.itany.pojo.User;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by tyh on 2018/9/23.
*/
@Service
@com.alibaba.dubbo.config.annotation.Service
public class BookServiceImpl implements IBookService{
@Autowired
private HttpSolrClient httpSolrClient;//通过该对象和solr服务交互
/**
* 添加方法
* 通过循环来向solr中t_user库添加一组数据
*/
@Override
public void addDoc() {
//此处查询mysql并且书籍数据插入solr作为初始化数据
try {
for(int i=0;i<10;i++){
//CIUD操作操作SolrInputDocument对象
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id",i);
doc.addField("username","用户"+i);
httpSolrClient.add(doc);
}
httpSolrClient.commit();
/*httpSolrClient.deleteByQuery("*:*");*/
}catch (Exception e){
try {
httpSolrClient.rollback();
}catch (Exception e1){
}
}
}
@Override
public List<Map<String, String>> findDoc() {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
try {
String q = "username:用户";
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(q);
//分页查询
/* solrQuery.setStart((pageNo-1)*pageSize);
solrQuery.setRows(pageSize);*/
solrQuery.setHighlight(true);
//设置高亮头
solrQuery.setHighlightSimplePre("<font color='red'>");
//设置高亮尾部
solrQuery.setHighlightSimplePost("</font>");
//设置查询的高亮数据
solrQuery.setParam("hl.fl","username");
//http请求返回的数据是用QueryResponse接受
QueryResponse response = httpSolrClient.query(solrQuery);
//类似数据库的结果集,但是这个redis中数据类型
SolrDocumentList result = response.getResults();
//获取总数据条数
System.out.println(result.getNumFound());
for(int i=0;i<result.size();i++){
Map<String, String> vo = new HashMap<String, String>();
SolrDocument doc = result.get(i);//这个数据是没有高亮的
String id = (String)doc.get("id");
//list取出的值是没有高亮的需要,二次获取设置高亮
Map<String,List<String>> map = response.getHighlighting().get(id);
List<String> userList = map.get("username");
if(userList!=null){
vo.put("username",userList.get(0));
}else{
//如果为空放入原始的值
vo.put("username",(String)doc.get("username"));
}
list.add(vo);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
@Override
public void deleteDoc() {
try {
//根据查询删除数据
httpSolrClient.deleteByQuery("*:*");
httpSolrClient.commit();
}catch (Exception e){
try {
httpSolrClient.rollback();
}catch (Exception e1){
}
}
}
}
- 在response中的高亮数据储存的位置,所以list中没有高亮的,需要二次重写
5. 消费者中配置contoller
package com.itany.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.itany.book.service.IBookService;
import com.itany.vo.ActionResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* Created by tyh on 2018/9/23.
*/
@RestController
@RequestMapping("/testbook")
public class TestBookController {
//远程注入
@Reference
private IBookService bookService;
@RequestMapping("/addDoc")
public ActionResult addDoc(){
ActionResult ac = new ActionResult();
bookService.addDoc();
ac.setStatus(0);
return ac;
}
@RequestMapping("/findDoc")
public List<Map<String,String>> findDoc(){
return bookService.findDoc();
}
}
- 访问界面
- 在solr中t_user库中数据