一、调用关系说明
0. 服务容器负责启动、加载、运行服务提供者
1. 服务提供者在启动时,向注册中心注册自己提供的服务
2. 服务消费者在启动时,向注册中心订阅自己所需的服务
3. 注册中心返回服务提供者地址列表给消费者,如有变更,注册中心将基于长连接推送变更数据给消费者
4. 服务消费者从提供者地址列表中,基于软负载均衡算法选一台提供者进行调用,如果调用失败则再选一台调用
5. 服务提供者和消费者,在内存中累计调用次数和调用时间,定时每分钟向监控中心发送统计数据
二、Multicast注册中心简单整合springboot+dubbo
0. 项目总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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>springboot-dubbo-api</module>
<module>springboot-dubbo-provider</module>
<module>springboot-dubbo-consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.ambition</groupId>
<artifactId>springboot-dubbo-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<dubbo.version>2.7.3</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
1. api模块 提供interface给provider实现以及给consumer引用
package cn.ambition.api.service;
import cn.ambition.api.dto.UserInfoDTO;
import java.rmi.RemoteException;
public interface UserService {
/**
* 查询用户信息
* @param id
* @return
* @throws RemoteException
*/
UserInfoDTO getUserInfo(Integer id) throws RemoteException;
}
2. provider 实现接口,并提供服务
<dependencies>
<dependency>
<groupId>cn.ambition</groupId>
<artifactId>springboot-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
package cn.ambition.provider.service;
import cn.ambition.api.dto.UserInfoDTO;
import cn.ambition.api.service.UserService;
import org.apache.dubbo.config.annotation.Service;
import java.rmi.RemoteException;
// 注意这个service引用的是dubbo下的
@Service(version = "1.0")
public class UserServiceImpl implements UserService {
/**
* 查询用户信息
*
* @param id
* @return
* @throws RemoteException
*/
@Override
public UserInfoDTO getUserInfo(Integer id) throws RemoteException {
System.out.println("服务提供方收到请求,查询参数---->" + id);
UserInfoDTO userInfoDTO = new UserInfoDTO();
userInfoDTO.setId(id);
userInfoDTO.setUserName("HHHHHH");
return userInfoDTO;
}
}
server:
port: 8001
## dubbo 配置
dubbo:
application:
name: dubbo-provider
## 注册地址,这里使用的是广播的方式
registry:
address: multicast://224.5.6.7:1234
## 协议
protocol:
name: dubbo
port: 20880
## 使用扫描包的方式批量注册,对应的@Service注解是dubbo包下的注解不要引用错了
scan:
base-packages: cn.ambition.provider.service
3. consumer通过dubbo注入远程bean,远程调用服务
<dependencies>
<dependency>
<groupId>cn.ambition</groupId>
<artifactId>springboot-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
package cn.ambition.consumer.controller;
import cn.ambition.api.dto.UserInfoDTO;
import cn.ambition.api.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.rmi.RemoteException;
@RestController
public class UserController {
@Reference(version = "1.0", parameters = {"unicast","false"})
private UserService userService;
@GetMapping("/userInfo/{id}")
public UserInfoDTO getUserInfo(@PathVariable Integer id) throws RemoteException {
return userService.getUserInfo(id);
}
}
server:
port: 8002
dubbo:
application:
name: dubbo-consumer
registry:
address: multicast://224.5.6.7:1234
三、zookeeper
https://dubbo.apache.org/zh/docs/references/registry/zookeeper/
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。
流程说明:
服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址
服务消费者启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
监控中心启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。
支持以下功能:
当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
当注册中心重启时,能自动恢复注册数据,以及订阅请求
当会话过期时,能自动恢复注册数据,以及订阅请求
当设置 <dubbo:registry check=“false” /> 时,记录失败注册和订阅请求,后台定时重试
可通过 <dubbo:registry username=“admin” password=“1234” /> 设置 zookeeper 登录信息
可通过 <dubbo:registry group=“dubbo” /> 设置 zookeeper 的根节点,不配置将使用默认的根节点。
支持 * 号通配符 <dubbo:reference group=“" version="” />,可订阅服务的所有分组和所有版本的提供者
1. 安装步骤
- 下载安装包
[root@VM-8-2-centos bin]# wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
- 解压
[root@VM-8-2-centos bin]# tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
- 修改配置文件,创建文件夹 data和log
[root@VM-8-2-centos bin]# mv zoo_sample.cfg zoo.cfg
- 启动
[root@VM-8-2-centos bin]# ./zkServer.sh start
2. 新增依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
3. 修改provider和consumer的注册地址
dubbo:
application:
registry:
address: zookeeper://xxx.xxx.xxx.xxx:2181
4. 在zkcli中查看
[zk: localhost:2181(CONNECTED) 6] ls /dubbo/
Path must not end with / character
[zk: localhost:2181(CONNECTED) 7] ls /dubbo
[cn.ambition.api.service.UserService]
[zk: localhost:2181(CONNECTED) 8] ls /dubbo/cn.ambition.api.service.UserService
[configurators, consumers, providers, routers]
[zk: localhost:2181(CONNECTED) 9] ls /dubbo/cn.ambition.api.service.UserService/providers
5. 集群模式
- 解压一份zk到新建的目录zk1
[root@VM-8-2-centos data]# mkdir zk1
[root@VM-8-2-centos data]# tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C zk1
- 同样创建data和log文件夹,在data文件中写入文件 myid ,写个1
[root@VM-8-2-centos data]# vim myid
- 修改配置文件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=/home/zookeeper/zk1/apache-zookeeper-3.6.3-bin/data
logDir=/home/zookeeper/zk1/apache-zookeeper-3.6.3-bin/log
# 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
#server.1 中的1 是myid中写的值,2888 2889 2890用于集群内部通讯,3888 3889 3890 用于选举leader
server.1=10.0.8.2:2888:3888
server.2=10.0.8.2:2889:3889
server.3=10.0.8.2:2890:3890
- 复制两份
[root@VM-8-2-centos zookeeper]# cp -Rf zk1/ zk2
[root@VM-8-2-centos zookeeper]# cp -Rf zk1/ zk3
- 分别修改myid、dataDir、logDir和端口号
- 启动三个服务
[root@VM-8-2-centos conf]# cd /home/zookeeper/
Using config: /home/zookeeper/zk1/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@VM-8-2-centos zookeeper]# ./zk2/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zk2/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@VM-8-2-centos zookeeper]# ./zk3/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zk3/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 查看三个服务各自的状态
[root@VM-8-2-centos zookeeper]# ./zk1/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zk1/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@VM-8-2-centos zookeeper]# ./zk2/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zk2/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader
[root@VM-8-2-centos zookeeper]# ./zk3/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zk3/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: follower
- 修改application.yml配置
dubbo:
registry:
address: zookeeper://175.178.174.201:2182?backup=175.178.174.201:2181,175.178.174.201:2183