dubbo 图片服务器(FastDFS) redis solr ActiveMQ等简单配置使用

一、dubbo

项目基于soa的架构,表现层和服务层是不同的工程。所以要实现商品列表查询需要两个系统之间进行通信。

1.1如何实现远程通信?

1、Webservice:效率不高基于soap协议。项目中不推荐使用。

2、使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。(跨语言)

3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。(只能用于java工程之间)

1.2 什么是dubbo

Dubbo就是资源调度和治理中心的管理工具。(阿里开源分布式工具)

1.3  Dubbo的架构

节点角色说明:

Provider: 暴露服务的服务提供方。

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。

Container: 服务运行容器。

2.1 注册中心

zookeeper注册中心。

ZookeeperApacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用

2.1.1Zookeeper的安装:

(需要jvm环境(java -version)(安装注意位数对应),注意要关闭linux的防火墙。)

第一步:安装jdk

第二步:解压缩zookeeper压缩包

第三步:将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg

第四步:修改配置dataDir属性,指定一个真实目录

第五步:

启动zookeeperbin/zkServer.sh start

关闭zookeeperbin/zkServer.sh stop

查看zookeeper状态:bin/zkServer.sh status

 

详解

1.上传zookeeper压缩包

2.解压(tar zxf zookeeper-3.4.6.tar.gz)(得到zookeeper文件夹)

3.进入 zookeeper文件夹(cd zookeeper-3.4.6)

4.创建data目录(mkdir data)

5.进入conf目录(cd conf)

6.将zoo_sample.cfg改名为 zoo.cfg(mv zoo_sample.cfg  zoo.cfg)

7.编辑 zoo.cfg(vim zoo.cfg),将dataDir目录改为创建的data目录(/root/zookeeper-3.4.6/data)

8.进入zookeeper下的bin 目录(cd ..  ->   cd bin)

9.运行(./zkServer.sh start)

10.查看是否启动成功(./zkServer.sh status)

        (standalone:单例)

3.1dubbo使用方法

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于SpringSchema扩展进行加载。

 

单一工程中spring的配置

 

<bean id="xxxService" class="com.xxx.XxxServiceImpl" />

<bean id="xxxAction" class="com.xxx.XxxAction">

<property name="xxxService" ref="xxxService" />

</bean>

 

 

 

远程服务:

 

在本地服务的基础上,只需做简单配置,即可完成远程化:

 

将上面的local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml

 

并在提供方增加暴露服务配置<dubbo:service>,在消费方增加引用服务配置<dubbo:reference>

 

发布服务:

<!-- 和本地服务一样实现远程服务 -->

<bean id="xxxService" class="com.xxx.XxxServiceImpl" />

<!-- 增加暴露远程服务配置 -->

<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />

 

 

 

调用服务:

 

<!-- 增加引用远程服务配置 -->

<dubbo:reference id="xxxService" interface="com.xxx.XxxService" />

<!-- 和本地服务一样使用远程服务 -->

<bean id="xxxAction" class="com.xxx.XxxAction">

<property name="xxxService" ref="xxxService" />

</bean>

例:

1.都加入dubbo相关jar包(需要移除spring和netty的传递依赖(也可以在pom文件的dependency Hierarchy找到jar包右键 exclude Maven artifcrt...))

<!-- dubbo相关的jar包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <exclusions> <!-- 移除spring的传递依赖 -->
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>netty</artifactId>
                    <groupId>org.jboss.netty</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>

 

2.发布服务(在服务工程中)(在spring配置文件中添加(applicationContext-service.xml))

2.1在beans中加入dubbo及约束

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 


http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd

2.2加入dubbo

  <!-- 使用Dubbo发布服务 -->
    <!-- 提供方应用信息,用于计算依赖关系(取个应用名) -->
    <dubbo:application name="taotao-manager" />
    <!-- 注册中心的地址 -->
    <dubbo:registry protocol="zookeeper" address="192.168.25.150:2181" />
    <!-- 用dubbo协议在20880端口暴露服务(可以随意,不冲突就行) -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" timeout="300000"/>
    <dubbo:service interface="com.taotao.service.ItemCatService" ref="itemCatServiceImpl" timeout="300000"/>
    

