在HSF架構中開發RESTful應用,並實現服務註冊與發現。由於SAE已經支援原生Spring Cloud架構的應用,新使用者不推薦使用該開發方式。
背景資訊
原生Spring Cloud架構下的服務開發請參考將Spring Cloud應用託管到SAE。
服務註冊與發現
通過一個簡單的樣本詳細介紹如何在本地開發RESTful應用並實現註冊與發現。
- 建立服務提供者。此服務提供者提供了一個簡單的echo服務,並將自身註冊到服務發現中心。
- 建立命名為sc-vip-server的RESTful應用工程。
- 在pom.xml中添加需要的依賴。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>如果您的工程不想將parent設定為
spring-boot-starter-parent,也可以通過添加dependencyManagement並設定scope=import來達到依賴管理的效果。<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 建立服務提供者應用,其中@EnableDiscoveryClient 註解表明此應用需開啟服務註冊與發現功能。
@SpringBootApplication @EnableDiscoveryClient public class ServerApplication { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } } - 建立EchoController,提供簡單的echo服務。
@RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } - 在resources下的application.properties檔案中配置應用程式名稱與監聽連接埠號碼。
spring.application.name=service-provider server.port=18081
- 建立服務消費者。本樣本中將建立一個服務消費者,通過RestTemplate、AsyncRestTemplate、FeignClient這三個用戶端去調用服務提供者。
- 建立名為sc-vip-client的RESTful應用工程。
- 在pom.xml中引入需要的依賴。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>本樣本需要通過FeignClient進行示範,與sc-vip-server(服務提供者)相比,pom.xml檔案中的依賴增加了
spring-cloud-starter-feign。 - 與sc-vip-server相比,除了開啟服務與註冊外,還需要添加下面兩項配置才能使用RestTemplate、AsyncRestTemplate、FeignClient這三個用戶端。
- 添加@LoadBalanced註解將RestTemplate和AsyncRestTemplate與服務發現結合。
- 使用@EnableFeignClients註解啟用FeignClient。
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @LoadBalanced @Bean public AsyncRestTemplate asyncRestTemplate(){ return new AsyncRestTemplate(); } public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ConsumerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } }
- 在使用EchoService的FeignClient之前,還需要佈建服務名以及方法對應的HTTP請求。在sc-vip-server工程中佈建服務名service-provider。
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } - 建立一個Controller用於調用測試。
@RestController public class Controller { @Autowired private RestTemplate restTemplate; @Autowired private AsyncRestTemplate asyncRestTemplate; @Autowired private EchoService echoService; @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } @RequestMapping(value = "/echo-async-rest/{str}", method = RequestMethod.GET) public String asyncRest(@PathVariable String str) throws Exception{ ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate. getForEntity("http://service-provider/echo/"+str, String.class); return future.get().getBody(); } @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } }代碼說明如下:/echo-rest/驗證通過RestTemplate去調用服務提供者。/echo-async-rest/驗證通過AsyncRestTemplate去調用服務提供者。/echo-feign/驗證通過FeignClient去調用服務提供者。
- 配置應用程式名稱以及監聽連接埠號碼。
spring.application.name=service-consumer server.port=18082
- 本地開發調試。
- 啟動輕量級配置中心。本地開發調試時,需要使用輕量級配置中心,輕量級配置中心包含了SAE服務註冊探索服務端的輕量版,詳情請參見啟動輕量級配置及註冊中心。
- 啟動應用。
- IDE中啟動
在IDE中啟動,通過VM options配置啟動參數
-Dvipserver.server.port=8080(注意:該參數僅在本地開發且使用輕量級配置中心時需要添加,當應用部署到SAE時,須移除此參數,否則會使應用無法正常發布或訂閱),通過main方法直接啟動。輕量級配置中心與應用部署在不同的機器上,需要綁定hosts,詳情請參見啟動輕量級配置及註冊中心。
- FatJar啟動
- 添加FatJar打包外掛程式。
使用Maven將pandora-boot工程打包成FatJar, 需要在pom.xml中添加如下外掛程式。為避免與其他打包外掛程式發生衝突,請勿在build的plugin中添加其他FatJar外掛程式。
<build> <plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </build> - 添加完外掛程式後,在工程的主目錄下,使用Maven命令
mvn clean package進行打包,即可在target目錄下找到打包好的FatJar檔案。 - 通過Java命令啟動應用。
java -Dvipserver.server.port=8080 -Dpandora.location=/Users/{$username}/.m2/repository/com/taobao/pandora/taobao-hsf.sar/dev-SNAPSHOT/taobao-hsf.sar-dev-SNAPSHOT.jar -jar sc-vip-server-0.0.1-SNAPSHOT.jar說明-Dpandora.location指定的路徑必須是全路徑,且必須放在sc-vip-server-0.0.1-SNAPSHOT.jar之前。
- 添加FatJar打包外掛程式。
啟動服務,分別進行調用,可以看到調用都成功了。
- IDE中啟動
- 啟動輕量級配置中心。
- 常見問題處理。
- AsyncRestTemplate無法接入服務發現。
AsyncRestTemplate接入服務發現的時間比較晚,需要在Dalston之後的版本才能使用,相關內容,請參見pull request。
- FatJar打包外掛程式衝突。
為避免與其他打包外掛程式發生衝突,請勿在build的plugin中添加其他FatJar外掛程式。
- 打包時可不可以不排除taobao-hsf.sar?
可以,但是不建議這麼做。
通過修改pandora-boot-maven-plugin外掛程式,把excludeSar設定為false,打包時就會自動包含taobao-hsf.sar。<plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <configuration> <excludeSar>false</excludeSar> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>這樣打包後可以在不配置Pandora地址的情況下啟動。java -jar -Dvipserver.server.port=8080 sc-vip-server-0.0.1-SNAPSHOT.jar請在將應用部署到SAE前恢複到預設排除SAR包的配置。
- AsyncRestTemplate無法接入服務發現。