上面介绍了dubbo和注册中心,现在就看看在项目中实际应该如何使用,话不多说,开打。
1、项目的结构:
根据需求,订单服务是一个独立的工程,用户服务是一个独立的工程,然后订单服务中要调用用户服务,例如在订单服务的某个方法中肯定要用到UserService。但是UserService是在用户服务工程中的,怎么调用?直接把用户工程打jar包依赖过来吗?那这样就不是分布式应用了。正确的做法是:
将两个工程中要用到的接口、实体类等抽取出来独立成一个工程,具体的实现放到对应的具体工程中去。
2、common-api 工程:
这就是用户服务和订单服务会共用到的一些东西,放在这个工程中,然后打jar包,让用户服务工程和订单服务工程依赖即可。
工程结构@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserAddress implements Serializable {
private Integer id;
private String userAddress;
private String phoneNumber;
}
public interface OrderService {
public List<UserAddress> initOrder(String userId);
}
public interface UserService {
public List<UserAddress> getUserAddressList(String userId);
}
3、user-service 工程:
工程结构 <!-- dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.2</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>
@Service
public class UserServiceImpl implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
if (userId.equals("1")){
UserAddress userAddress1 = new UserAddress(1, "广东省深圳市宝安区","8008208820");
UserAddress userAddress2 = new UserAddress(2, "广东省东莞市厚街镇","8008208820");
return Arrays.asList(userAddress1,userAddress2);
}
else return null;
}
}
接下来就需要在xml文件中将这个用户服务注册到注册中心去。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo./schema/dubbo"
xmlns:context="http://www./schema/context"
xsi:schemaLocation="http://www./schema/beans
http://www./schema/beans/spring-beans.xsd
http://www./schema/context
http://www./schema/context/spring-context-4.3.xsd
http://dubbo./schema/dubbo
http://dubbo./schema/dubbo/dubbo.xsd
http://code./schema/dubbo
http://code./schema/dubbo/dubbo.xsd">
<context:component-scan base-package="com.zhu.study.service"/>
<!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
<dubbo:application name="user-service"></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="20882"></dubbo:protocol>
<!-- 4、暴露服务 ref:指向服务的真正的实现对象 -->
<dubbo:service interface="com.zhu.study.service.UserService"
ref="userServiceImpl" timeout="1000" version="1.0.0">
<dubbo:method name="getUserAddressList" timeout="1000"/>
</dubbo:service>
</beans>
在这个配置文件中,首先给这个服务起个名字,然后注册到2181端口的注册中心去,再指定通信规则和端口,最后把用户模块的UserService暴露出去,同时用ref引用实现类。当然这个UserServiceImpl需要加入到spring容器中。
public class App
{
public static void main( String[] args ) throws IOException {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
ioc.start();
System.in.read(); // 保留启动的状态
}
}
运行这个启动类的前提是注册中心zookeeper启动起来了。运行之后,访问管理控制台就可以看到服务了(去dubbo的GitHub地址,找到dubbo-admin项目,下载下来,然后用maven打个jar运行,这就是管理控制台)。
管理控制台可以看到user-service已经成功注册到zookeeper了。接下来就要在订单服务中调用它了。
4、order-service 工程:
工程结构@Service
public class OrderServiceImpl implements OrderService {
@Resource
private UserService userService;
@Override
public List<UserAddress> initOrder(String userId) {
// 查询用户收获地址
List<UserAddress> addressesList = userService.getUserAddressList(userId);
return addressesList;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo./schema/dubbo"
xmlns:context="http://www./schema/context"
xsi:schemaLocation="http://www./schema/beans
http://www./schema/beans/spring-beans.xsd
http://www./schema/context
http://www./schema/context/spring-context-4.3.xsd
http://dubbo./schema/dubbo
http://dubbo./schema/dubbo/dubbo.xsd
http://code./schema/dubbo
http://code./schema/dubbo/dubbo.xsd">
<context:component-scan base-package="com.zhu.study.service"/>
<dubbo:application name="order-service"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference interface="com.zhu.study.service.UserService"
id="userService" timeout="5000" retries="3" version="*">
</dubbo:reference>
</beans>
这里的配置,第一行是开启注解扫描,然后给订单服务起个名字,第三步是注册到zookeeper中去,第四步是引用UserService。这样就完事了,然后写个测试类试试水。
public class App
{
public static void main( String[] args ) throws IOException {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("consumer.xml");
OrderService orderService = ioc.getBean(OrderService.class);
List<UserAddress> userAddresses = orderService.initOrder("1");
for (UserAddress userAddress : userAddresses){
System.out.println(userAddress.toString());
}
System.in.read();
}
}
运行结果可以看到,成功地调用了UserService服务。同时在管理控制台也可以看到调用者的信息