上面介紹了dubbo和注冊(cè)中心,現(xiàn)在就看看在項(xiàng)目中實(shí)際應(yīng)該如何使用,話不多說,開打。
1、項(xiàng)目的結(jié)構(gòu):
根據(jù)需求,訂單服務(wù)是一個(gè)獨(dú)立的工程,用戶服務(wù)是一個(gè)獨(dú)立的工程,然后訂單服務(wù)中要調(diào)用用戶服務(wù),例如在訂單服務(wù)的某個(gè)方法中肯定要用到UserService。但是UserService是在用戶服務(wù)工程中的,怎么調(diào)用?直接把用戶工程打jar包依賴過來嗎?那這樣就不是分布式應(yīng)用了。正確的做法是:
將兩個(gè)工程中要用到的接口、實(shí)體類等抽取出來獨(dú)立成一個(gè)工程,具體的實(shí)現(xiàn)放到對(duì)應(yīng)的具體工程中去。
2、common-api 工程:
這就是用戶服務(wù)和訂單服務(wù)會(huì)共用到的一些東西,放在這個(gè)工程中,然后打jar包,讓用戶服務(wù)工程和訂單服務(wù)工程依賴即可。
工程結(jié)構(gòu)@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 工程:
工程結(jié)構(gòu) <!-- dubbo依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.2</version>
</dependency>
<!-- zookeeper注冊(cè)中心 -->
<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, "廣東省深圳市寶安區(qū)","8008208820");
UserAddress userAddress2 = new UserAddress(2, "廣東省東莞市厚街鎮(zhèn)","8008208820");
return Arrays.asList(userAddress1,userAddress2);
}
else return null;
}
}
接下來就需要在xml文件中將這個(gè)用戶服務(wù)注冊(cè)到注冊(cè)中心去。
<?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、指定當(dāng)前服務(wù)/應(yīng)用的名字(同樣的服務(wù)名字相同,不要和別的服務(wù)同名) -->
<dubbo:application name="user-service"></dubbo:application>
<!-- 2、指定注冊(cè)中心的位置 -->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!-- 3、指定通信規(guī)則(通信協(xié)議?通信端口)服務(wù)提供者和調(diào)用者通信規(guī)則 -->
<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
<!-- 4、暴露服務(wù) ref:指向服務(wù)的真正的實(shí)現(xiàn)對(duì)象 -->
<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>
在這個(gè)配置文件中,首先給這個(gè)服務(wù)起個(gè)名字,然后注冊(cè)到2181端口的注冊(cè)中心去,再指定通信規(guī)則和端口,最后把用戶模塊的UserService暴露出去,同時(shí)用ref引用實(shí)現(xiàn)類。當(dāng)然這個(gè)UserServiceImpl需要加入到spring容器中。
public class App
{
public static void main( String[] args ) throws IOException {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
ioc.start();
System.in.read(); // 保留啟動(dòng)的狀態(tài)
}
}
運(yùn)行這個(gè)啟動(dòng)類的前提是注冊(cè)中心zookeeper啟動(dòng)起來了。運(yùn)行之后,訪問管理控制臺(tái)就可以看到服務(wù)了(去dubbo的GitHub地址,找到dubbo-admin項(xiàng)目,下載下來,然后用maven打個(gè)jar運(yùn)行,這就是管理控制臺(tái))。
管理控制臺(tái)可以看到user-service已經(jīng)成功注冊(cè)到zookeeper了。接下來就要在訂單服務(wù)中調(diào)用它了。
4、order-service 工程:
工程結(jié)構(gòu)@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>
這里的配置,第一行是開啟注解掃描,然后給訂單服務(wù)起個(gè)名字,第三步是注冊(cè)到zookeeper中去,第四步是引用UserService。這樣就完事了,然后寫個(gè)測(cè)試類試試水。
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();
}
}
運(yùn)行結(jié)果可以看到,成功地調(diào)用了UserService服務(wù)。同時(shí)在管理控制臺(tái)也可以看到調(diào)用者的信息