[分布式] 使用 Dubbo、ZooKeeper 实现集群负载均衡
2018-03-28 18:18
736 查看
一、前言
传统 Java 的 web 基本都是创建一个 Maven 工程的,现在使用 阿里巴巴的 Dubbo 框架( SpringCloud 有点重,不过应是未来的主流 ),以分布式开发的思想,并为了减少代码的冗余,将其分为 4 个工程,分别是:
① POM
父工程,统一管理 Provider、Consumer 的版本
② Provider
提供服务
③ Consumer
消费服务
④ API
抽取 Provider、Consumer 的接口,减少代码冗余
二、代码实现
下面做了一个简单的案例,重在体现分布式思想、结构1、代码结构
2、DubboAPI
① ProviderServicepackage com.cun.service; /** * 接口 * @author linhongcun * */ public interface ProviderService { String updateString(String s); }
② pom
其实是没内容的,因为只是接口而已
<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"> <modelVersion>4.0.0</modelVersion> <groupId>DubboAPI</groupId> <artifactId>DubboAPI</artifactId> <version>0.0.1-SNAPSHOT</version> </project>
3、DubboConsumer
① consumer.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名称,用于计算依赖关系,不是匹配条件,不要与提供方名称一样 --> <dubbo:application name="DubboJAR2" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://localhost:2181" /> <!-- 生成远程服务代理,可以与本地bean一样使用 check属性,启动时候是否检查 一般设置成false 启动时候不检查 --> <dubbo:reference id="ProviderService" check="false" interface="com.cun.service.ProviderService" /> </beans>
② DubboConsumerTest
Ⅰ、代码
package com.cun.test; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.cun.service.ProviderService; public class DubboConsumerTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"consumer.xml"}); context.start(); ProviderService demoProviderService=(ProviderService) context.getBean("ProviderService"); String result=demoProviderService.updateString("Consummer"); System.out.println(""+result); try { System.in.read(); } catch (IOException e) { e.printStackTrace(); } context.close(); } }
Ⅱ、console 输出(注意要先开启 Provider)
③ DubboConsumer pom
<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"> <modelVersion>4.0.0</modelVersion> <groupId>DubboConsumer</groupId> <artifactId>DubboConsumer</artifactId> <!-- Provider、Consumer 父工程:统一管理版本 --> <parent> <groupId>DubboPOM</groupId> <artifactId>DubboPOM</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <!-- 加入接口依赖,Provider、Consumer 就可以不用写 interface 了 --> <dependency> <groupId>DubboAPI</groupId> <artifactId>DubboAPI</artifactId> </dependency> <!-- Dubbo 依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> </dependency> <!-- zooKeeper 依赖,没了会报错 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </dependency> </dependencies> </project>
4、DubboPOM
1、父工程 pom<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"> <modelVersion>4.0.0</modelVersion> <groupId>DubboPOM</groupId> <artifactId>DubboPOM</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!-- 依赖版本管理 --> <properties> <DubboAPI.version>0.0.1-SNAPSHOT</DubboAPI.version> <dubbo.version>2.6.0</dubbo.version> <zkclient.version>0.10</zkclient.version> <curator-framework.version>4.0.1</curator-framework.version> <fastjson.version>1.2.46</fastjson.version> <log4j.version>1.2.17</log4j.version> <slf4j-api.version>1.7.25</slf4j-api.version> <commons-lang3.version>3.4</commons-lang3.version> <netty-all.version>4.0.35.Final</netty-all.version> <zookeeper.version>3.4.5</zookeeper.version> </properties> <!-- 依赖管理 仅仅定义 --> <dependencyManagement> <dependencies> <!-- 接口版本 --> <dependency> <groupId>DubboAPI</groupId> <artifactId>DubboAPI</artifactId> <version>${DubboAPI.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>${zkclient.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>${curator-framework.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j-api.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>${netty-all.version}</version> </dependency> <!-- 注意得导入zookeeper,否则报错! --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
5、DubboProvider
1、ProviderServiceImplpackage com.cun.service.impl; import com.cun.service.ProviderService; public class ProviderServiceImpl implements ProviderService{ public String updateString(String s) { // TODO Auto-generated method stub return "linghongcun-"+s+"-larger5"; } }
2、provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用名称,用于计算依赖关系 --> <dubbo:application name="DubboJAR" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://localhost:2181" /> <!-- 使用dubbo协议,在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- service实现类作为本地的一个bean --> <bean id="providerService" class="com.cun.service.impl.ProviderServiceImpl" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.cun.service.ProviderService" ref="providerService" /> </beans>
3、DubboProviderTest
①代码
package com.cun.test; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; public class DobboProviderTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "provider.xml" }); context.start(); System.out.println(" Provider 向 ZooKeeper 注册中心注册了服务(端口:20880)"); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // press any key to exit context.close(); } }
②console
4、DubboProvider pom
<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"> <modelVersion>4.0.0</modelVersion> <groupId>DubboProvider</groupId> <artifactId>DubboProvider</artifactId> <!-- Provider、Consumer 父工程:统一管理版本 --> <parent> <groupId>DubboPOM</groupId> <artifactId>DubboPOM</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <!-- 加入接口依赖,Provider、Consumer 就可以不用写 interface 了 --> <dependency> <groupId>DubboAPI</groupId> <artifactId>DubboAPI</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> </dependency> <!-- zooKeeper 依赖,没了会报错 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </dependency> </dependencies> </project>
三、其他
1、log4j 日志文件
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c:\mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=info, stdout
2、Dubbo 管理中心
① 服务② 提供者
③ 消费者
3、注意事项
① 开启注册中心 zooKeeper4、 Dubbo 集群
这个估计是 Dubbo 最牛x的地方了,特别容易操作① 修改 provider.xml,每修改一次,就运行一次 DubboProviderTest,就会开一另一个端口的服务,
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="dubbo" port="20881" />
<dubbo:protocol name="dubbo" port="20882" />
② 查看服务,根据绿色框,可以看到有 3 个端口
20880、20881、20882的服务
③ 设置权重
通过红色边框,设置各个服务端口的权重,可以通过服务器的配置,做出合理的配置(权重越高,则服务频率越高)
相关文章推荐
- Dubbo+Zookeeper实现分布式服务和负载均衡
- 使用zookeeper实现集群和负载均衡
- 使用zookeeper实现集群和负载均衡
- 使用zookeeper实现集群和负载均衡
- 使用zookeeper实现集群和负载均衡
- Dubbo+Zookeeper实现分布式服务和负载均衡
- Dubbo+Zookeeper实现分布式服务和负载均衡
- 使用zookeeper实现集群和负载均衡
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- 使用 ZooKeeper 实现分布式锁
- 使用zookeeper实现服务路由和负载均衡
- ZooKeeper伪分布式集群安装及使用
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
- (转)ZooKeeper伪分布式集群安装及使用
- ZooKeeper伪分布式集群安装及使用
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
- ZooKeeper伪分布式集群安装及使用
- 使用zookeeper实现服务路由和负载均衡
- 使用redis实现分布式锁,可以解决集群中需要单例的情况
- 使用Apache通过JK实现多Tomcat负载均衡集群时,Apache不能将请求分发给Tomcat处理(即Apache反向代理不成功)的问题