概述
首先声明,本文是学习总结类型的博客内容,如有雷同纯属学习。本位主要结合zookeeper和dubbo做个简单实例。目前来说,一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程。
其次,当服务越来越多之后,我们需要做哪些服务治理?
Dubbo主要处理服务,约束服务提供者和消费者之间的关系。Dubbo处理消费者、提供者以及注册的关系如下:
Zookeeper使用
ZooKeeper 虽然是一个针对分布式系统的协调服务,但它本身也是一个分布式应用程序。ZooKeeper 遵循一个简单的客户端-服务器模型,其中客户端 是使用服务的节点(即机器),而服务器 是提供服务的节点。ZooKeeper 服务器的集合形成了一个 ZooKeeper 集合体(ensemble),这里简单记录Zookeeper使用;
下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper 下载之后,解压发现里面有双击zkServer.cmd(Window双击即可,Linux则需要zkServer.sh)启动zookeeper。默认打开是2181端口,双击zkCli.cmd(Window环境下)启动客户端测试下服务端。在客户端可以输入常用的zookeeper指令:
1、显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容 2、显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据 3、创建文件,并设置初始内容 create [-s] [-e] path data acl 其中-s或-e分别指定节点特性,顺序或临时节点,若不指定,则表示持久节点;acl用来进行权限控制。举例使用如下: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串 4、获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串 5、修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置 6、删除文件: delete /zk 将刚才创建的 znode 删除 7、退出客户端: quit 8、帮助命令: help
当然也可以通过,客户端管理软件查询当前zookeeper的使用情况。下载:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip ;解压缩后点击ZooInspector\build\zookeeper-dev-ZooInspector.jar 点击左上角的绿色按钮,输入ZK Server的地址和端口,连接成功后就能看到ZK的节点数据信息。
代码编写
Parent编码
定义Parent公用项目,里面的pom.xml内容如下
<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>com.justin</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>parent</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <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> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
定义公用的实体
package com.justin.dubbo.domain; import java.io.Serializable; public class City implements Serializable { private static final long serialVersionUID = -1L; /** * 城市编号 */ private Long id; /** * 省份编号 */ private Long provinceId; /** * 城市名称 */ private String cityName; /** * 描述 */ private String description; public City() { } public City(Long id, Long provinceId, String cityName, String description) { this.id = id; this.provinceId = provinceId; this.cityName = cityName; this.description = description; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getProvinceId() { return provinceId; } public void setProvinceId(Long provinceId) { this.provinceId = provinceId; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return "City{" + "id=" + id + ", provinceId=" + provinceId + ", cityName=‘" + cityName + ‘\‘‘ + ", description=‘" + description + ‘\‘‘ + ‘}‘; } }
定义公用的接口
package com.justin.dubbo.service; import com.justin.dubbo.domain.City; public interface CityService { public City findCityByName(String cityname); }
Provider服务提供者代码
实现公用接口
package com.justin.dubbo.serviceimpl; import com.justin.dubbo.domain.City; import com.justin.dubbo.service.CityService; import com.alibaba.dubbo.config.annotation.Service; @Service(version = "1.0.0") public class CityServiceImpl implements CityService { public City findCityByName(String cityname) { return new City(1L,2L,"温岭","是我的故乡"); } }
主程序
@SpringBootApplication public class App { public static void main( String[] args ) { System.out.println( "Hello World!Start Service......" ); SpringApplication.run(App.class); } }
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=com.justin.dubbo.serviceimplCus服务提供者代码
Customer消费者调用服务代码
调用服务代码项
import com.alibaba.dubbo.config.annotation.Reference; import com.justin.dubbo.MyCityService.MyServiceCity; import com.justin.dubbo.domain.City; import com.justin.dubbo.service.CityService; import org.springframework.stereotype.Component; @Component public class CityServiceImpl implements MyServiceCity { @Reference(version = "1.0.0")//调用服务项 private CityService cityService; @Override public void printCity() { String cityName="温岭"; City city=cityService.findCityByName(cityName); System.out.println(city.toString()); } }
主程序
import com.justin.dubbo.MyCityService.MyServiceCity; import com.justin.dubbo.serviceimpl.CityServiceImpl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /** * Hello world! * */ @SpringBootApplication public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); ConfigurableApplicationContext run= SpringApplication.run(App.class,args); MyServiceCity cityService = run.getBean(CityServiceImpl.class); cityService.printCity(); } }
配置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=com.justin.dubbo.service
参考文章
Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
实例源码: DEMO下载