ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:308.62KB ,
资源ID:17651058      下载积分:6 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17651058.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(谈一谈CloudBlog的系统架构.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

谈一谈CloudBlog的系统架构.docx

1、谈一谈CloudBlog的系统架构谈一谈CloudBlog的系统架构系统整体架构采用分布式的系统,也是当今很多企业都在用的,基于restful风格的一套系统。从父工程开始blog-parent.这是一个pom工程,主要用来放置pom.xml文件的,这个包含了整个项目所有依赖的jar包。然后是blog-common,这个存放项目中使用到的一些工具类,也是一个pom工程。然后是blog-manager工程,这个主要是后台,包括用户操作以及管理员操作,这个项目还有一个积分商城的功能,所以商城的后台我也是放到这个manager工程里面的。这个manager是一个pom工程,然后下面的mapper和po

2、jo以及service和web都是一个maven module.然后除了blog-manager-web是一个war之外,剩下的三个都是jar工程。 然后前台是blog-portal,还有就是rest、search、sso、order。rest其实是给积分商城用的。search使用的是一个solr集群。因为服务器性能原因,所以我搭建的是三台tomcat的solr集群,依托zookeeper来进行管理。sso就是单点登录系统,主要给整个系统提供登录服务的。order系统主要是给积分商城提供订单服务的。下面来说详细内容: 一、系统后台: 后台是一个easyui的界面,非常简约,写文章的富文本编辑器

3、我采用的是kindeditor。这个编辑器性能还是不错的,其实使用XX的ueditor富文本编辑器效果也不错,只是因为我的springmvc拦截配置的config一直不成功,于是我就换了其他的编辑器。数据提交采用的post提交。javascript view plain copy print?在CODE上查看代码片派生到我的代码片if(title=null | title=) alert(请输入标题!); else if(typeId=null | typeId=) alert(请选择博客类别!); else if(blogTypeId=null | blogTypeId=) alert(请选

4、择博客类别!); else if(content=null | content=) alert(请输入内容!); else $.post(/mg/user/blog/save,username:username,title:title,typeid:typeId,blogtypeid:blogTypeId,content:content,summary:summary,contentNoTag:contentNoTag,keyword:keyWord,function(result) if(result.success) alert(博客发布成功!); resetValue(); else a

5、lert(博客发布失败!); ,json); 编辑器有一个sync的方法;来将textarea进行同步。javascript view plain copy print?在CODE上查看代码片派生到我的代码片var content=itemAddEditor.html(); itemAddEditor.sync(); 因为这里是加入了lucene全文检索功能,所以在添加或者修改文章的时候,都需要进行索引字段处理,因为富文本编辑器存到数据库中的内容都是带html标签格式的,但是我检索肯定是不需要这些标签的,所以使用下面的方法,来把这个html标签去掉,放到contentNoTag字段,用于检索。

6、而content就是带html标签的需要存放在数据库的内容。javascript view plain copy print?在CODE上查看代码片派生到我的代码片var dd=content.replace(/g,); var contentNoTag=dd.replace(/(s*)|(s*$)/g,);/dds为得到后的内容 然后就是一个列表的查询。因为这是一个多用户的系统,所以每个用户查看的都是自己的博客信息,所以在查询的时候需要加上用户名。对于添加博客的时候需要的一个lucene操作。java view plain copy print?在CODE上查看代码片派生到我的代码片/*/*

7、 * 获取IndexWriter实例 * return * throws Exception */* */ private IndexWriter getWriter()throws Exception dir=FSDirectory.open(Paths.get(/home/tf/work/data/lucene1/); /dir=FSDirectory.open(Paths.get(c:lucene); SmartChineseAnalyzer analyzer=new SmartChineseAnalyzer(); IndexWriterConfig iwc=new IndexWrite

8、rConfig(analyzer); IndexWriter writer = null; try writer = new IndexWriter(dir, iwc); catch (Exception e) writer.rollback(); e.printStackTrace(); return writer; /* */* * 添加博客索引 * param blog */* */ public void addIndex(UBlog blog)throws Exception IndexWriter writer=getWriter(); Document doc=new Docum

9、ent(); doc.add(new StringField(id,String.valueOf(blog.getBlogid(),Field.Store.YES); doc.add(new StringField(username,String.valueOf(blog.getUsername(),Field.Store.YES); doc.add(new TextField(title,blog.getTitle(),Field.Store.YES); doc.add(new StringField(releaseDate,DateUtil.formatDate(new Date(), y

10、yyy-MM-dd),Field.Store.YES); doc.add(new TextField(content,blog.getContentNoTag(),Field.Store.YES); writer.addDocument(doc); writer.close(); 而管理员就可以查看所有用户的文章,以及可以进行冻结解冻操作。后台管理员这里还有一个积分商城,主要是用户发表博客之后又积分,积分可以兑换K币,然后K币可以兑换这个积分商城中的东西。这个商品添加之后,是不能直接在前台进行查询的,因为我对于这个商品时启用了solr搜索服务的,在我的blog-search工程中做了一个定时任

11、务,在每天凌晨两点进行数据导入操作,系统导入完成之后,就可以在前台查看到添加的这些商品了。java view plain copy print?在CODE上查看代码片派生到我的代码片/* * 导入商品数据库到索引库 */ Scheduled(cron = 0 0 2 * * ?) /每天凌晨两点执行 RequestMapping(/import) public void importAllItems() System.out.println(开始执行); itemService.importAllItems(); System.out.println(执行结束); 关于整个后台来说,界面非常简

12、约,需要的功能还是基本上齐全的。因为是分布式系统的,所以我上线的时候都是分开上线的,在上线后台之后,这个规格参数和商品列表查询一个不能及时刷新$(#itemList).datagrid(reload);我开始以为是数据量太大导致刷新慢,后来发现并不是。例如我操作了删除,其实数据库中的数据已经删除了,但是这个datagrid却没有反应,查看状态码返回的是304.然后我想到了我后台是启动了CDN缓存加速的,所以我就又跑去看CDN的配置,然后就发现问题了,于是我把列表查询的/mg/item目录的刷新时间设置为0,这样就可以及时刷新,不再是一直在缓存。这样这个问题就解决了。通过这个事情我知道,在本地的

13、localhost操作和上线真的是不同的。在上线过程还遇到了很多在本地操作没有发生的事情,在本地都没有什么问题,一到云服务器上部署,马上问题就来了。哎!真是个磨人的小妖精。二、前台前台的话基本上也就这样了,因为审美水平问题,只能做到这个样子了,毕竟没有美工,毕竟我是做系统架构和数据处理数据分析的,哎,看来还是有不足之处啊。我都加入到了Redis缓存中,所以访问速度理论上还是提升了的。前台页面在CDN缓存设置的是一分钟,所以后台增删改什么的理论上是要过一分钟之后,前台才会更新的。关于前台的lucene搜索就是:java view plain copy print?在CODE上查看代码片派生到我的

14、代码片/*/* * 查询博客信息 * param q 查询关键字 * return * throws Exception */* */ public List searchBlog(String q)throws Exception dir=FSDirectory.open(Paths.get(/home/tf/work/data/lucene1/); IndexReader reader = DirectoryReader.open(dir); IndexSearcher is=new IndexSearcher(eader); BooleanQuery.Builder booleanQue

15、ry = new BooleanQuery.Builder(); SmartChineseAnalyzer analyzer=new SmartChineseAnalyzer(); QueryParser parser=new QueryParser(title,analyzer); Query query=parser.parse(q); QueryParser parser2=new QueryParser(content,analyzer); Query query2=parser2.parse(q); booleanQuery.add(query,BooleanClause.Occur

16、.SHOULD); booleanQuery.add(query2,BooleanClause.Occur.SHOULD); TopDocs hits=is.search(booleanQuery.build(), 100); QueryScorer scorer=new QueryScorer(query); Fragmenter fragmenter = new SimpleSpanFragmenter(scorer); SimpleHTMLFormatter simpleHTMLFormatter=new SimpleHTMLFormatter(,); Highlighter highl

17、ighter=new Highlighter(simpleHTMLFormatter, scorer); highlighter.setTextFragmenter(fragmenter); List blogList=new LinkedList(); for(ScoreDoc scoreDoc:hits.scoreDocs) Document doc=oc(scoreDoc.doc); UBlog blog=new UBlog(); blog.setBlogid(doc.get(id); blog.setUsername(doc.get(username); blog.setRelease

18、DateStr(doc.get(releaseDate); String title=doc.get(title); String content=StringEscapeUtils.escapeHtml(doc.get(content); if(title!=null) TokenStream tokenStream = analyzer.tokenStream(title, new StringReader(title); String hTitle=highlighter.getBestFragment(tokenStream, title); if(StringUtil.isEmpty

19、(hTitle) blog.setTitle(title); else blog.setTitle(hTitle); if(content!=null) TokenStream tokenStream = analyzer.tokenStream(content, new StringReader(content); String hContent=highlighter.getBestFragment(tokenStream, content); if(StringUtil.isEmpty(hContent) if(content.length()=200) blog.setContent(

20、content); else blog.setContent(content.substring(0, 200); else blog.setContent(hContent); blogList.add(blog); return blogList; 效果还是不错的,大家可以去试一下,文末提供访问网址。说到这个文章啊,遇到最头疼的问题就是编码问题了,因为页面展示是一种,然后我mysql数据库的编码,还有redis中存放的文章的编码。添加缓存的时候又各种进行转换。都快转晕了,哈哈,当然最终还是解决了,挺开心的。java view plain copy print?在CODE上查看代码片派生到我

21、的代码片blog.setContent(new String(blog.getContent().getBytes(iso-8859-1), utf-8); 商品搜索这边就是调用者blog-search的服务就可以了。关于这个地方的细节我就不再重复说了,今天只谈架构。三、Nginx因为这个系统前后十二个工程,其中mg做为后台,portal做的前台,以及前面说到的各种。所以我需要一个nginx来处理,主要就是配置端口与域名的映射。在nginx中进行配置即可。当然,也是可以直接使用tomcat热部署直接传到服务器中的tomcat中。当然如果用的是其他中间件服务器的话配置也是类似的。就是域名端口号说

22、明的。(为了我服务器的安全,下面配置的端口号我修改了与我真实上线不同的端口号了),你也可以按自己的实际情况配置。总之还是非常实用和简单的。html view plain copy print?在CODE上查看代码片派生到我的代码片upstream server 139.199.158.214:9100; upstream server 139.199.158.214:9101; upstream server 139.199.158.214:9101; upstream server 139.199.158.214:9103; html view plain copy print?在CODE上

23、查看代码片派生到我的代码片server listen 80; server_name ; location / proxy_pass ; index index.html index.htm; server listen 80; server_name ; location / proxy_pass ; index index.html index.htm; server listen 80; server_name ; location / proxy_pass ; index index.html index.htm; server listen 80; server_name ; loc

24、ation / proxy_pass ; index index.html index.htm; 四、开发中遇到的问题我遇到最烦人的问题就是这个图片上传的问题,我本来是使用的FTP进行图片上传的。然后这个磨人的小妖精在本地上传的时候没有任何问题,我一部署到服务器,完了,完全post不上去了,折腾的够呛,一直是什么network什么什么的错误,简直气炸!我后来慢慢的排查问题,从文件大小限制,nginx配置,cdn缓存配置,服务器权限,还从朋友那里在接了一台tomcat来测试,发现依然是这个问题。折腾了一天。然后我就放弃治疗。Uncaught SecurityError: Failed to re

25、ad the contentDocument property from HTMLIFrameElement: Blocked a frame with origin from accessing a frame with origin null. The frame requesting access has a protocol of http, the frame being accessed has a protocol of data. Protocols must match.当然,最后我换了一种方案,本来这个图片是全部要存放到我的ftp图片服务器中的。既然解决不了怎么办呢,这个图片上传的功能是必须要的啊,于是乎,我突然发现了COS对象存储服务。简直发现宝有木有。开始看文档感觉挺复杂的,后来自己折腾了一下,将这个cos的官方代码于我的ftp工具类的代码进行了整合,哎呦喂,居然成功了,1个小时就搞定了。在这一篇博客中介绍如何使用腾讯云的COS对象存储服务。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2