同样的这篇文章很大程度上参考了下面这篇文章:

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的自动注入导致的,如果不同则需要手动配置references。


启动类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文件:

下载地址

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