3.调用服务(在pom添加jar包及interface的引用)(在表现层工程中)(在springmvc.xml):

3.1同样加入前缀 约束等

3.2

<!-- 引用dubbo服务 -->
<dubbo:application name="taotao-manager-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.25.88:2181"/>    
<dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />
<dubbo:reference interface="com.taotao.service.ItemCatService" id="itemCatService" />

 3.3在controller中使用方式

@Autowired
private ItemService itemService;

4 Dubbo监控中心

需要安装tomcat,然后部署监控中心即可(dubbo-admin-2.5.4.war)(最好监控中心和zookeeper在同一台服务器上)。

4.1安装tomcat

4.1.1上传 并解压(tar zxf apache-tomcat-7.0.47.tar.gz)

4.1.2 上传 dubbo-admin-2.5.4.war

4.1.3将dubbo-admin-2.5.4.war 复制到tomcat webapps目录下并改名(cp dubbo-admin-2.5.4.war apache-tomcat-7.0.47/webapps/dubbo-admin.war)

4.1.4 启动tomcat(进入到tomcat目录下)

cd apache-tomcat-7.0.47
bin/startup.sh     //启动tomcat
tail -f logs/catalina.out    //查看日志

4.3进入监控中心网址(192.168.25.150:8080/dubbo-admin)(用户名和密码都为root)

注 : 如果监控中心和zookeeper不在同一台服务器需要修改一下配置文件

cd webapps/
cd dubbo-admin
cd WEB-INF/
vim dubbo.properties

(只需将第一行zookeeper地址改为对应的即可)

二、图片上传服务器

使用FastDFS,分布式文件系统。存储空间可以横向扩展,可以实现服务器的高可用。支持每个节点有备份机。

1.什么是FastDFS

 

FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

2.图片服务器的使用

2.1 java客户端 使用fastdfs_client_v1.20.jar

2.2Maven环境

导入fastdfs_client工程(导入成功记得maven install  ,使用需要在pom中导入)

3. 上传图片

3.1. 上传步骤

1、加载配置文件,配置文件中的内容就是tracker服务的地址。

配置文件内容:tracker_server=192.168.25.133:22122

2、创建一个TrackerClient对象。直接new一个。

3、使用TrackerClient对象创建连接,获得一个TrackerServer对象。

4、创建一个StorageServer的引用,值为null

5、创建一个StorageClient对象,需要两个参数TrackerServer对象、StorageServer的引用

6、使用StorageClient对象上传图片。

7、返回数组。包含组名和图片的路径。

 

测试代码

public class FastDFSTest {

    @Test
    public void testFileUpload() throws Exception {
        // 1、加载配置文件,配置文件中的内容就是tracker服务的地址。
        ClientGlobal.init("D:/workspaces-itcast/term197/taotao-manager-web/src/main/resources/resource/client.conf");
        // 2、创建一个TrackerClient对象。直接new一个。
        TrackerClient trackerClient = new TrackerClient();
        // 3、使用TrackerClient对象创建连接,获得一个TrackerServer对象。
        TrackerServer trackerServer = trackerClient.getConnection();
        // 4、创建一个StorageServer的引用,值为null
        StorageServer storageServer = null;
        // 5、创建一个StorageClient对象,需要两个参数TrackerServer对象、StorageServer的引用
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        // 6、使用StorageClient对象上传图片。
        //扩展名不带“.”
        String[] strings = storageClient.upload_file("D:/Documents/Pictures/images/200811281555127886.jpg", "jpg", null);
        // 7、返回数组。包含组名和图片的路径。
        for (String string : strings) {
            System.out.println(string);
        }
    }
}

使用工具类方法

@Test
    public void testFastDfsClient() throws Exception {
        FastDFSClient fastDFSClient = new FastDFSClient("D:/workspaces-itcast/term197/taotao-manager-web/src/main/resources/resource/client.conf");
        String file = fastDFSClient.uploadFile("D:/Documents/Pictures/images/2f2eb938943d.jpg");
        System.out.println(file);
    }

三、redis

Redisc语言开发的。

安装redis需要c语言的编译环境。如果没有gcc需要在线安装。yum install gcc-c++

 1.安装步骤:

