承接上文,介紹了Dubbo與Zookeeper之後,這一篇博客就來記錄一下怎麼在SpringBoot項目中整合它們。
首先因爲Dubbo的架構設計,有服務提供者(provider) 和 服務消費者(consumer),那我們可以創建一個空項目,並往裏面加入兩個子模塊,一個叫provider_ticket
,另外一個是consumer_user
。由前者提供服務,並註冊到Zookeeper中,後者訂閱Zookeeper,收到通知後遠程調用前者完成業務。大致業務邏輯就是這樣。
現在開始行動吧,項目創建好之後:
Dubbo內部還是有挺多組件的,如果在以往的SSM項目中,我們會在配置文件中,配置很多<bean>
組件,但好在SpringBoot的優勢,它會爲我們自動導入各種組件,我們只需要在兩個模塊中都引入Dubbo的starter
即可:
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
當然這還不夠,因爲還需要註冊中心Zookeeper,這裏引入它的客戶端zkclient
即可:
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
接下來就可以編寫代碼了,我們先來編寫服務提供者的代碼.
provider_ticket:
編寫一個TicketService
接口,其中有一個getTicket()
方法,並編寫一個類去實現它:
TicketServiceImpl
中實現該方法:
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《霸王別姬》";
}
}
接下來,需要把該服務註冊到Zookeeper中去,在TicketServiceImpl
類上添加兩個註解:
@Service
@Component
特別注意,@Service
是alibaba那個包的註解,不要導成Spring的了,@Component
就不用說了,添加類到容器中。
之後註冊服務,還差最後一步,我們還需要在全局配置文件中 (application.yaml) 配置一些屬性,服務提供者的名稱,註冊中心的ip地址和服務所在包下:
dubbo:
application:
name: provider_ticket
registry:
address: zookeeper://localhost:2181 //注意是zookeeper協議,後面加上你安裝zookeeper的主機ip地址,端口號爲2181
scan:
base-packages: com.leslie.provider_ticket.service.impl
註冊服務到註冊中心完成啦,接下來啓動程序,並保持該模塊不中斷。項目啓動後可以在控制檯上看到比較帥氣的界面:
接下來就是服務消費者的代碼編寫了。
consumer_user:
項目基本結構還是和provider_ticket
相同:
接口內有一個方法buyTicket()
,實現類中實現它,這裏代碼稍後再放。
在該模塊中,我們需要遠程調用provider_ticket
模塊的方法,我們需要在此模塊(consumer_user
)創建一個和上一個模塊(provider_ticket
)一模一樣的項目結構(有點繞),直接看看創建完成之後的結構:
說白了就是創建一個TicketService
接口的全限定類名的包結構。(別問,我也不知道爲什麼…)
之後就可以遠程調用了,我們需要在UserServiceImpl
類中編寫代碼:
@Service
public class UserServiceImpl implements UserService {
@Reference
private TicketService ticketService;
@Override
public void buyTicket() {
System.out.println("買到票了:"+ticketService.getTicket());
}
}
注意,這裏@Service
是Spring包下的註解,@Reference
是alibaba包下的註解,之後編寫測試代碼運行,再次注意,provider_ticket
模塊的服務器程序不能關閉!!!
在此之前,別忘了consumer_user
模塊的全局配置文件也是需要配置的:
dubbo:
application:
name: consumer_user
registry:
address: zookeeper://localhost:2181
還有一點,需要在兩個啓動類上加入@EnableDubbo
註解。
測試代碼:
@SpringBootTest
class ConsumerUserApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
運行結果:
成功運行~