概述
開發環境
- JDK8
- Apache Maven 3.8.1
- spring-boot 2.5.3
- dubbo-spring-boot 2.7.13
- apache-zookeeper-3.7.0
什么是dubbo
Apache Dubbo 是一款高性能、輕量級的開源微服務開發框架,它提供了
RPC通信與微服務治理兩大關鍵能力,
dubbo的六大核心能力
- 面向介面代理的高性能RPC呼叫
提供高性能的基于代理的遠程呼叫能力,服務以介面為粒度,為開發者屏蔽遠程呼叫底層細節,
- 智能容錯和負載均衡
置多種負載均衡策略,智能感知下游節點健康狀況,顯著減少呼叫延遲,提高系統吞吐量,
- 服務自動注冊和發現
支持多種注冊中心服務,服務實體上下線實時感知,
- 高度可擴展能力
遵循微內核+插件的設計原則,所有核心能力如Protocol、Transport、Serialization被設計為擴展點,平等對待內置實作和第三方實作,
- 運行期流量調度
內置條件、腳本等路由策略,通過配置不同的路由規則,輕松實作灰度發布,同機房優先等功能,
- 可視化的服務治理與運維
提供豐富服務治理、運維工具:隨時查詢服務元資料、服務健康狀態及呼叫統計,實時下發路由策略、調整配置引數,
概念和架構
實作服務發現的方式有很多種,Dubbo 提供的是一種 Client-Based 的服務發現機制,通常還需要部署額外的第三方注冊中心組件來協調服務發現程序,如常用的 Nacos、Consul、Zookeeper 等,Dubbo 自身也提供了對多種注冊中心組件的對接,用戶可以靈活選擇,
搭建zookeeper和dubbo-admin環境
1、下載
去官網下載zookeeper 和dubbo-admin,然后解壓,dubbo-admin只是一個監控dubbo服務的平臺,不是必須的,
2、修改zookeeper的組態檔,
拷貝zookeeper目錄下的conf檔案夾下的zoo_sample.cfg,取名zoo.cfg,打開zoo.cfg檔案并修改,
zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=C:/app/apache-zookeeper-3.7.0-bin/mylog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
#解決zookeeper啟動占用了8080埠
admin.serverPort=8888
3、執行命令
命令列視窗以管理員身份執行zookeeper安裝目錄下的bin檔案夾中的命令先后執行zkServer.cmd和zkCli.cmd,zkServer.cmd打開的視窗不要關閉,其是整個zk服務,

4、打包dubbo-admin并運行
解壓dubbo-admin,在dubbo-admin解壓目錄下打開命令列視窗執行,然后默默等待執行完畢,
mvn clean -U -Dmaven.test.skip=true package
打包完畢以后,我們找到target目錄下的jar包,命令列視窗下執行java -jar jar包全名,即可運行dubbo-admin服務了,訪問
http://localhost:8080
用戶名和密碼:root root


在dubbo-admin-server目錄下可以查看到關于zookeeper的配置以及默認登錄賬號密碼的配置,

5、SpringBoot+Zookeeper+Dubbo整合
通過構建一個買票服務來演示,示例工程中對于RPC介面沒有單獨打成jar包參考,而是在consumer模塊和provider模塊各寫了一份,
新建工程
在idea中新建一個Empty Project

建立生產者和消費者模塊
在空工程下分別建立spring boot工程consumer模塊和provider模塊,同時洗掉模塊下多余的檔案,

consumer模塊檔案新建和修改
按照如圖所示結構建立

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tgy</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入dubbo依賴-->
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<!-- <version>2.7.3</version>-->
<version>2.7.13</version>
</dependency>
<!--引入zkclient依賴-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<!-- <version>2.12.0</version>-->
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<!-- <version>2.12.0</version>-->
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<!-- <version>3.4.14</version>-->
<version>3.7.0</version>
<!--排除這個slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
#當前應用的名字
dubbo.application.name=my-consumer
#當前應用的埠
server.port=9092
#注冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
TicketService.java
package com.tgy.service;
/**
* RPC介面
* @author tgyman
*/
public interface TicketService {
String getTicket();
}
UserService .java
package com.tgy.service;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
/**
* 消費者的服務類
*/
@Service
public class UserService {
/**
* 遠程參考指定的服務
*/
@DubboReference
TicketService ticketService;
public String buyTicket(){
return ticketService.getTicket();
}
}
TicketController.java
package com.tgy.controller;
import com.tgy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 購票服務
*/
@Controller
@RequestMapping("ticket")
public class TicketController {
@Autowired
UserService userService;
@RequestMapping("buy")
@ResponseBody
public String buy(){
String ticket = userService.buyTicket();
return ticket;
}
}
provider模塊檔案和修改
如下圖所示

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tgy</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入dubbo依賴-->
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<!-- <version>2.7.3</version>-->
<version>2.7.13</version>
</dependency>
<!--引入zkclient依賴-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<!-- <version>2.12.0</version>-->
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<!-- <version>2.12.0</version>-->
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<!-- <version>3.4.14</version>-->
<version>3.7.0</version>
<!--排除這個slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
#當前應用的名字
dubbo.application.name=my-provider
#當前應用的埠
server.port=8092
#注冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#掃描指定包下的服務
dubbo.scan.base-packages=com.tgy.service
TicketService.java
package com.tgy.service;
/**
* RPC介面
* @author tgyman
*/
public interface TicketService {
String getTicket();
}
TicketServiceImpl.java
package com.tgy.service;
//一定要匯入的是dubbo中的service
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
//import org.springframework.stereotype.Service;
@Service
@Component
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "在12306網站購買了10張票";
}
}
訪問
在zookeeper、dubbo-admin都已啟動的情況下,先后啟動provider模塊和consumer模塊,訪問
http://localhost:9092/ticket/buy
即可查看結果,

同時在dubbo-admin我們可以看到注冊的provider服務,

參考
dubbo官網
zookeeper-3.7.0下載地址
dubbo-admin master分支github下載
狂神說Java-SpringBoot最新教程IDEA版通俗易懂
筆記中示例代碼gitee地址
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294152.html
標籤:其他
上一篇:關于ELK日志分析系統
下一篇:Flink(四) 狀態管理 1

