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注册中心。
Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
2.1.1Zookeeper的安装:
(需要jvm环境(java -version)(安装注意位数对应),注意要关闭linux的防火墙。)
第一步:安装jdk
第二步:解压缩zookeeper压缩包
第三步:将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg
第四步:修改配置dataDir属性,指定一个真实目录
第五步:
启动zookeeper:bin/zkServer.sh start
关闭zookeeper:bin/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基于Spring的Schema扩展进行加载。
单一工程中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
Redis是c语言开发的。
安装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中不适合保存内容大的数据。
get、set
incr:加一(生成id)
Decr:减一
2.2Hash:key-fields-values(做缓存)
Hset:向hash中添加内容
Hget:从hash中取内容
2.3 List:有顺序可重复
2.4 Set:元素无顺序,不能重复
2.5 SortedSet(zset):有顺序,不能重复
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台服务器。
搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改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服务))