一、服务提供者
1、创建一个 boot-user-service-provider 的 SpringBoot 工程
2、加入 gmall-interface 依赖
<dependency>
<groupId>com.njf.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
这里对接口进行了修改:
public interface OrderService {
/**
* 初始化订单
* @param userId
*/
List<UserAddress> initOrder(String userId);
}
public interface UserService {
/**
* 按照用户id返回所有的收货地址
* @param userId
* @return
*/
List<UserAddress> getUserAddressList(String userId);
}
3、提供 UserService 服务
@Component
public class UserServiceImpl implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
return Arrays.asList(address1, address2);
}
}
二、服务消费者
1、创建一个 boot-order-service-consumer 的 SpringBoot 工程
2、加入 gmall-interface 依赖
<dependency>
<groupId>com.njf.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
3、准备调用 UserService 进行消费
三、SpringBoot 整合 Dubbo
1、整合服务提供者
(1)引入 spring-boot-starter 以及 dubbo 和 curator 的依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
注意 starter 版本适配:
(2)在 application.properties 中配置提供者
dubbo.application.name=boot-order-service-consumer
dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20882
dubbo.monitor.protocol=registry
属性说明:
- application.name 就是服务名,不能跟别的 dubbo 提供端重复
- registry.protocol 是指定注册中心协议
- registry.address 是注册中心的地址加端口号
- protocol.name 是分布式固定是 dubbo,不要改。
- base-package 注解方式要扫描的包
(3)使用 dubbo 中的 @Service 暴露服务
@Component
@Service
public class UserServiceImpl implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
return Arrays.asList(address1, address2);
}
}
(4)开启基于注解的 Dubbo 功能
@EnableDubbo
@SpringBootApplication
public class BootUserServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootUserServiceProviderApplication.class, args);
}
}
2、整合服务消费者
(1)引入 spring-boot-starter 以及 dubbo 和 curator 的依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
(2)在 application.properties 中配置消费者
dubbo.application.name=boot-order-service-consumer
dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181
dubbo.monitor.protocol=registry
(3)使用 dubbo 中的 @Reference 注解引用服务
@Service
public class OrderServiceImpl implements OrderService {
@Reference
UserService userService;
@Override
public List<UserAddress> initOrder(String userId) {
System.out.println("用户ID:" + userId);
//1.查询用户的收货地址
List<UserAddress> userAddressList = userService.getUserAddressList(userId);
System.out.println("userAddressList = " + userAddressList);
userAddressList.forEach(t -> System.out.println(t.getUserAddress()));
System.out.println("调用完成!");
return userAddressList;
}
}
(4)开启基于注解的 Dubbo 功能
@EnableDubbo //开启基于注解的 dubbo 功能
@SpringBootApplication
public class BootOrderServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(BootOrderServiceConsumerApplication.class, args);
}
}
3、提供一个 Controller 进行测试
@RestController
public class OrderController {
@Autowired
OrderService orderService;
@GetMapping(value = "/initOrder")
public List<UserAddress> initOrder(@RequestParam("uid") String uid) {
List<UserAddress> userAddresses = orderService.initOrder(uid);
return userAddresses;
}
}
4、测试
5、dubbo 注解
@Service、@Reference
如果没有在配置中写 dubbo.scan.base-package,还需要使用@EnableDubbo 注解