Dubbo+Zookeeper+Spring mvc+Nginx 集群负载均衡 详细demo

来源:互联网 发布:oracle sql loader 编辑:程序博客网 时间:2024/06/14 18:49
做个备忘 谢谢这位哥们儿 http://blog.csdn.net/xianghui12333/article/details/71172342#

很多人刚接触分布式,集群负载均衡时都觉得高深莫测,难度有点大,其实起码入手是很简单的。我刚入公司就让我搞这个的研究,之前完全小白,nginx都没有配置过。搞了1天半,总算弄了个完整的测试项目出来,写了这个博客,以兹鼓励与纪念!
Dubbo不多说了,在国内分布式服务这块还是很牛逼的,是基于服务分布式框架,能轻松实现服务层面的负载均衡。官方文档地址http://dubbo.io/User+Guide-zh.htm
Nginx也不用多说,通过异步非阻塞能够有很大的并发量,据说是百万级,我没有真正压测过。上手十分简单,广泛应用于网站负载均衡,能轻松实现HTTP层面的负载均衡。

今天的的博客介绍的是服务层面用dubbo+zookeeper实现分布式服务,dubbo本身已经实现了服务负载均衡,所以很简单,然后Http web层用nginx负载均衡。

第一步:Zookeeper下载,安装,配置
1.1:下载:http://apache.fayea.com/zookeeper/  一般选择稳定版本,我选的是3.4.9

1.2:然后解压到一个目录,打开conf目录copy一份zoo_sample.cfg文件,并重命名为zoo.cfg(必须是这个名字)

1.3:打开zoo.cfg,入手阶段基本不用做什么修改,唯一需要注意的是端口号,后面的dubbo 管理配置需要和这个保持一致(后面说)

1.4:找到bin目录下的 zKserver.cmd 启动zookeeper

这里zookeeper就OK了

第二步:下载,配置dubbo的管理项目

2.1 下载 dubbo admin 项目 地址:http://dubbo.io/Download-zh.htm

2.2 解压,取出war包。
2.3 拷贝一个tomcat,改一下端口号(用默认容易和其他的tomcat端口冲突)


2.4 删除 tomcat webapp 目录下面的文件,将dubbo admin 包解压内容放到root目录中,修改classpath 目录下的dubbo.properties, 将这个监测中心注册到zookeeper,即将dubbo.registry.address改成你安装zookeeper的机子IP+zookeeper配置的端口。我这里是一台机子演示,默认端口与zookeeper是一致的所以不用修改。用户名密码就没有改动的必要了。



2.5 bin目录启动tomcat,输入这个tomat的访问网址 http://localhost:8180/ (端口号注意修改成你自己改的那个),然后登陆密码都是就是上面配置文件中的,root  root登录


这里可以看到,提供者为0,消费者为0

第三步:创建提供者

3.1:创建公用接口项目 service,创建两个provider (provider01,provider02)



