您的位置:首页 > 编程语言 > Java开发

Springboot整合Dubbo/ZooKeeper demo

2017-03-28 16:07 831 查看
同样的这篇文章很大程度上参考了下面这篇文章:

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

所以我也是当做转载了。

1、首先是安装与部署zookeeper

下载、解压、修改zoo.cfg、启动。

本demo采用单点模式。

详细内容可以参考下面的文章:

zookeeper 集群安装(单点与分布式成功安装)摘录

2、监控

集群:

推荐使用taokeeper(好吧,其实我也没用过其他什么比较高级的监控工具,这个也并不是那么好用,当然功能还是比较全面的,性能检测也很棒)

具体安装可以参考下面的文章:

ZooKeeper监控

PS:其中第四步在tomcat启动脚本中添加JAVA_OPTS应该是这样的。windows下的。在tomcat的启动文件startup.bat中添加一句:set JAVA_OPTS=-DconfigFilePath="D:\2\taokepper\taokeeper-monitor-config.properties",位置在end和call前面,如下图所示:



单点:

就是之后截图中出现的工具——ZooInspector 。

下载:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip 

运行: 解压缩后点击ZooInspector\build\zookeeper-dev-ZooInspector.jar

点击左上角的绿色按钮,输入ZK Server的地址和端口,连接成功后就能看到ZK的节点数据信息。

如下图所示:



3、最重要的demo

服务者Provider:

pom.xml依赖的jar包:

<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>

<properties>
<dubbo-spring-boot>1.0.0</dubbo-spring-boot>
</properties>

<dependencies>

<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo-spring-boot}</version>
</dependency>

<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>


接下去是项目结构:



接口CityService是我们要注册的服务!

服务的实现类:CityServiceImpl.java:

@Service(version = "1.0.0")
public class CityServiceImpl implements CityService {
@Override
public City findCityByName(String cityname) {
return new City(1L,2L,"温岭","是我的故乡");
}
}


配置文件application.properties:

## Dubbo 服务提供者配置
#应用名称
spring.dubbo.application.name=provider
#注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#协议名称
spring.dubbo.protocol.name=dubbo
#协议端口
spring.dubbo.protocol.port=20880
#服务类包目录
spring.dubbo.scan=dubbodemo.serviceimpl


在这里会惊奇的发现服务类包目录我选择扫描的是serviceimpl这个包,但是运行之后发现注册的服务如下图:



仍然是CityService,这点就要设计Spring对bean这一概念了,这里我就不多赘述了,我想说的是平时impl放在service目录下,然后扫描service包可能会更好理解一点。

但是本例中扫描service包将不会注册服务,究其原因,在于@Service这一注解,当然其中参数不止version,这边我做了最简单的处理。

(另外,domain中的实体类记得序列化。)

之后运行Application.java(默认占用端口8080),当初出现下图内容或者在监控中出现了服务说明注册成功了(记得先运行zookeeper服务端):



监控的图就如上面显示的那样,出现了服务名就行。

消费者Consumer:

依赖同服务者相同。

项目结构如下:



配置文件application.properties:

## 避免和 server 工程端口冲突
server.port=8081

## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=dubbodemo.service


MyCityServiceImpl.java:

@Component
public class MyCityServiceImpl implements MyCityService{
@Reference(version = "1.0.0")
private CityService cityService;

public void printCity() {
String cityName="温岭";
City city = cityService.findCityByName(cityName);
System.out.println(city.toString());
}
}
本例中,服务的作用简单来说,就是远程实例化cityService这个bean,让他调用的方法如同在本地调用一样。所以在配置文件中扫描dubbodemo.service包,其实扫描dubbodemo.serviceimpl也可以,但我不知为什么。。。

两个项目中CityService.java,即注册和消费的服务的类的相对路径必须相同,这是由于Spring的自动注入导致的,如果不同则需要手动配置r
4000
eferences。

启动类Application.java:

@SpringBootApplication
public class Application {

public static void main(String[] args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
ConfigurableApplicationContext run=SpringApplication.run(Application.class,args);
MyCityService cityService = run.getBean(MyCityServiceImpl.class);
cityService.printCity();
}
}
启动之后,发现City{id=1, provinceId=2, cityName='温岭', description='是我的故乡'}这么条输出语句,说明消费了该项服务。

这时候可以看看监控。

当服务者断开后,因为是单点模式,消费者立刻接收到消息:



而当消费者重启之后,监控中可以看到消费记录多了一条(consumers目录下):



当然,由于超时的原因,可能这条记录过一会就消失了。但这也不失为可以监控的一个点~~

有点头昏,感觉写的不是很好,将就下吧。最后附上demo文件:

下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: