分布式Dubbo+zookeeper+SpringBoot
服务发现
服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对端部署位置与 IP 地址的情况下实现通信。
实现服务发现的方式有很多种,Dubbo 提供的是一种 Client-Based 的服务发现机制,通常还需要部署额外的第三方注册中心组件来协调服务发现过程,如常用的 Nacos、Consul、Zookeeper 等,Dubbo 自身也提供了对多种注册中心组件的对接,用户可以灵活选择。
Dubbo 基于消费端的自动服务发现能力,其基本工作原理如下图:
服务发现的一个核心组件是注册中心,Provider 注册地址到注册中心,Consumer 从注册中心读取和订阅 Provider 地址列表
注册中心推荐zookeeper
下载链接:在3.5.5版本后,官方提供了bin的包,可以不需要配置环境,直接上手查看
http://mirror.bit.edu.cn/apache/zookeeper/
之后以管理员方式启动bin文件夹中的cmd文件
会报错,我们需要吧conf里的,zoo_simple复制一份,改成zoo.cof
dubbo-admin
下载地址:GitHub - apache/dubbo-admin at master-0.2.0
选择master 0.2.0分支
进入E:\Study\Java\tools\dubbo-admin-master-0.2.0\dubbo-admin\src\main\resources
端口号默认 2181
如需修改这里也要修改
之后我们用cmd打开 E:\Study\Java\tools\dubbo-admin-master-0.2.0\dubbo-admin,
输入mvn clean package -Dmaven.test.skip=true
,打成jar包
时间会有点久
切记
要先启动zookeeper server,再运行jar包
访问 http://localhost:7001/
用户名和密码都是 root
zookeeper:注册中心
dubbo-admin:是一个监控管理后台
Dubbo :jar包
服务注册发现实战
创建两个项目
provider 提供者
consumer 消费者
配置:privoder 端口配置为8081 custom 端口配置为 8082
先创建provider项目
1、导入依赖(如果使用高版本的会报错,降低版本再试)
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.12</version>
</dependency>
<!--zkclient,zookeeper客户端-->
<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>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2、配置properties
server.port=8001
# 服务应用名字
dubbo.application.name=provider_server
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 那些服务要被注册
dubbo.scan.base-packages=com.xsq.service
写业务代码
public interface TickerService {
public String ticket();
}
//zookeeper: 服务注册与发现
@DubboService //在项目一启动就注册到注册中心
@Component //为什么不加service注解,应为dubbo的注册service,用于区分
public class TickerServiceImpl implements TickerService{
@Override
public String ticket() {
return "《java从基础到入门》";
}
}
要在主类上加 @EnableDubbo
@EnableDubbo
@SpringBootApplication
public class ProviderServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServerApplication.class, args);
}
}
先启动zookeeper --> 在启动Dubbo-jar包 --> 最后启动服务 访问 localhost:7001/- ->前往注册中心查看服务
可以查看这个服务的详细信息
想拿到票,需要调用远程服务,拿到我们服务之者的方法,要去注册中心拿服务
我们先要配置的custom的配置,一样需要导入相关依赖(同provider的依赖一样)。
编写配置文件:
server.port=8002
# 消费者从哪里拿 需要暴露自己的名字
dubbo.application.name=consumer_server
# 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
之后我们需要调用本地的 @Autowired
是从spring容器中本地调用,我们这里远程调用@DubboReference
package com.xsq.service;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service; //注意使用的spring的@Service
@Service //放到容器中
public class UserService {
//想拿到provider_server提供的票,要去注册中心拿
@DubboReference//引用 方法一:Pom坐标 方法二:可以定义路径相同的接口名
TickerService tickerService;
public void buyTicket(){
String ticket = tickerService.ticket();
System.out.println("在注册中心拿到=>"+ticket);
}
}
//要路径相同的接口名
package com.xsq.service;
public interface TickerService {
public String ticket();
}
测试
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
从注册中心拿到了
步骤:
-
提供者服务
- 导入依赖
- 配置文件,注册中心地址,服务发现名和要扫描的服务
- 想要被注册的服务上加上dubbo的service(@DubboService)注解和spring的
@Compent
组件
-
消费者如何消费
-
导入依赖
-
配置文件,服务发现名,注册中心地址
-
我们需要在客户端建立一个一样的服务者接口,直接远程注入就可以使用这个服务的方法了,
远程调用注解
@DubboReference
-
到这里简单的服务注册与发现的使用就完成啦,
er: 服务注册与发现
@DubboService //在项目一启动就注册到注册中心
@Component //为什么不加service注解,应为dubbo的注册service,用于区分
public class TickerServiceImpl implements TickerService{
@Override
public String ticket() {
return “《java从基础到入门》”;
}
}
要在主类上加 @EnableDubbo
```java
@EnableDubbo
@SpringBootApplication
public class ProviderServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServerApplication.class, args);
}
}
先启动zookeeper --> 在启动Dubbo-jar包 --> 最后启动服务 访问 localhost:7001/- ->前往注册中心查看服务
[外链图片转存中…(img-YHjixKHF-1644400991628)]
可以查看这个服务的详细信息
[外链图片转存中…(img-rEJnXwZy-1644400991628)]
想拿到票,需要调用远程服务,拿到我们服务之者的方法,要去注册中心拿服务
我们先要配置的custom的配置,一样需要导入相关依赖(同provider的依赖一样)。
编写配置文件:
server.port=8002
# 消费者从哪里拿 需要暴露自己的名字
dubbo.application.name=consumer_server
# 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
之后我们需要调用本地的 @Autowired
是从spring容器中本地调用,我们这里远程调用@DubboReference
package com.xsq.service;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service; //注意使用的spring的@Service
@Service //放到容器中
public class UserService {
//想拿到provider_server提供的票,要去注册中心拿
@DubboReference//引用 方法一:Pom坐标 方法二:可以定义路径相同的接口名
TickerService tickerService;
public void buyTicket(){
String ticket = tickerService.ticket();
System.out.println("在注册中心拿到=>"+ticket);
}
}
[外链图片转存中…(img-9BaiOm4v-1644400991629)]
//要路径相同的接口名
package com.xsq.service;
public interface TickerService {
public String ticket();
}
测试
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
从注册中心拿到了
[外链图片转存中…(img-SFV04r9r-1644400991629)]
步骤:
-
提供者服务
- 导入依赖
- 配置文件,注册中心地址,服务发现名和要扫描的服务
- 想要被注册的服务上加上dubbo的service(@DubboService)注解和spring的
@Compent
组件
-
消费者如何消费
-
导入依赖
-
配置文件,服务发现名,注册中心地址
-
我们需要在客户端建立一个一样的服务者接口,直接远程注入就可以使用这个服务的方法了,
远程调用注解
@DubboReference
-
到这里简单的服务注册与发现的使用就完成啦,