第一步:redis的源码包上传到linux系统。

第二步:解压缩redis

第三步:编译。进入redis源码目录。make

第四步:安装。make install PREFIX=/usr/local/redis

PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下

 

详解:

1.上传redis-3.0.0.tar.gz并解压(tar zxf redis-3.0.0.tar.gz )

2.进入redis(cd cd redis-3.0.0)

3.输入  make (进行编译)

4.安装( make install PREFIX=/usr/local/redis)

5.进入redis的bin目录(cd /usr/local/redis/bin/)

6.启动服务端(./redis-server )(前端启动,但会占用一个)

  6.2也可以采用后端启动(crtl+c退出上一步)

  6.2.2 复制配置文件到当前目录(cp ~/redis-3.0.0/redis.conf .)

 

  6.2.3编辑文件(vim redis.conf ),将daemonize no 改为daemonize yes

  6.2.4启动服务端(后端形式)(./redis-server redis.conf )

  6.2.5通过查看端口查看是否运行(ps aux|grep redis)

7.可以通过(./redis-cli )进行连接redis数据库进行操作等

  7.1 可以指定ip和端口号(./redis-cli -h 192.168.25.150 -p 6379)

2.redis的五种基本数据类型

2.1 String :key-value(做缓存)

  Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据。

  getset

  incr:加一(生成id

  Decr:减一

2.2Hash:key-fields-values(做缓存)

         Hset:向hash中添加内容

         Hget:从hash中取内容

2.3 List:有顺序可重复

2.4 Set:元素无顺序,不能重复

2.5 SortedSetzset):有顺序,不能重复

 3.Jedis

 3.1加入jedis依赖或jar包

3.2

@Test
    public void testJedisPool() throws Exception{
        //创建一个数据库连接池(单例),需要指定服务的ip和端口号
        JedisPool jedisPool = new JedisPool("192.168.25.150",6379);
        //从连接池中获得连接
        Jedis jedis = jedisPool.getResource();
        //使用jedis操作数据库(方法级别使用)
        String result = jedis.get("jedis-key");
        System.out.println(result);
        //一定要关闭jedis连接
        jedis.close();
        //系统关闭前关闭连接池
        jedisPool.close();
    }

 

4.redis的集群搭建(伪分布式)

Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。

Redis集群至少需要6台服务器。

搭建伪分布式。可以使用一台虚拟机运行6redis实例。需要修改redis的端口号7001-7006(正常多个服务器搭建时,因为ip不一致,端口号不用修改即可)

步骤:

4.1在local目录下(cd /usr/local/)建立文件夹复制已有的redis(cd /usr/local/redis/bin/)

    

4.2进入redis01目录下(cd redis-cluster/redis01/)

4.3搭建集群需要干净的节点,所以需要把dump.rdb删除(rm -rf dump.rdb )

4.4修改端口号(vim redis.conf),并将集群模式打开(将cluster-enabled yes的注释打开)

 

4.5回到 redis-cluster目录(cd ..)多复制几份节点(cp -r redis01/ redis02)

 

4.6修改复制的各个的端口号(7002-7006)( vim redis02/redis.conf )

4.7启动每个redis(因为方便选择批处理)

  4.7.1(vim start-all.sh)

  4.7.2写入

cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

  4.7.3修改执行权限(chmod +x start-all.sh)

  4.7.4执行(./start-all.sh)

  4.7.5判断是否执行成功(ps aux|grep redis)

4.8使用ruby脚本搭建集群,需要ruby运行环境

  4.8.1安装ruby

yum install ruby
yum install rubygems

  4.8.2安装Ruby需要的包

   ①.上传redis-3.0.0.gem

   ②.回到根目录(cd ~)安装 (gem install redis-3.0.0.gem)

  ③.进入redis目录下(cd redis-3.0.0/src/)

  ④.复制redis下的ruby脚本文件(redis-trib.rb)(cp *.rb /usr/local/redis-cluster/)

4.9回到集群目录(cd /usr/local/redis-cluster/)

4.10使用ruby脚本搭建集群(./redis-trib.rb create --replicas 1 192.168.25.150:7001 192.168.25.150:7002 192.168.25.150:7003 192.168.25.150:7004 7001 192.168.25.150:7002 192.168.25.150:7003 192.168.25.150:7004 192.168.25.150:7005 192.168.25.150:7006)。

