概述html
首先聲明,本文是學習總結類型的博客內容,若有雷同純屬學習。本位主要結合zookeeper和dubbo作個簡單實例。目前來講,通常網站架構隨着業務的發展,邏輯愈來愈複雜,數據量愈來愈大,交互愈來愈多以後的常規方案演進歷程。java
其次,當服務愈來愈多以後,咱們須要作哪些服務治理?node
Dubbo主要處理服務,約束服務提供者和消費者之間的關係。Dubbo處理消費者、提供者以及註冊的關係以下:web
Zookeeper使用spring
ZooKeeper 雖然是一個針對分佈式系統的協調服務,但它自己也是一個分佈式應用程序。ZooKeeper 遵循一個簡單的客戶端-服務器模型,其中客戶端 是使用服務的節點(即機器),而服務器 是提供服務的節點。ZooKeeper 服務器的集合造成了一個 ZooKeeper 集合體(ensemble),這裏簡單記錄Zookeeper使用;apache
下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper 下載以後,解壓發現裏面有雙擊zkServer.cmd(Window雙擊便可,Linux則須要zkServer.sh)啓動zookeeper。默認打開是2181端口,雙擊zkCli.cmd(Window環境下)啓動客戶端測試下服務端。在客戶端能夠輸入經常使用的zookeeper指令:springboot
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編碼app
定義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下載