您的位置:首页 > 其它

[分布式] 使用 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

① ProviderService

package 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、ProviderServiceImpl

package 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、注意事项

① 开启注册中心 zooKeeper

4、 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
的服务



③ 设置权重

通过红色边框,设置各个服务端口的权重,可以通过服务器的配置,做出合理的配置(权重越高,则服务频率越高)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: