目录
提供服务者(user)
步骤1、配置提供者
application.properties
#提供者配置 dubbo.application.name=boot-user-service-provider #dubbo.registry.protocol=zookeeper #dubbo.registry.address=127.0.0.1:2181 #上面两个也可写成一个 dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.scan.base-package=com.atguigu.gmall dubbo.protocol.name=dubbo dubbo.protocol.port=20880 dubbo.monitor.protocol=registry #application.name就是服务名,不能跟别的dubbo提供端重复 #registry.protocol 是指定注册中心协议 #registry.address 是注册中心的地址加端口号 #protocol.name 是分布式固定是dubbo,不要改。 #base-package 注解方式要扫描的包
步骤2、暴露服务
UserServiceImpl
//方式一:dubbo和spring中的Service注解 //@com.alibaba.dubbo.config.annotation.Service //@Service //方式二:dubbo的Service注解、spring的Component注解 @Service //暴露服务【dubbo的注解】 @Component public class UserServiceImpl implements UserService { @Override public List<UserAddress> getUserAddressList(String userId) { System.out.println("UserServiceImpl......"); // TODO Auto-generated method stub UserAddress address1 = new UserAddress(1, "北京市昌平区xxx", "1", "李老师", "010-56253825", "Y"); UserAddress address2 = new UserAddress(2, "深圳市宝安区xxx", "1", "王老师", "010-56253825", "N"); return Arrays.asList(address1,address2); } }
步骤3、开启基于注解的 dubbo 功能
UserServiceProviderApplication.java
@EnableDubbo //开启基于注解的 dubbo 功能 @SpringBootApplication public class UserServiceProviderApplication { public static void main(String[] args) { SpringApplication.run(UserServiceProviderApplication.class, args); } }
消费者(order)
步骤1、配置消费者
#配置消费者 #web服务,修改默认tomact的服务端口8080为8081 #因为它会与监控中心的端口号起冲突 server.port=8081 #消费者配置: dubbo.application.name=boot-order-service-consumer dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.monitor.protocol=registry #dubbo.registry.protocol=zookeeper #dubbo.scan.base-package=com.atguigu.gmall #dubbo.protocol.name=dubbo #dubbo.protocol.port=20880 #application.name就是服务名,不能跟别的dubbo提供端重复 #registry.protocol 是指定注册中心协议 #registry.address 是注册中心的地址加端口号 #protocol.name 是分布式固定是dubbo,不要改。 #base-package 注解方式要扫描的包
步骤2、远程调用服务
消费者接入层——>调用公共接口——>消费者接口实现类
OrderController.java【消费者接入层】
@Controller public class OrderController { @Autowired OrderService orderService; //http://localhost:8081/initOrder?uid=1 @ResponseBody @RequestMapping("/initOrder") public List<UserAddress> initOrder(@RequestParam("uid")String userId) { return orderService.initOrder(userId); } }
OrderService.java【公共接口】
/** * 订单服务 * @author yyh * */ public interface OrderService { /** * 初始化订单 * @param userId */ public List<UserAddress> initOrder(String userId); }
OrderServiceImpl.java【消费者接口实现类】
@Service public class OrderServiceImpl implements OrderService { //Field userService in com.atguigu.gmall.service.impl.OrderServiceImpl //required a bean of type 'com.atguigu.gmall.service.UserService' that could not be found. //@Autowired @Reference //不用自动注入,Dubbo提供远程调用服务的注解,它会自己去注册中心查看 UserService userService; @Override public List<UserAddress> initOrder(String userId) { // TODO Auto-generated method stub System.out.println("用户id:"+userId); //1、查询用户的收货地址 //如果把 用户模块 项目打成jar包,直接依赖进来! //那么这就不是分布式开发了,它是单体应用模式! //有可能除了订单应用,其他应用也需要用户接口,总不能每个应用都写一遍代码, //麻烦和冗余,官网也建议我们分包,把公共的放在一起。 //我们可以把用户的 bean文件和service接口 提取放在里面. //我们引用了 UserService 接口,但是它的实现在别的工程里面,而且有可能在别的服务器上面, //所以调 getUserAddressList 方法,我们需要远程去调用 if(!StringUtils.isEmpty(userId)) { List<UserAddress> addressList = userService.getUserAddressList(userId); for (UserAddress userAddress : addressList) { System.out.println(userAddress.getUserAddress()); } return addressList; } return null; } }
步骤3、开启基于注解的 dubbo 功能
@EnableDubbo//开启基于注解的 dubbo 功能 @SpringBootApplication public class OrderServiceConsumerYyhApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceConsumerYyhApplication.class, args); } }
步骤4、运行效果
http://localhost:8081/initOrder?uid=1