#徐员外#Solr服务器集群及ActiveMQ应用实战
Posted xuyuanwai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#徐员外#Solr服务器集群及ActiveMQ应用实战相关的知识,希望对你有一定的参考价值。
做技术这十几年以来,从最初参与的ERP代码修改、OA系统到物联网及大型互联网项目的开发,从项目中获得了一些宝贵的经验和教训。自身也不断的学习总结,现在回过头来看,走了很多弯路,有些事情根本不应该发生,但是问题一般出现在这几个地方。
大部分的公司,出于成本和管理等各方面的考虑,项目团队趋于年轻化,一是想节省一点开支,二是经验少的人听话,好管理有活力,加班的话身体上都吃的消。但是一旦进入项目中,弊端就慢慢的累积起来了。之前我作为一个互联网平台研发的负责人,带着20多位小兄弟,那真心累啊。小兄弟经验不够,你跟他指个方向,只要没搞过的技术,比如解决系统间通信的问题,SSO单点登录的问题,权限问题,基本上是原地踏步,不会搞还不好意思说,现学吧,有经验的程序员花一周,他们要花2个月。搞不出来的时候各种问题都出来了,有时候自己想冲上去帮他把问题解决了,但是一个人面对几十个人的时候,光与开发、产品、测试、需求、运营等各岗位沟通,解决问题当裁判,怕漏掉任何事项就够你受的了。往往这个时候还出现一个不断冒出新想法,不跟你谈技术的老板,简直就是神补刀。我不知道有多少优秀的研发人员和高手在这种状态被废掉了,我可以很负责任的讲,现在企业里面所谓的CTO,只要涉及到管理项目和人,不知道有几个人还有快速写代码,钻研新技术的能力。技术人员遇到这种团队要赶紧离开,以免自废武功。
技术的问题,确实不是靠人数能解决的,需要思路、经验及静下心来研究实验的环境,之前平台我一直想按功能职责拆分成面向服务的分布式架构,这样耦合性会比较低,也便于应用及其他项目的调用和扩展,但是老板想让系统集中在一起,私下把任务安排给了小兄弟,小兄弟没搞过,遇到问题跑去跟老板沟通,最后两年下来硬是没搞成。这段时间我跟一个同样十几年经验的兄弟在家开发一个可插拔的基础研发平台,集中精力在没有任何干扰的情况下,也就不到半个月的时间,我一个人搭建了应用层nginx+zookper的分布式,面向服务Doubbo+zookper的分布式,redis缓存的应用,solr+MQ的分布式搜索,今天在家数了一下,光虚拟出来的服务器就有20多台了,这在以前估计得几十人搞几个月了。现在我自己创业,要做一家纯技术型的公司,这样的公司,我认为五个技术能力不错的人足够了。
今天在平台中搭建了solr的集群及ActiveMQ的应用,相对来讲还是比较简单的,这里简单的记录一下思路步骤及注意事项。
有关solr的集群
思路是这样的,用户通过浏览器搜索框搜索,首先访问到的是zookeeper(多台)集群中心,由zookeeper分配到不同的应用服务器(如tomcat),solr服务被部署并运到不同的应用服务器上。
下面是一个比较微型的服务器配置4台tomcat 对应4台solr配置,由三个zookeeper服务器管理。
在solrhome下的每一个solr.xml文件中需制定IP和端口号
在zookper conf目录下zoo.cfg文件需做如下配置
在tomcat应用集群中每台服务器的web.xml需要做如下配置
最后跑起来通过浏览器测试solr的集群情况,妥妥地
页面访问网站搜索结果
走
ActiviMQ
解决了不同系统服务间的通信问题。
搭建及使用比较简单,先安装ActiviMQ,解压到Linux服务器即可
进入并目录启动./activemqstart
通过浏览器访问,看环境是否配好,可以切换Queues和topics查看两种消息
编写测试代码
packagecom.tengzhuo.activemq;
/**
* MQ消息通信的两种方式
* <p>Title: ActiveMqTest.java</p>
* <p>Description: </p>
* <p>Company: www.tengzhuo.com</p>
* <p>author:joeho 2018年4月26日</p>
* <p>version:1.0</p>
*/
publicclass ActiveMqTest {
@Test
public void testQueueProducer() throwsException{
// 创建一个连接工厂对象,需要指定服务的ip及端口
StringbrokerURL="tcp://192.168.1.106:61616";
ConnectionFactory connectionFactory =new ActiveMQConnectionFactory(brokerURL);
// 使用工厂对象创建一个Connection对象
Connection connection =connectionFactory.createConnection();
// 开启连接,调用Connection对象的start方法
connection.start();
// 创建一个 Session对象,第一个参数,是否开启事务,如果为true则第二个参数无效
// 第二个参数是应答模式
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 使用 session对象创建一个Destination对象,两种形式的queue,topic
Queue queue =session.createQueue("test-queue");
// 使用session对象创建一个Producer对象
MessageProducer producer =session.createProducer(queue);
// 创建 一个Message对象 ,可以使用 TestMessage
// TextMessage message = new ActiveMQTextMessage();
// message.setText("hello ActiveMQ");
TextMessage message =session.createTextMessage("hello ActiveMQ");
// 发送消息
producer.send(message);
// 关闭资源
producer.close();
session.close();
connection.close();
}
@Test
public void testQueueConsumer() throwsException{
// 创建一个连接工厂对象,需要指定服务的ip及端口
StringbrokerURL="tcp://192.168.1.106:61616";
ConnectionFactoryconnectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 使用工厂对象创建一个Connection对象
Connection connection =connectionFactory.createConnection();
// 开启连接,调用Connection对象的start方法
connection.start();
// 创建一个 Session对象,第一个参数,是否开启事务,如果为true则第二个参数无效
// 第二个参数是应答模式
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 使用 session对象创建一个Destination对象,两种形式的queue,topic
Queuequeue = session.createQueue("test-queue");
// 使用session对象创建一个consumer对象
MessageConsumer consumer =session.createConsumer(queue);
// 接收消息
consumer.setMessageListener(newMessageListener() {
@Override
public voidonMessage(Message message) {
// 打印结果
TextMessagetextMessage = (TextMessage) message;
try {
System.out.println(textMessage.getText());
} catch(JMSException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//等待消息
System.in.read();
// 关闭资源
consumer.close();
session.close();
connection.close();
}
@Test
public void testTopicProducer() throwsException{
// 创建一个连接工厂对象,需要指定服务的ip及端口
StringbrokerURL="tcp://192.168.1.106:61616";
ConnectionFactory connectionFactory =new ActiveMQConnectionFactory(brokerURL);
// 使用工厂对象创建一个Connection对象
Connection connection =connectionFactory.createConnection();
// 开启连接,调用Connection对象的start方法
connection.start();
// 创建一个 Session对象,第一个参数,是否开启事务,如果为true则第二个参数无效
// 第二个参数是应答模式
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 使用 session对象创建一个Destination对象,两种形式的queue,topic
Topic topic =session.createTopic("test-topic");
// Queuequeue = session.createQueue("test-queue");
// 使用session对象创建一个Producer对象
MessageProducer producer =session.createProducer(topic);
// 创建 一个Message对象 ,可以使用 TestMessage
// TextMessage message = new ActiveMQTextMessage();
// message.setText("helloActiveMQ");
TextMessage message =session.createTextMessage("hello ActiveMQ topic");
// 发送消息
producer.send(message);
// 关闭资源
producer.close();
session.close();
connection.close();
}
@Test
public void testTopicConsumer() throwsException{
// 创建一个连接工厂对象,需要指定服务的ip及端口
StringbrokerURL="tcp://192.168.1.106:61616";
ConnectionFactoryconnectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 使用工厂对象创建一个Connection对象
Connection connection =connectionFactory.createConnection();
// 开启连接,调用Connection对象的start方法
connection.start();
// 创建一个 Session对象,第一个参数,是否开启事务,如果为true则第二个参数无效
// 第二个参数是应答模式
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 使用 session对象创建一个Destination对象,两种形式的queue,topic
Topic topic =session.createTopic("test-topic");
// 使用session对象创建一个consumer对象
MessageConsumer consumer =session.createConsumer(topic);
// 接收消息
consumer.setMessageListener(newMessageListener() {
@Override
public voidonMessage(Message message) { //打印结果
TextMessagetextMessage = (TextMessage) message;
try {
System.out.println(textMessage.getText());
} catch(JMSException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//等待消息
System.in.read();
// 关闭资源
consumer.close();
session.close();
connection.close();
}
}
以上是关于#徐员外#Solr服务器集群及ActiveMQ应用实战的主要内容,如果未能解决你的问题,请参考以下文章
#徐员外#阿里巴巴Dubbo开源服务框架|100本技术书之3
#徐员外# 如何查询 Lucene 建立索引库后的文档内容?
JAVAEE——宜立方商城08:Zookeeper+SolrCloud集群搭建搜索功能切换到集群版Activemq消息队列搭建与使用