5.连接Redis集群

5.1.使用redis-cli连接(redis01/redis-cli -p 7006 -c)

  注:端口号为集群中的任意节点,-c为代表连接的是redis集群

 

5.2使用jedisCluster连接集群

@Test
    public void testJedisCluster() throws Exception{
        //创建一个JedisCluster对象,构造参数Set类型,集合中每个元素HostAndPost类型
        Set<HostAndPort> nodes = new HashSet<>();
        //向集合中添加节点
        nodes.add(new HostAndPort("192.168.25.150", 7001));
        nodes.add(new HostAndPort("192.168.25.150", 7002));
        nodes.add(new HostAndPort("192.168.25.150", 7003));
        nodes.add(new HostAndPort("192.168.25.150", 7004));
        nodes.add(new HostAndPort("192.168.25.150", 7005));
        nodes.add(new HostAndPort("192.168.25.150", 7006));
        JedisCluster jedisCluster = new JedisCluster(nodes);
        //直接使用JedisCluster操作redis,自带链接池JedisCluster对象可以是单例的
        jedisCluster.set("cluster-test", "Hello");
        String string = jedisCluster.get("cluster-test");
        System.out.println(string);
        //系统关闭前关闭JedisCluster
        jedisCluster.close();
    }

6.JedisClient连接单机版

(添加package包及需要的文件)

 

6.1向spring容器中添加(可以新建applicationContext-redis.xml文件管理单机版与集群版)

<context:annotation-config></context:annotation-config><!--开启注解-->
    <!-- redis单机版 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg name="host" value="192.168.25.88"></constructor-arg>
        <constructor-arg name="port" value="6379"></constructor-arg>
    </bean>

6.2使用测试

@Test
    public void testJedisClientPool() throws Exception{
        //初始化Spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");
        
        //从容器中获得JedisClient对象
        JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
        //使用JedisClient对象操作redis
        jedisClient.set("jedisclient", "mytest");
        String result = jedisClient.get("jedisclient");
        System.out.println(result);
        
    }

7.JedisClient连接集群版

7.1向spring容器中添加(集群版和单机版不使用的那个注释即可)

<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
        <constructor-arg>
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.150"></constructor-arg>
                    <constructor-arg name="port" value="7001"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.150"></constructor-arg>
                    <constructor-arg name="port" value="7002"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.150"></constructor-arg>
                    <constructor-arg name="port" value="7003"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.150"></constructor-arg>
                    <constructor-arg name="port" value="7004"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.150"></constructor-arg>
                    <constructor-arg name="port" value="7005"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.150"></constructor-arg>
                    <constructor-arg name="port" value="7006"></constructor-arg>
                </bean>
            </set>
        </constructor-arg>
    </bean>
    <bean id="jedisClientCluster" class="com.taotao.jedis.JedisClientCluster"></bean>

 

四、solr  

五、ActiveMQ

ActiveMQ Apache出品,最流行的,能力强劲的开源消息总线。

1. ActiveMQ的消息形式

 

  对于消息的传递有两种类型:

 

  一种是点对点的,即一个生产者和一个消费者一一对应;

 

  另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

 

2. 安装(需要jdk环境)与启动:

2.1 上传压缩包(apache-activemq-5.12.0-bin.tar.gz)并解压缩(tar zxf apache-activemq-5.12.0-bin.tar.gz)

2.2进入activemq的bin目录(cd apache-activemq-5.12.0/bin/)

2.3启动 ./activemq start

2.4查看是否启动成功  ps aux|grep activemq

  也可以通过访问192.168.25.150:8161/admin(账号密码都为admin)

  注:在页面点Queues如果出现503错误,说明linux主机名和ip未对应(查看机器名(cat /etc/sysconfig/network)(HOSTNAME为机器名,如果带.的只显示.前面的)查看ip与机器名对应关系(cat /etc/hosts)(没有自己的机器名可以把自己的机器名加到后面,修改完成重启activemq服务))

  

 

posted @ 2018-07-15 21:44  JokerQ-  阅读(617)  评论(0编辑  收藏  举报