一、dubbo-hello
1、提出需求
某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;
我们现在 需要创建两个服务模块进行测试
模块 | 功能 |
---|---|
订单服务web模块 | 创建订单等 |
用户服务service模块 | 查询用户地址等 |
测试预期结果:
订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。
2、工程架构
建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
这时候服务提供层和服务消费层,必须导入接口依赖,才能使用接口方法和Bean:
在两者 pom.xml 文件中:
<dependencies>
<dependency>
<groupId>com.xiaojian.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3、使用 dubbo 改造
1、将服务提供者注册到注册中心(暴露服务)
(1)、导入dubbo依赖(2.6.2)与 操作 zookeeper 的客户端
<!-- 引入dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper
dubbo 2.6以前的版本引入zkclient操作zookeeper
dubbo 2.6及以后的版本引入curator操作zookeeper
下面两个zk客户端根据dubbo版本2选1即可
-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- curator-framework (选)-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
(2)、配置服务提供者
<!-- provider.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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务重名) -->
<dubbo:application name="user-service-provider"></dubbo:application>
<!-- 2、指定注册中心的地址-->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> 或-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!-- 3、指定通信规则(通信协议?通信端口)-->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
<!-- 4、暴露服务接口,ref:指向真正实现对象-->
<dubbo:service interface="com.xiaojian.gmall.service.UserService" ref="userServiceImpl"></dubbo:service>
<!-- 5、服务的实现-->
<bean id="userServiceImpl" class="com.xiaojian.gmall.service.impl.UserServiceImpl"></bean>
</beans>
(3)、启动服务(之前的 zkServer.cmd,和dubbo-admin都要开着)
// MainApplication.java
public class MainApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
ioc.start();
System.in.read();
}
}
(4)、测试
localhost:7001,刷新
2、让服务消费者去注册中心订阅服务提供者的服务地址
(1)、导入dubbo依赖(2.6.2)与 操作 zookeeper 的客户端
<!-- 引入dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper
dubbo 2.6以前的版本引入zkclient操作zookeeper
dubbo 2.6及以后的版本引入curator操作zookeeper
下面两个zk客户端根据dubbo版本2选1即可
-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- curator-framework(选) -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
(2)、配置服务消费者
<!-- consumer.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://dubbo.apache.org/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-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描注解-->
<context:component-scan base-package="com.xiaojian.gmall.service.impl"></context:component-scan>
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="user-service-provider"></dubbo:application>
<!-- 2、使用zookeeper注册中心暴露发现服务地址 -->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!-- 3、使用远程服务代理的接口,可以和本地bean一样使用userService -->
<dubbo:reference id="userService" interface="com.xiaojian.gmall.service.UserService" />
</beans>
(3)、启动服务(服务提供者要在启动中状态)
// MainApplication.java
public class MainApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("consumer.xml");
OrderService orderService = ioc.getBean(OrderService.class);
orderService.initOrder("1");
System.out.println("调用完成!");
System.in.read();
}
}
二、监控中心
dubbo-admin
图形化的服务管理页面;安装时需要指定注册中心地址,即可从注册中心中获取到所有的提供者/消费者进行配置管理
dubbo-monitor-simple
简单的监控中心;
1、安装
1、在文件路径 …\dubbo-admin-master\dubbo-admin-master\dubbo-monitor-simple,进入cmd控制台,使用命令行 mvn package 打包;
2、在打包好的 target 文件夹里,解压 dubbo-monitor-simple-2.0.0-assembly.tar.gz后,进入该文件夹/conf;
3、修改配置:(默认不用修改)
dubbo.container=log4j,spring,registry,jetty-monitor
dubbo.application.name=simple-monitor
dubbo.application.owner=dubbo
#dubbo.registry.address=multicast://224.5.6.7:1234
dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
dubbo.protocol.port=7070
dubbo.jetty.port=8080
dubbo.jetty.directory=${user.home}/monitor
dubbo.charts.directory=${user.home}/monitor/charts
dubbo.statistics.directory=${user.home}/monitor/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN
4、启动,/assembly.bin/start.bat。(zookeeper注册中心得启动,dubbo-admin得启动)
访问:localhost:8080
2、监控中心配置
<!-- consumer.xml、provider.xml -->
<!-- 连接监控中心-->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!-- 或 <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>-->
再次启动服务提供者和服务消费者,监控中心:
三、整合 Spring Boot
与 dubbo-hello 需求相同,创建服务提供者和服务消费者两个Spring Boot项目;两个项目中的内容同 dubbo-hello。
1、导入依赖
dubbo-spring-boot-starter,包括了dubbo2.6.2,zookeeper,curator-framework
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
2、配置 application.properties
# 提供者配置
dubbo.application.name=user-service-provider
dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.monitor.protocol=registry
# 暴露服务用dubbo的@Service注解代替,并在主程序类配置@EnableDubbo
# 消费者配置
dubbo.application.name=boot-order-service-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.monitor.protocol=registry
# 使用远程服务器(提供者)提供的接口,在使用到的接口上使用@Reference注解
3、dubbo注解
- @Service (dubbo的),配置在服务接口实现类上,暴露服务;(提供者)
- @Reference,使用远程服务器(提供者)提供的接口;(消费者)
- @EnableDubbo,配置在主程序类上;(两者都要加载主程序类上)
4、使用业务
@Controller
public class OrderController {
@Autowired
OrderService orderService;
@ResponseBody
@RequestMapping("/initOrder")
public List<UserAddress> initOrder(@RequestParam("uid")String userId){
return orderService.initOrder(userId);
}
}
5、测试
因为目前,monitor占用的8080端口,所以我们将消费者服务器端口号改为8081
启动,提供者、消费者,访问 http://localhost:7001/
访问 http://localhost:8081/initOrder?uid=1,得到:
[
{
"id":1,
"userAddress":"北京市昌平区宏福科技园综合楼3层",
"userId":"1","consignee":"李老师",
"phoneNum":"010-56253825",
"isDefault":"Y"
},
{
"id":2,
"userAddress":"深圳市宝安区西部硅谷大厦B座3层(深圳分校)",
"userId":"1",
"consignee":"王老师",
"phoneNum":"010-56253825",
"isDefault":"N"
}
]