微服務(SOFAStack MicroService)主要是通過 SOFARPC 來實現服務的發布和引用,而 SOFARPC 支持 REST 協議。本文以微服務本地開發到云端發布的整體流程為框架,讓您了解如何在本地實現 SOFAREST 功能,以及如何將應用發布到云端,并在云端進行服務管控。本文主要講述 SOFAREST 的實現原理,示例工程也支持直連的方式,讓您在本地體驗 SOFAREST 的服務發布和服務引用。
本地工程開發
SOFAREST 工程開發流程圖
SOFAREST 示例代碼演示視頻
準備工作
搭建 SOFABoot 環境。具體操作,請參見 搭建環境。
通過以下任一方式生成 2 個 SOFABoot Web 工程,分別作為服務發布方和引用方。
本地開發流程
引入依賴。
按步驟創建的工程默認已經引入該依賴,請忽略此步驟;直接下載的示例工程需在 2 個本地 SOFABoot 工程 Web 模塊
pom.xml
中引入 SOFARPC 的 Maven 依賴。<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>rpc-enterprise-sofa-boot-starter</artifactId> </dependency>
編寫業務邏輯。
主要為服務發布和服務引用。本示例使用注解的方式配置 Bean,實現服務發布和引用。更多詳情,請參見 使用注解方式。其它配置方式,請參見 使用 XML 配置 及 使用編程 API。
服務發布的業務邏輯
設計服務接口類
本示例類名稱為
SampleRestFacade.java
,接口路徑為com.alipay.samples.rpc.SampleRestFacade
。@Path("/sofarest") //注意該注解的繼承性問題,實現類或方法中,該注解的缺失,可能會造成 SOFAREST 調用報 404 錯誤。 @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON +";charset=UTF-8") public interface SampleRestFacade{ /** * http://localhost:8341/sofarest/hello */ @GET @Path("/hello") public String hello(); }
編寫服務實現類
本示例類名稱為
SampleRestFacadeImpl.java
,接口實現路徑為com.alipay.samples.rpc.impl.SampleRestFacadeImpl
。@Service @SofaService(interfaceType =SampleRestFacade.class,bindings =@SofaServiceBinding(bindingType ="rest")) public class SampleRestFacadeImpl implements SampleRestFacade{ private int count =0; public SampleRestFacadeImpl(){ System.out.println("print start"); } @Override public String hello(){ return "Hello SOFARest! times = "+ count++; } }
服務引用邏輯
引用對象注入
本示例采用
ReferenceHolder
類對引用對象進行統一管理,示例如下:@Component public class ReferenceHolder{ @SofaReference(interfaceType =SampleRestFacade.class, binding =@SofaReferenceBinding(bindingType ="rest",directUrl ="127.0.0.1:8341")) private SampleRestFacade sampleRestFacade; public SampleRestFacade getSampleRestFacade(){ return sampleRestFacade; } public void setSampleRestFacade(SampleRestFacade sampleRestFacade){ this.sampleRestFacade = sampleRestFacade; } }
說明bindingType 為 rest 協議,直連 URL 端口為 8341,即
directUrl="127.0.0.1:8341"
。引用對象
為了方便直觀使用,本示例將引用服務邏輯放在了
myclient-app
工程 Web 模塊的com.alipay.mytestsofa.SOFABootWebSpringApplication
中,示例如下:@SpringBootApplication public class SOFABootWebSpringApplication{ private static final Logger logger =LoggerFactory.getLogger(SOFABootWebSpringApplication.class); public static void main(String[] args){ //*************** 注意 ******************// //本地同時啟動 myserver-app 和 myclient-app 時,由于 tomcat 端口沖突問題,需要修改 myclient-app 的 端口號為 8084。 //將 myserver-app 和 myclient-app 發布到云上環境時,由于默認健康檢查端口是 8080,所以需要注釋掉該行代碼。 System.setProperty("server.port","8084"); //由于本地啟動沒有注冊中心,所以使用本地直連的方式訪問本地啟動的 myserver-app,發布到線上的時候需要注釋掉該行代碼。 System.setProperty("run.mode","TEST"); //********************************// SpringApplication springApplication =newSpringApplication(SOFABootWebSpringApplication.class); ApplicationContext applicationContext = springApplication.run(args); if(logger.isInfoEnabled()){ printMsg("SofaRpc Application (myclient-app) started on 8084 port."); } ReferenceHolder referenceHolder = applicationContext.getBean(ReferenceHolder.class); //調用 SOFAREST 服務。 final SampleRestFacade sampleRestFacade = referenceHolder.getSampleRestFacade(); new Thread(new Runnable(){ @Override public void run(){ while(true){ try{ String response = sampleRestFacade.hello(); printMsg("Response from myserver-app.rest: "+ response); }catch(Exception e){ e.printStackTrace(); }finally{ try{ TimeUnit.SECONDS.sleep(3); }catch(InterruptedException e){ //ignore } } } } }).start(); } private static void printMsg(String msg){ System.out.println(msg); if(logger.isInfoEnabled()){ logger.info(msg); } } }
配置包掃描。
@SpringBootApplication(scanBasePackages ={"com.alipay.mytestsofa","com.alipay.samples.rpc"}) public class SOFABootWebSpringApplication{ ... }
配置本地運行的端口。
在
myserver-app
Web 模塊application.properties
文件中配置rpc.tr.port=12201
。rpc.tr.port
是 TR 端口號,默認為 12200;TR = TaobaoRemoting
是 RPC 使用的底層通信框架。云端發布時不需要該項配置。運行 Web 子模塊中的
SOFABootWebSpringApplication
。運行后,框架會自動進行服務的發布。為了避免端口沖突,需要在該類中指定端口。
重要將
myserver-app
發布至云上環境前,必須注釋掉代碼中對 8083 端口的配置。在
myclient-app
Web 模塊application.properties
文件中配置rpc.tr.port=12202
。rpc.tr.port
是 TR 端口號,默認為 12200。云端發布時不需要該項配置。
配置
application.properties
。登錄 SOFAStack 控制臺。
在左側導航欄選擇 中間件 > 中間件總覽。
從中獲取以下信息:
instanceld(實例標識):應用實例在工作空間中的唯一標識。
在
application.properties
中對應的 key 為com.alipay.instanceid
。AntVIP endpoint:區域的唯一標識,每個區域一個地址。應用通過 AntVIP 尋找所在區域環境的地址。不同環境的 AntVIP 地址值如下:
杭州金區:
cn-hangzhou-fin-middleware-acvip-prod.cloud.alipaycs.net
上海非金:
cn-shanghai-middleware-acvip-prod.cloud.alipaycs.net
上海金區:
cn-shanghai-fin-sofastack-middleware-acvip-prod.cloud.alipaycs.net
杭州非金:
cn-hangzhou-middleware-acvip-prod.cloud.alipaycs.net
在
application.properties
中對應的 key 為com.antcloud.antvip.endpoint
。Access Key ID:用于標識用戶。單擊 獲取 AK 可前往 RAM 控制臺獲取。具體操作,請參見 創建AccessKey。
在
application.properties
中對應的 key 為com.antcloud.mw.access
。Access Key Secret:用于驗證用戶。單擊 獲取 SK 可前往 RAM 控制臺獲取。具體操作,請參見 創建AccessKey。
在
application.properties
中對應的 key 為com.antcloud.mw.secret
。
配置運行模式和運行環境,示例如下:
run.mode=NORMAL com.alipay.env=shared
將上述步驟獲取的參數配置在
application.properties
文件中。
說明更多信息,請參見 引入 SOFA 中間件。
示例工程
下文以示例工程為例,對 SOFARPC 的實現原理進行說明。
示例概述
通過 IDEA 或 Eclipse 分別打開 rpc-demo 中的 myserver-app
和 myclient-app
工程。
示例工程關鍵信息
groupId: 工程組織的唯一標識,示例工程為
com.alipay.mytestsofa
。artifactId:工程的構件標識符,示例工程為
myserver-app
或myclient-app
。version:版本號,默認為
1.0-SNAPSHOT
。package:應用包名,默認等同于 groupId,工程示例為
com.alipay.mytestsofa
。
示例工程 Bean 配置
Bean 的配置分為服務發布和服務引用 2 個類型:
服務發布的示例
@SofaService(interfaceType =SampleRestFacade.class,bindings =@SofaServiceBinding(bindingType ="rest"))
服務引用的示例
@SofaReference(interfaceType =SampleRestFacade.class, binding =@SofaReferenceBinding(bindingType ="rest",directUrl ="127.0.0.1:8341")) private SampleRestFacade sampleRestFacade;
說明示例中,為了便于對所有待引用實例進行統一管理,創建了
ReferenceHolder
類,進行引用管理。
示例工程的 REST 實現
SOFAREST 的實現基于 SOFARPC,SOFARPC 的實現原理說明如下:
在 2 個工程的 endpoint 模塊中相同位置,提供相同的服務接口和實現,并通過注解發現服務。2 個工程通過相同接口實現關聯。一個客戶端,一個服務端,如果是本地工程,在引用時,通過配置 directUrl,以直連方式發現服務;如果是服務器上部署測試,則通過 DSR(Direct Server Return) 底座發現服務。
啟動
myserver-app
Web 模塊的SOFABootWebSpringApplication
可發布服務。啟動
myclient-app
Web 模塊的SOFABootWebSpringApplication
可引用服務。
示例工程服務驗證
啟動
myserver-app
Web 模塊的SOFABootWebSpringApplication
發布服務。啟動
myclient-app
Web 模塊的SOFABootWebSpringApplication
引用服務。引用成功后,
myclient-app
控制臺將輸出:Response from myserver-app.rest:HelloSOFARest! times = xx
本地瀏覽器訪問
http://localhost:8341/sofarest/hello
,將輸出訪問 URL 鏈接那一刻,客戶端的調用次數。HelloSOFARest! times = xx
云端發布后,可以在客戶端命令行中輸入 curl http://{服務器 IP 地址}:8341/sofarest/hello
命令進行驗證。
您也可以通過日志來查看服務引用結果:默認在 /logs/myclient-app/common-default.log
中查看服務引用結果。您可以在 Web 子模塊路徑 src/main/resources/config/application.properties
中修改日志路徑。
應用打包和云端發布
打包本地應用。
操作步驟,請參見 本地運行。
發布應用。