service包,公用接口,很简单,就是个maven基础java包,不需要加入任何依赖,也不需要加入任何配置文件
[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  2.   <modelVersion>4.0.0</modelVersion>  
  3.   <groupId>com.test</groupId>  
  4.   <artifactId>service</artifactId>  
  5.   <version>0.0.1-SNAPSHOT</version>  
  6. </project>  

2个provider包引入service依赖,且需要引入dubbo,zookeeper,log4依赖,这里不需要引入Spring,dubbo自带依赖,不过版本很旧,也可以自己手动移除然后引入新版本Spring。下面给出其中一个的pom实例,copy请自行修改artifactId
pom.xml:
[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>com.test</groupId>  
  5.     <artifactId>provider02</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.   
  8.     <dependencies>  
  9.         <dependency>  
  10.             <groupId>com.test</groupId>  
  11.             <artifactId>service</artifactId>  
  12.             <version>0.0.1-SNAPSHOT</version>  
  13.         </dependency>  
  14.         <dependency>  
  15.             <groupId>com.alibaba</groupId>  
  16.             <artifactId>dubbo</artifactId>  
  17.             <version>2.5.3</version>  
  18.         </dependency>  
  19.         <dependency>  
  20.             <groupId>org.apache.zookeeper</groupId>  
  21.             <artifactId>zookeeper</artifactId>  
  22.             <version>3.3.3</version>  
  23.         </dependency>  
  24.   
  25.         <!-- 日志相关 -->  
  26.         <dependency>  
  27.             <groupId>log4j</groupId>  
  28.             <artifactId>log4j</artifactId>  
  29.             <version>1.2.16</version>  
  30.         </dependency>  
  31.   
  32.         <dependency>  
  33.             <groupId>org.slf4j</groupId>  
  34.             <artifactId>slf4j-api</artifactId>  
  35.             <version>1.7.5</version>  
  36.         </dependency>  
  37.   
  38.         <!-- zookeeper client依赖,用于向zookeeper注册服务 -->  
  39.         <dependency>  
  40.             <groupId>com.github.sgroschupf</groupId>  
  41.             <artifactId>zkclient</artifactId>  
  42.             <version>0.1</version>  
  43.         </dependency>  
  44.   
  45.     </dependencies>  
  46.   
  47.     <build>  
  48.         <pluginManagement>  
  49.             <plugins>  
  50.                 <plugin>  
  51.                     <groupId>org.apache.maven.plugins</groupId>  
  52.                     <artifactId>maven-jar-plugin</artifactId>  
  53.                     <configuration>  
  54.                         <source>1.8</source>  
  55.                         <target>1.8</target>  
  56.                         <archive>  
  57.                             <manifest>  
  58.                                 <mainClass>com.test.provider.Provider</mainClass>  
  59.                                 <addClasspath>true</addClasspath>  
  60.                                 <classpathPrefix>lib/</classpathPrefix>  
  61.                             </manifest>  
  62.   
  63.                         </archive>  
  64.                         <classesDirectory>  
  65.                         </classesDirectory>  
  66.                     </configuration>  
  67.                 </plugin>  
  68.             </plugins>  
  69.         </pluginManagement>  
  70.     </build>  
  71.   
  72. </project>  


3.2  在service公有服务接口包中新建接口TestService,内容很简单,就包含一个测试接口
TestService.java:
[java] view plain copy
  1. package com.test.service;  
  2.   
  3. /** 
  4.  * @author xianghui1 
  5.  * 
  6.  *test 
  7.  */  
  8. public interface TestService {  
  9.   
  10.     public String test();  
  11. }  




3.3  provider 提供者需要实现这个公用接口以向消费者提供服务,两个provider基本是一样的,除了部分配置
provider02 :   TestServiceImpl.java实现公有接口 testService
[java] view plain copy
  1. package com.test.service;  
  2.   
  3. import com.test.service.TestService;  
  4.   
  5. public class TestServiceImpl implements TestService {  
  6.   
  7.     public String test() {  
  8.         System.out.println("test success");  
  9.         return "provider02";  
  10.     }  
  11.   
  12. }  


provider01 :   TestServiceImpl.java实现公有接口 testService
[java] view plain copy
  1. package com.test.service;  
  2.   
  3. import com.test.service.TestService;  
  4.   
  5. public class TestServiceImpl implements TestService {  
  6.   
  7.     public String test() {  
  8.         System.out.println("test success");  
  9.         return "provider01";  
  10.     }  
  11.   
  12. }  

2个provider,随意实现,返回效果不同就行了,因为后面要测试集群负载均衡效果

3.4 到这里提供者代码层面基本完了,该项目增加配置文件,在classpath目录下新建3个配置文件:applicationContext.xml(Spring配置文件),log4.properties,provider.xml(dubbo 提供者配置文件,重要


applicationContext.xml:(2个provider一模一样)
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
  7.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd   
  8.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd   
  9.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">  
  10.       
  11.     <context:component-scan base-package="com.test" />  
  12.       
  13. </beans>  
log4.properties:(2个provider一样)
[html] view plain copy
  1. log4j.appender.mylog = org.apache.log4j.ConsoleAppender  
  2.   
  3. log4j.appender.mylog.target = System.out  
  4.   
  5. log4j.appender.mylog.layoutorg.apache.log4j.PatternLayout  
  6.   
  7. log4j.appender.mylog.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n  
  8.   
  9. log4j.appender.my2log = org.apache.log4j.RollingFileAppender  
  10.   
  11. log4j.appender.my2log.File = D://Logger//mylog.log  
  12.   
  13. log4j.appender.my2log.MaxFileSize = 50KB  
  14.   
  15. log4j.appender.my2log.MaxBackupIndex = 1  
  16.   
  17. log4j.appender.my2log.layoutorg.apache.log4j.PatternLayout  
  18.    
  19. log4j.appender.my2log.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n  
  20.   
  21. log4j.rootLogger = info,mylog,my2log  



provider01:    provider.xml
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  6.    
  7.     <!-- 提供方应用信息,用于计算依赖关系 -->  
  8.     <dubbo:application name="provider"  />  
  9.    
  10.     <!-- 使用zookeeper广播注册中心暴露服务地址 -->  
  11.     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>  
  12.    
  13.     <!-- 用dubbo协议在20880端口暴露服务 -->  
  14.     <dubbo:protocol name="dubbo" port="20881" />  
  15.   
  16.     <!-- 和本地bean一样实现服务 -->  
  17.     <bean id="testService" class="com.test.service.TestServiceImpl" />  
  18.       
  19.        
  20.     <!-- 声明需要暴露的服务接口 -->  
  21.     <dubbo:service interface="com.test.service.TestService" ref="testService" />  
  22.    
  23. </beans>  



provider02:    provider.xml
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  5.   
  6.     <!-- 提供方应用信息,用于计算依赖关系 -->  
  7.     <dubbo:application name="provider" />  
  8.   
  9.     <!-- 使用zookeeper广播注册中心暴露服务地址 -->  
  10.     <dubbo:registry address="zookeeper://10.120.106.35:2181" />  
  11.   
  12.     <!-- 用dubbo协议在20880端口暴露服务 -->  
  13.     <dubbo:protocol name="dubbo" port="20882" />  
  14.   
  15.     <!-- 和本地bean一样实现服务 -->  
  16.     <bean id="testService" class="com.test.service.TestServiceImpl" />  
  17.   
  18.   
  19.     <!-- 声明需要暴露的服务接口 -->  
  20.     <dubbo:service interface="com.test.service.TestService" ref="testService" />  
  21.   
  22. </beans>  



这里需要注意,2个provider的应用名,一样,因为模拟集群负载均衡,所以对Dubbo来说是一个服务。2个provider的端口需不一样,因为是同一台机子模拟2个服务,如果是多台就无所谓了。dubbo:Service须保持一致,因为2个provider负载均衡是模拟一个服务,所以提供的服务外面看来须一样。

3.5,业务代码以及配置文件都完成了,该启动2个provider了,新建provider类,并调用main启动,代码如下;
Provider.java(2个provider一样即可)
[html] view plain copy
  1. package com.test.provider;  
  2.   
  3. import org.apache.log4j.PropertyConfigurator;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class Provider {  
  7.     // start provider  
  8.     static{  
  9.         PropertyConfigurator.configure("src/main/resources/log4.properties");  
  10.     }  
  11.     public static void main(String args[]) throws Exception {  
  12.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:/*.xml");  
  13.         context.start();  
  14.         System.in.read();  
  15.     }  
  16. }  




成功启动之后,显示注册到了zookeeper。



这个时候我们刷新下dubbo.admin页面看看效果,显示提供者为1,说明一切正常



然后启动第二个provider,至这里显示提供者为2,服务数为1,一切OK,下一步我们开始消费者端。


第四步:创建消费者,这里创建2个Spring mvc web项目来充当消费的角色。

2个消费者(dubbo-consumer01,dubbo-consumer02)也一样,基本一样,就是服务实现不一样来测试负载均衡,还有个消费者配置文件不一样。


4.1 2个消费者POM.xml基本是一样的,标准的Spring mvc web项目,需要引入dubbo,zookeeper,公有服务service,Spring mvc系列,log4系列。这里需要注意的是,dubbo的Spring实在过于老旧了,对于web项目来说是不合适的,遇到了版本冲突,所以需要剔除dubbo中依赖的spring2.5

pom.xml(copy请自行修改 groupId与artifactId):
[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.test</groupId>  
  5.   <artifactId>dubbo-consumer02</artifactId>  
  6.   <packaging>war</packaging>  
  7.   <version>0.0.1-SNAPSHOT</version>  
  8.   <name>customer02 Maven Webapp</name>  
  9.   <url>http://maven.apache.org</url>  
  10.     <properties>  
  11.         <spring.version>4.3.8.RELEASE</spring.version>  
  12.     </properties>  
  13.   
  14.     <dependencies>  
  15.         <dependency>  
  16.             <groupId>junit</groupId>  
  17.             <artifactId>junit</artifactId>  
  18.             <version>3.8.1</version>  
  19.             <scope>test</scope>  
  20.         </dependency>  
  21.         <dependency>  
  22.             <groupId>com.test</groupId>  
  23.             <artifactId>service</artifactId>  
  24.             <version>0.0.1-SNAPSHOT</version>  
  25.         </dependency>  
  26.         <dependency>  
  27.             <groupId>com.alibaba</groupId>  
  28.             <artifactId>dubbo</artifactId>  
  29.             <version>2.5.3</version>  
  30.             <exclusions>  
  31.                 <exclusion>  
  32.                     <artifactId>spring</artifactId>  
  33.                     <groupId>org.springframework</groupId>  
  34.                 </exclusion>  
  35.             </exclusions>  
  36.         </dependency>  
  37.   
  38.         <!-- spring begin -->  
  39.         <dependency>  
  40.             <groupId>org.springframework</groupId>  
  41.             <artifactId>spring-webmvc</artifactId>  
  42.             <version>${spring.version}</version>  
  43.         </dependency>  
  44.   
  45.         <dependency>  
  46.             <groupId>org.springframework</groupId>  
  47.             <artifactId>spring-jdbc</artifactId>  
  48.             <version>${spring.version}</version>  
  49.         </dependency>  
  50.   
  51.         <dependency>  
  52.             <groupId>org.springframework</groupId>  
  53.             <artifactId>spring-context</artifactId>  
  54.             <version>${spring.version}</version>  
  55.         </dependency>  
  56.   
  57.         <dependency>  
  58.             <groupId>org.springframework</groupId>  
  59.             <artifactId>spring-aop</artifactId>  
  60.             <version>${spring.version}</version>  
  61.         </dependency>  
  62.   
  63.         <dependency>  
  64.             <groupId>org.springframework</groupId>  
  65.             <artifactId>spring-core</artifactId>  
  66.             <version>${spring.version}</version>  
  67.         </dependency>  
  68.   
  69.         <dependency>  
  70.             <groupId>org.springframework</groupId>  
  71.             <artifactId>spring-test</artifactId>  
  72.             <version>${spring.version}</version>  
  73.         </dependency>  
  74.                 <dependency>  
  75.             <groupId>org.springframework</groupId>  
  76.             <artifactId>spring-test</artifactId>  
  77.             <version>${spring.version}</version>  
  78.         </dependency>  
  79.         <!-- spring end -->  
  80.   
  81.         <!-- web jar -->  
  82.         <dependency>  
  83.             <groupId>javax.servlet</groupId>  
  84.             <artifactId>javax.servlet-api</artifactId>  
  85.             <version>3.0.1</version>  
  86.             <scope>provided</scope>  
  87.         </dependency>  
  88.         <dependency>  
  89.             <groupId>javax.servlet</groupId>  
  90.             <artifactId>jstl</artifactId>  
  91.             <version>1.1.2</version>  
  92.             <scope>provided</scope>  
  93.         </dependency>  
  94.         <dependency>  
  95.             <groupId>javax.servlet.jsp</groupId>  
  96.             <artifactId>javax.servlet.jsp-api</artifactId>  
  97.             <version>2.3.1</version>  
  98.             <scope>provided</scope>  
  99.         </dependency>  
  100.         <!-- jstl jar -->  
  101.         <dependency>  
  102.             <groupId>jstl</groupId>  
  103.             <artifactId>jstl</artifactId>  
  104.             <version>1.2</version>  
  105.         </dependency>  
  106.   
  107.         <dependency>  
  108.             <groupId>taglibs</groupId>  
  109.             <artifactId>standard</artifactId>  
  110.             <version>1.1.2</version>  
  111.         </dependency>  
  112.   
  113.         <!-- jackson jar -->  
  114.         <dependency>  
  115.             <groupId>org.codehaus.jackson</groupId>  
  116.             <artifactId>jackson-jaxrs</artifactId>  
  117.             <version>1.9.11</version>  
  118.         </dependency>  
  119.   
  120.         <!-- commons jar -->  
  121.         <dependency>  
  122.             <groupId>org.apache.commons</groupId>  
  123.             <artifactId>commons-lang3</artifactId>  
  124.             <version>3.3.2</version>  
  125.         </dependency>  
  126.         <dependency>  
  127.             <groupId>commons-io</groupId>  
  128.             <artifactId>commons-io</artifactId>  
  129.             <version>2.4</version>  
  130.         </dependency>  
  131.         <dependency>  
  132.             <groupId>org.apache.commons</groupId>  
  133.             <artifactId>commons-collections4</artifactId>  
  134.             <version>4.0</version>  
  135.         </dependency>  
  136.         <dependency>  
  137.             <groupId>commons-logging</groupId>  
  138.             <artifactId>commons-logging</artifactId>  
  139.             <version>1.1.3</version>  
  140.         </dependency>  
  141.         <dependency>  
  142.             <groupId>commons-codec</groupId>  
  143.             <artifactId>commons-codec</artifactId>  
  144.             <version>1.8</version>  
  145.         </dependency>  
  146.         <dependency>  
  147.             <groupId>commons-beanutils</groupId>  
  148.             <artifactId>commons-beanutils</artifactId>  
  149.             <version>1.8.3</version>  
  150.         </dependency>  
  151.         <dependency>  
  152.             <groupId>commons-chain</groupId>  
  153.             <artifactId>commons-chain</artifactId>  
  154.             <version>1.2</version>  
  155.         </dependency>  
  156.         <dependency>  
  157.             <groupId>commons-fileupload</groupId>  
  158.             <artifactId>commons-fileupload</artifactId>  
  159.             <version>1.3.1</version>  
  160.         </dependency>  
  161.         <dependency>  
  162.             <groupId>org.apache.commons</groupId>  
  163.             <artifactId>commons-math3</artifactId>  
  164.             <version>3.3</version>  
  165.         </dependency>  
  166.         <dependency>  
  167.             <groupId>org.apache.commons</groupId>  
  168.             <artifactId>commons-pool2</artifactId>  
  169.             <version>2.2</version>  
  170.         </dependency>  
  171.         <dependency>  
  172.             <groupId>org.apache.commons</groupId>  
  173.             <artifactId>commons-digester3</artifactId>  
  174.             <version>3.2</version>  
  175.         </dependency>  
  176.         <dependency>  
  177.             <groupId>commons-net</groupId>  
  178.             <artifactId>commons-net</artifactId>  
  179.             <version>3.3</version>  
  180.         </dependency>  
  181.         <dependency>  
  182.             <groupId>commons-dbutils</groupId>  
  183.             <artifactId>commons-dbutils</artifactId>  
  184.             <version>1.5</version>  
  185.         </dependency>  
  186.         <dependency>  
  187.             <groupId>org.apache.commons</groupId>  
  188.             <artifactId>commons-email</artifactId>  
  189.             <version>1.3.3</version>  
  190.         </dependency>  
  191.         <dependency>  
  192.             <groupId>commons-dbcp</groupId>  
  193.             <artifactId>commons-dbcp</artifactId>  
  194.             <version>1.4</version>  
  195.         </dependency>  
  196.   
  197.         <!-- 日志相关 -->  
  198.         <dependency>  
  199.             <groupId>log4j</groupId>  
  200.             <artifactId>log4j</artifactId>  
  201.             <version>1.2.16</version>  
  202.         </dependency>  
  203.   
  204.         <dependency>  
  205.             <groupId>org.slf4j</groupId>  
  206.             <artifactId>slf4j-api</artifactId>  
  207.             <version>1.7.5</version>  
  208.         </dependency>  
  209.         <!-- zookeeper client依赖,用于向zookeeper注册服务 -->  
  210.         <dependency>  
  211.             <groupId>com.github.sgroschupf</groupId>  
  212.             <artifactId>zkclient</artifactId>  
  213.             <version>0.1</version>  
  214.         </dependency>  
  215.     </dependencies>  
  216.     <build>  
  217.         <finalName>dubbo-customer02</finalName>  
  218.     </build>  
  219. </project>  


4.2,两个web项目的主要配置文件,共5个:web.xml、applicationContext.xml、consumer.xml、log4.properties、springmvc-servlet.xml。

web.xml :基本一样这里只放出一个
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.   
  7.     <display-name>Archetype Created Web Application</display-name>  
  8.   
  9.   
  10.     <!-- 关键配置 contextListener -->  
  11.     <context-param>  
  12.         <param-name>contextConfigLocation</param-name>  
  13.         <param-value>classpath*:applicationContext.xml</param-value>  
  14.     </context-param>  
  15.   
  16.     <listener>  
  17.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  18.     </listener>  
  19.   
  20.   
  21.     <!-- log4 -->  
  22.     <context-param>  
  23.         <param-name>log4jConfigLocation</param-name>  
  24.         <param-value>classpath:log4.properties</param-value>  
  25.     </context-param>  
  26.   
  27.     <context-param>  
  28.         <param-name>log4jRefreshInterval</param-name>  
  29.         <param-value>3000</param-value>  
  30.     </context-param>  
  31.   
  32.     <listener>  
  33.         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  34.     </listener>  
  35.       
  36.     <!-- 字符过滤器 -->  
  37.     <filter>  
  38.         <filter-name>encodingFilter</filter-name>  
  39.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  40.         <init-param>  
  41.             <param-name>encoding</param-name>  
  42.             <param-value>UTF-8</param-value>  
  43.         </init-param>  
  44.     </filter>  
  45.     <filter-mapping>  
  46.         <filter-name>encodingFilter</filter-name>  
  47.         <url-pattern>/</url-pattern>  
  48.     </filter-mapping>  
  49.   
  50.   
  51.     <!-- 设置tomcat对静态资源默认拦截 -->  
  52.     <servlet-mapping>  
  53.         <servlet-name>default</servlet-name>  
  54.         <url-pattern>*.jpg</url-pattern>  
  55.     </servlet-mapping>  
  56.     <servlet-mapping>  
  57.         <servlet-name>default</servlet-name>  
  58.         <url-pattern>*.png</url-pattern>  
  59.     </servlet-mapping>  
  60.     <servlet-mapping>  
  61.         <servlet-name>default</servlet-name>  
  62.         <url-pattern>*.js</url-pattern>  
  63.     </servlet-mapping>  
  64.     <servlet-mapping>  
  65.         <servlet-name>default</servlet-name>  
  66.         <url-pattern>*.css</url-pattern>  
  67.     </servlet-mapping>  
  68.     <!-- 关键配置 dispatcherServlet -->  
  69.     <!-- 拦截所有的请求,包括静态资源 -->  
  70.     <servlet>  
  71.         <servlet-name>springmvc</servlet-name>  
  72.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  73.         <init-param>  
  74.             <param-name>contextConfigLocation</param-name>  
  75.             <param-value>classpath*:springmvc-servlet.xml</param-value>  
  76.         </init-param>  
  77.         <load-on-startup>1</load-on-startup>  
  78.     </servlet>  
  79.   
  80.     <servlet-mapping>  
  81.         <servlet-name>springmvc</servlet-name>  
  82.         <url-pattern>/</url-pattern>  
  83.     </servlet-mapping>  
  84.   
  85.     <welcome-file-list>  
  86.         <welcome-file>index.jsp</welcome-file>  
  87.     </welcome-file-list>  
  88. </web-app>  



applicationContext.xml    2个consumer一模一样,只是引入consumer消费者配置文件,很简单

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
  7.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd   
  8.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd   
  9.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">  
  10.       
  11.     <import resource="classpath*:/consumer.xml" />  
  12.       
  13. </beans>  


consumer.xml:    消费者配置文件,这个很重要,这里消费者应用名不能一样了,因为我模拟是2个消费者,然后需要向zookeeper中心注册,还有个很重要的就是引用提供者提供的远程服务

consumer01:   consumer.xml
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  6.    
  7.     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->  
  8.     <dubbo:application name="consumer01"  />  
  9.    
  10.     <!-- 使用zookeeper广播注册中心暴露服务地址 -->  
  11.     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>  
  12.    
  13.     <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->  
  14.     <dubbo:reference id="testService" interface="com.test.service.TestService" />  
  15.    
  16. </beans>  

consumer02:   consumer.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  6.    
  7.     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->  
  8.     <dubbo:application name="consumer02"  />  
  9.    
  10.     <!-- 使用zookeeper广播注册中心暴露服务地址 -->  
  11.     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>  
  12.    
  13.     <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->  
  14.     <dubbo:reference id="testService" interface="com.test.service.TestService" />  
  15.    
  16. </beans>  



log4配置文件,没什么好说的,同provider,这里不粘了


springmvc-servlet.xml :   配置文件,很简单,启用注解与controller扫描,没了。

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd      
  7. http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-4.3.xsd   
  8. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"  
  9.     default-lazy-init="true">  
  10.   
  11.     <!-- 启用注解 -->  
  12.     <context:annotation-config />  
  13.   
  14.     <!-- 扫描Controller -->  
  15.     <context:component-scan base-package="com.test.controller" />  
  16.     <!-- 完成请求与注解的POJO映射 -->  
  17.     <bean  
  18.         class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  19.     <bean  
  20.         class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
  21.           
  22.           
  23.     <bean id="defaultViewResolver"  
  24.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"  
  25.         p:order="3">  
  26.         <property name="viewClass"  
  27.             value="org.springframework.web.servlet.view.JstlView" />  
  28.         <property name="contentType" value="text/html" />  
  29.         <property name="prefix" value="/" />  
  30.         <property name="suffix" value=".jsp" />  
  31.     </bean>  
  32. </beans>  

4.3   spring mvc web 项目配置已经完成了,这一步,可以直接启动项目,启动成功,且能进helloworld 页则说明你的配置没有出现细微错误,否则需要检查检查,保证项目是正常的,不然后面排错懵逼。

现在我们新建个controller,很简单,就弄个接口,调用提供者的远程服务
consumer01:     TestController:   
[html] view plain copy
  1. <pre name="code" class="java">package com.test.controller;  
  2.   
  3.   
  4. import java.util.Map;  
  5.   
  6.   
  7. import javax.annotation.Resource;  
  8.   
  9.   
  10. import org.springframework.stereotype.Controller;  
  11. import org.springframework.web.bind.annotation.RequestMapping;  
  12. import org.springframework.web.bind.annotation.ResponseBody;  
  13.   
  14.   
  15. import com.test.service.TestService;  
  16.   
  17.   
  18.   
  19.   
  20. /**  
  21.  * @author xianghui1  
  22.  *  
  23.  *         测试controller  
  24.  */  
  25. @Controller  
  26. public class TestController {  
  27.   
  28.   
  29.     @Resource(name = "testService")  
  30.     TestService testInterface;  
  31.   
  32.   
  33.     @RequestMapping(value = { "/consumer/testMain" })  
  34.     @ResponseBody  
  35.     public String testDubbo() {  
  36.         return "consuemr01" + testInterface.test();  
  37.     }  
  38.   
  39.   
  40. }</pre><br>  
  41. <pre></pre>  
  42. <pre></pre>  

consumer02    TestController: 
[html] view plain copy
  1. package com.test.controller;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9. import org.springframework.web.bind.annotation.ResponseBody;  
  10.   
  11. import com.test.service.TestService;  
  12.   
  13.   
  14. /**  
  15.  * @author xianghui1  
  16.  *  
  17.  *测试controller  
  18.  */  
  19. @Controller  
  20. public class TestController {  
  21.   
  22.     @Resource(name="testService")  
  23.     TestService testInterface;  
  24.       
  25.     @RequestMapping(value={"/consumer/testMain"})  
  26.     @ResponseBody  
  27.     public String testDubbo(){  
  28.         return "consuemr02"+testInterface.test();  
  29.     }  
  30.       
  31. }  


4.4,然后我们可以启动了,我们将2个consuemr分别放在两个tomcat中运行,2个tomcat端口要不一致的

可以看出2个consumer,2个provider,一切正常,我们在浏览器中访问我们的接口,也是正常


第五步:到这里我们的dubbo+zookeeper+Spring mvc 搭建完成了,下一步,加入nginx 实现http层面的负载均衡


5.1   下载nginx,解压,并修改conf目录下的nginx.conf

5.2我们新建个upstream 负载均衡,采取默认的nginx负载均衡策略,然后监听80端口,将80端口所有的请求代理转发到负载上面


5.3 命令行启动nginx,然后在浏览器中输入接口网址即可发现会出现四种结果,consumer01provider01、consumer02provider01、consumer01provider02、consumer02provider02.   dubbo+zookeeper+spring mvc+nginx负载均衡测试完成

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 w10系统玩刺激战场声音小怎么办 宝宝不咳嗽但是喉咙有痰怎么办 深圳限行如果车堵在路上怎么办 奔跑吧qq中奖我填写资料怎么办 微信之前绑定的手机号丢了怎么办 龙之谷手游换装备洗炼材料怎么办 小学生在班上碰到流氓同学怎么办 问道手游仓库密码忘了怎么办 问道手游安全码忘了怎么办 问道手游账号密码忘了怎么办 坐一天一夜长途车腰疼怎么办 智联的简历一直说不完整怎么办 智联招聘简历投错了怎么办 投简历的公司写错面试时怎么办 从原单位辞职后档案一直没提怎么办 手机因一些不良软件扣费怎么办 苹果手机玩崩坏3卡顿怎么办 以前很帅现在变得好难看了怎么办 偷了室友东西被发现了该怎么办 自己不喜欢狗但室友养狗怎么办 夏天身上闷热出很多小红豆怎么办? 海棠果核小孩吃进肚子了怎么办 大了叶海棠有点烂根怎么办? 刚栽的月季花苗叶子蔫了怎么办 对节白蜡盆景叶尖干枯发黑怎么办 婴儿皮肤被大人指甲划出血怎么办 三岁宝宝吃了铝箔包装纸怎么办 元宝鱼烂身子烂鳍尾巴怎么办 大掌门2多余的侠客令怎么办 vivo手机关机后开不了机怎么办 红米手机重置后开机黑屏怎么办 dnf夏日套光环选错了怎么办 ios6微信版本低登录不了怎么办 捡了一个苹果手机有id怎么办 外阴长了个包出血很痛怎么办 腿上烫成泡了泡泡破了掉皮了怎么办 脚上的脚气小泡泡破了怎么办 吃鸡使用改名卡改名符号怎么办 爱派平板电脑密码忘了怎么办 电脑优酷下载总显示未知错误怎么办 文本文档打开时显字符丢失怎么办