启动步骤:
- 启动 zookeeper 的 zkServicer.cmd 服务
- 进入dubbo下的 dubbo-admin-distribution/target 文件夹,启动cmd
- 输入 java -jar dubbo-admin-0.3.0-SNAPSHOT.jar
- 访问
http://localhost:8080
详情参考:dubbo admin
1、创建一个空的项目
2、在项目中创建三个 maven module:common、provider、consumer
注意:实体类必须实现 Serializable 接口
3、在common中创建需要的公共类,完成之后,执行maven的install,将common打包并部署到本地maven仓库
注意:如果更新了common包中的代码,只需要重新 install,便会自动更新
4、编写provider中的代码
- 先导入相关的依赖
<!--将common的jar包导入provider的maven中,方便引用-->
<dependency>
<groupId>com.test.SDZ</groupId>
<artifactId>mall-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--将服务注册到注册中心,需要导入dubbo依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 导入操作注册中心zookeeper的客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
- 编写xml文件,将服务注册到zookeeper中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 当前应用的名字-->
<dubbo:application name="mall-Provider"></dubbo:application>
<!-- 指定注册中心的地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" protocol="zookeeper" timeout="20000" />
<!-- 使用dubbo协议,将服务暴露在20880端口-->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 指定需要暴露的服务-->
<dubbo:service interface="service.UserService" ref="userService"/>
<bean name="userService" class="service.UserServiceImpl"></bean>
</beans>
- 编写测试类,实际注册服务上去
public class Provider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"provider.xml");
context.start();//启动服务
System.in.read();//阻塞
}
}
//运行之后就能在admin中看到服务被注册了
5、编写consumer中的代码
- 先导入相关依赖
<?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>
<groupId>com.test.SDZ</groupId>
<artifactId>mall-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.test.SDZ</groupId>
<artifactId>mall-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--将服务注册到注册中心,需要导入dubbo依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 导入操作注册中心zookeeper的客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
- 编写xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 为了使注解生效,所以需要开启包扫描-->
<context:component-scan base-package="service.Impl"></context:component-scan>
<!--设置应用名称-->
<dubbo:application name="mall-Consumer"></dubbo:application>
<!-- 指定注册中心地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--生成远程服务UserService的代理,可以和本地一样调用service-->
<!-- userService在容器里面,所以可以直接用spring注解注入-->
<dubbo:reference interface="service.UserService" id="userService" ></dubbo:reference>
<bean name="orderService" class="service.Impl.OrderServiceImpl"></bean>
</beans>
- 编写实现类
- 编写测试类
package Consumer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.OrderService;
import java.io.IOException;
/**
* @author:liuliping
* @date:2021/7/28 13:53
*/
public class consumer {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"consumer.xml");
OrderService orderService = context.getBean(OrderService.class);
//实现输出结果,说明远程调用实现
orderService.initOrder("1");
System.out.println("调用完成.....");
System.in.read();
}
}
6、可能出现的问题
- 报错序列化,被传输的实体类必须实现 Serializable 接口
- 提示bean不存在,说明无法调用注册的服务,重新打开zookeeper、admin、注册服务。再试。
SpringBoot+Dubbo+zookeeper服务注册发现实战
参考:https://www.cnblogs.com/ckfuture/p/14401670.html
1、创建一个空的项目
2、创建 spring initial 项目勾选 web 结构 的 provider和 consumer两个模块
3、provider模块
- 编写提供者服务,TicketService
- 实现service
- 导入依赖
<!-- dubbo的依赖-->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- zookeeper的依赖-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/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>
</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>
- 配置application.properties
server.port=8001
#服务应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服务要被注册
dubbo.scan.base-packages=com.sommer.demo.service
4、打开 zkService.cmd、zkCli.cmd、启动dubbo.admin
5、运行 provider的启动类,在admin中可以看到注册的服务
6、consumer模块中
- 设置service类,UserService,获取ticket
@Service//将服务注册Bean容器中
public class UserService {
@Reference//表示使用注册中的服务,但是在本地会报错,所以在相同的路径下,要新建一样的接口
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到一张票"+ticket);
}
}
- 导入依赖
- 配置 application.properties
server.port=8002
#消费者去哪里获取服务,需要暴露自己的名字,
# 否则注册中心不知道谁要服务
dubbo.application.name=consumer-server
#注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
总结:
步骤:
前提:zookeeper服务要开启
1.提供者提供服务
1).导入依赖
2).配置注册中心的地址,以及服务发现名,和要扫描的包
3).在想要被注册的服务上面增加一个注解@Service
2.消费者如何消费
1).导入依赖
2).配置注册中心的地址,配置自己的服务名
3).从远程注入服务 @Reference