ZooKeeper〖一〗在阿里雲服務器上搭建僞分佈式集羣作爲Dubbo註冊中心
一. 準備工作
- 安裝JDK
- 將Zookeeper上傳到服務器
- 解壓Zookeeper,並創建data目錄,將conf下的zoo_sample.cfg文件改名爲zoo.cfg
- 建立
/user/local/zookeeper-cluster
,將解壓後的Zookeeper複製到以下三個目錄
/usr/local/zookeeper-cluster/zookeeper-1
/usr/local/zookeeper-cluster/zookeeper-2
/usr/local/zookeeper-cluster/zookeeper-3
- 配置每一個 Zookeeper 的 dataDir(zoo.cfg) clientPort 分別爲 2181 2182 2183
修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
clientPort=2181
dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data
修改/usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
clientPort=2182
dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data
修改/usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
clientPort=2183
dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data
二. 配置集羣
-
在每個 zookeeper 的 data 目錄下創建一個 myid 文件,內容分別是 1、2、3 。這個文件就是記錄每個服務器的 ID
-
在每一個 zookeeper 的 zoo.cfg 配置客戶端訪問端口(clientPort)和集羣服務器 IP 列表。
集羣服務器 IP 列表如下
server.1=本機公網IP:2881:3881
server.2=本機公網IP:2882:3882
server.3=本機公網IP:2883:3883
quorumListenOnAllIPs=true
解釋:server.服務器 ID=服務器 IP 地址:服務器之間通信端口:服務器之間投票選舉端口
3.打開阿里雲防火牆對應的端口,或關閉防火牆
三. 啓動集羣
分別進入到每一個zookeeper裏,啓動集羣就是分別啓動每個實例。
啓動
./bin/zkServer.sh start
暫停
./bin/zkServer.sh stop
重啓
./bin/zkServer.sh restart
查看狀態:
./bin/zkServer.sh status
如果出現以下圖片內容,我們的僞分佈式就搭建好了,其實分佈式與僞分佈式步驟一樣的,只不過在三臺服務器上去操作如上步驟改一下IP即可
劃紅線的即是我們在一臺機子上開啓三個zookeeper形成僞分佈式集羣
特別說明一下:必須所有的集羣zookeeper啓動才能查看是否集羣狀態成功與否,不然可能會一直找不到原因(這裏我也遇到排查了好一段時間)
參考了這篇博客搭建的僞分佈式環境參考博客
四. springboot整合Dubbo
1. RPC服務接口
public interface IUserService {
public String sayHello(String name);
}
2. 服務提供者
1)添加依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!--dubbo-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--spring-boot-stater-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>log4j-to-slf4j</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--API-->
<dependency>
<groupId>com.itheima.demo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2)配置文件
# application.properties
spring.application.name=dubbo-demo-provider
spring.dubbo.application.id=dubbo-demo-provider
spring.dubbo.application.name=dubbo-demo-provider
spring.dubbo.registry.address=zookeeper://服務器公網IP:2181;zookeeper://服務器公網IP:2182;zookeeper://服務器公網IP:2183
spring.dubbo.server=true
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
3)啓動類
@EnableDubboConfiguration
@SpringBootApplication
public class ProviderBootstrap {
public static void main(String[] args) throws IOException {
SpringApplication.run(ProviderBootstrap.class,args);
}
}
4)服務實現
@Component
@Service(interfaceClass = IUserService.class)
public class UserServiceImpl implements IUserService{
@Override
public String sayHello(String name) {
return "hello:"+name;
}
}
3. 服務消費者
1)添加依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>log4j-to-slf4j</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--API-->
<dependency>
<groupId>com.itheima.demo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2)配置文件
# application.properties
server.port=8081
spring.application.name=dubbo-demo-consumer
spring.dubbo.application.name=dubbo-demo-consumer
spring.dubbo.application.id=dubbo-demo-consumer
spring.dubbo.registry.address=zookeeper://服務器公網IP:2181;zookeeper://服務器公網IP:2182;zookeeper://服務器公網IP:2183
3)啓動類
@EnableDubboConfiguration
@SpringBootApplication
public class ConsumerBootstrap {
public static void main(String[] args) {
SpringApplication.run(ConsumerBootstrap.class);
}
}
4)Controller
@RestController
@RequestMapping("/user")
public class UserController {
@Reference
private IUserService userService;
@RequestMapping("/sayHello")
public String sayHello(String name){
return userService.sayHello(name);
}
}
四. 調用
我們啓動服務提供者和消費者後,在本地通過RPC方式調用userService的sayHello方法結果如下
下一篇,我會通過整合消息隊列與Dubbo調用方法來實現一個經典的例子~