測試和發現模組之間耦合的有效手段

banq發表於2018-07-20
雖然我們使用SpringBoot實現微服務,但是在一個微服務中還是有可能塞入很多模組;同時從單體向微服務過程中,只有先將單體切分成模組以後,這些模組之間的依賴越來越少,這些模組才能逐個獨立成微服務。

有沒有一個有效手段在當前單體架構下發現模組之間的依賴關係?發現了模組的依賴關係,如果依賴關係很多那麼我們進行模組重構,也許這兩個模組應該合併成一個模組,或者重構成了單線依賴,這樣兩個模組的依賴達到理想程度,可以變成了兩個微服務了。

https://github.com/olivergierke/moduliths提供了這樣一個測試和發現模組之間依賴耦合的有效工具。

假設我們在一個包com.abc下面有兩個子包com.abc.a和com.abc.b。 那麼這兩個子包是不是兩個獨立模組?依賴關係如何?

首先我們要使用@Modulith在com.abc這個根包下一個入口類裡面註解一下:

package com.abc;

@Modulith
public class Application {

}
<p class="indent">

這個@Modulith類似於SpringBoot的@SpringBootApplication,如果使用SpringBoot,可以一起註釋:

@SpringBootApplication
@Modulith
public class ModulithsApplication {

    public static void main(String[] args) {

<p class="indent">


第二步,com.abc下有兩個子包,假設是com.abc.a和com.abc.b,這裡我們先假設一個情況,假設com.abc.a包下面的MyComponentA依賴於com.abc.b包下面的MyComponentB,我們這個工具是否可以檢測出這種依賴呢?

com.abc.a包下面的MyComponentA:

@Component
public class MyComponentA {
    private final MyComponentB MyComponentB;
<p class="indent">


下面是com.abc.b包下面的MyComponentB:

@Component
public class MyComponentB {
   
<p class="indent">


第三步,我們這個工具是透過測試環節編寫測試用例才能檢測出這樣的依賴,我們知道在正常情況下,當我們啟動SpringBootAplication時,Spring會掃描@Component元註解,然後一股腦子打入Jar包,這裡MyComponentA MyComponentB都標註了@Component,所以肯定會打包在一起,我們的工具特別之處在於,會只掃描com.abc.a子模組包或com.abc.b子模組包,不需要你任何配置,只要在測試類上標註一個註解:@ModuleTest

比如我們在com.abc.a下建立一個測試類:

@RunWith(SpringRunner.class)
@ModuleTest
public class ModuleATest {

	@Autowired
	ApplicationContext context;

	@Test
	public void bootstrapsModuleAOnly() {
        //有ModuleTest註解情況下會出錯
		context.getBean(MyComponentA.class);

	}
}
<p class="indent">

當執行上面這個測試時,SpringBoot會報錯:
Parameter 0 of constructor in com.abc.a.MyComponentA required a bean of type 'com.abc.b.MyComponentB' that could not be found.

因為MyComponentA依賴於MyComponentB,而MyComponentB在com.abc.b這個子包(模組)下,而這個模組並沒有被測試類載入,所以沒有發現該模組下MyComponentB。

報這個錯誤說明兩個模組之間有依賴,如果報錯越多,說明依賴越多,這時候需要重構了,如果只有一處依賴,我們可以使用Spring的event機制來替代這種直接呼叫,也可以透過第三方服務註冊器進行發現呼叫。

總結
模組之間依賴我們需要在設計上及時發現並重構它,這樣才能保證上下文邊界的清晰,狗狗為什麼一出門就要撒尿,據說它也是在畫邊界一樣。

olivergierke/moduliths

相關文章