環境配置:JDK8 +IDEA 開發工具
**說明:下面搭建過程基於你本地已經配置好zookeeper
一、先搭建父工程(PS:是可以不搭建父工程的,即每個服務和client都是單獨的spring boot項目,也是OK的,搭建父工程純粹為了將項目放在一起,且pom文件可以少一點而已!)
1、先搭建父工程:spring initial -- 第二步,Type改成Maven Pom,Artifact改成demo-parent,便於理解 -- 引入兩個依賴,web和zookeeper-discovery;搭建完后,記得改maven路徑,並刪除一些無用的文件
【【Create New Project -- 選Maven -- Next -- 填寫GroupId:com.example,ArtifactId:dubbo-parent -- Next -- 如果Project name和ArtifactId不一致,可以改成一樣的,再設置項目存放路徑(要先建好dubbo-parent的文件夾,再指定到該文件夾下面,否則會出現很噴飯的情況) -- Finish;完成創建,創建完后,要立即設定 項目Maven的路徑,並刪掉src目錄 》》》這樣生成的Maven項目,pom文件是空的,要手動引入spring boot作為<parent>依賴,等其他配置,如果不想手動配,就直接將dubbo-parent也建成spring boot項目類型】】
附:像 common模塊,不要建成spring boot項目,直接建成 maven項目,步驟:右鍵父項目 -- new -- module -- 選Maven -- next -- 填寫ArtifactId為dubbo-common -- next -- 如果Module name和ArtifactId不一致,可以改成一致的 -- finish;完成common模塊創建,然后放入一些公共代碼。。。
PS:點開對應的pom文件查看,會發現<parent>已經是 我們的 父工程 ,不用再手動修改;而且 父級pom文件<modules>也已經主動添加了common模塊
但是src - main - java目錄下直接是空的,為了和其他模塊保持一致,在java路徑后 新建 com.example.common包,其他所有公共代碼都放在這個下面
這里是2019-08-13補充發現的 》》》之前api模塊,也是建的spring boot項目,是通過發布到本地maven倉庫的方式,給provider和consumer模塊引用,而最開始,common模塊,我也是建成的spring boot項目,但是沒有發布到本地maven倉庫(直接用IDEA的install是有問題的,解壓對應jar包發現多了BOOT-INF包),發現install父級項目時,一直報common里面的 類找不到;
但是,現在common模塊是maven項目,用IDEA install后,解壓生成的jar包(maven本地倉庫的jar)發現還是有BOOT-INF包,,,這個很好解決,在pom文件加入<skip>true</skip>即可,完整如下:
<build> <plugins> <!--springboot打包插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
【api模塊是spring boot項目,模擬spring boot項目如何打包發布到本地倉庫,而common模塊是Maven項目,模擬如何打包發布到本地Maven倉庫】
2、再搭建一個服務,也就是provider:在(1)搭建好的demo-parent上右鍵 -- new -- module -- Spring Initializr -- next -- Artifact改成demo-server,Package也可以優化改一下 -- next,這里是服務端,會有DB的操作,所有引入了mongoDB --next --finish;然后:
完成后吧pom文件的parent改成(1)中父工程的;
改配置文件。用yml形式,配置zookeeper
再隨便建個Cintroller,定義一個測試接口
最后Application程序入口添加注解@EnableDiscoveryClient
》》先啟動zookeeper,zookeeper后台也要運行jar包才能訪問9090端口查看
巨坑之:發現測試接口一直報404,還另外新建了一個項目來對比,發現controller路徑放錯了,改成和Application同級下,一切OK了!
而zookeeper配置並沒有問題,也很簡單
3、搭建一個服務消費者:創建過程同(2)里面的,只是Artifact改成demo-client,引入的依賴改成,然后:
完成后吧pom文件的parent改成(1)中父工程的;
改配置文件。用yml形式,配置zookeeper,其中spring.cloud.zookeeper.discovery.register=false,也再ZK UI就不會出現了
定義一個用@FeignClient(value = "server-name")的接口,里面方法對應服務里面提供的方法,且server-name與服務提供里面配置的spring.application.name的值對應,示例如下:
@FeignClient(value = "server yml 文件 spring.application.name 對應的值") public interface FeignService { @RequestMapping("/test") String printString(@RequestParam(name="name") String name); }
再隨便建個Controller,定義一個測試接口,接口里面調用接口里面的方法即可,示例如下:
@Autowired FeignService feignService; //注意這里client/test是客戶端自己定義的調用url,且、且、且千萬不能/開頭,即/client/test,是會報錯的,服務調不通 @RequestMapping("client/test") public String ps(String name){ return feignService.printString(name); }
最后Application程序入口添加注解@EnableDiscoveryClient和@EnableFeignClients
二、要最先啟動zookeeper服務,也可以啟動zookeeper UI
三、依次啟動 server 和 client,再在瀏覽器調用測試方法,即可查看結果!
