對外開放的接口,須要清晰的接口文檔,方便客戶端進行測試,目前restful風格的接口定義是最好理解,調用和測試的接口風格;服務提供端也須要一種簡單的辦法,把已有的服務接口發佈爲restful風格,代碼註釋便可做爲接口文檔,是服務端程序員可接受的方式,快捷,方便。css
首先選擇restful風格的web接口,而不是soap或者wsdl風格的web服務接口,優勢不少,java6已經把jax-rs做爲標準的一部分。html
dubbo做爲一種十分流行和強大的微服務框架,支持rest風格的rpc協議,dubbo官方框架2.6.0版本整合了dubbox的rest協議代碼,使用dubbo rest協議很方便把咱們寫的業務邏輯代碼(spring bean風格的接口實現)發佈成restful服務接口。java
dubbo rest rpc協議基於easyrest實現restful rpc;easyrest是JAX-RS一種實現,目前是3.0.7版本,支持JAX-RS2,經過jcp認證。程序員
Swagger是一種Openapi接口定義,文檔化,展現,測試的解決方案,由swagger core, swagger annotation, swagger module, swagger ui, swagger editor等組件組成。目前是openapi最爲完整解決方案。web
如何定義restful接口,網上文檔較多,這裏不具體展開,示例:spring
@Api(value = "/order", description = "IOrderServiceApi Resource", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@Path("/order")
@Consumes({ "application/json" })
@Produces({ "application/json" })
@Service("orderServiceApiImpl")
public class OrderServiceApiImpl implements IOrderServiceApi {json
@Resource
private IOrderService orderService;api
@Resource
private IMerchantInfo merchantInfo;restful
@Path("/create")
@POST
@Override
public void create(Order order) {
orderService.createOrder(order);
}app
@Path("/get/{userId}/{orderId}")
@GET
@ApiOperation(value = "獲取一個訂單", notes = "返回一個訂單", response = Order.class)
@Override
public Order getOrder(
@ApiParam(value = "用戶id", allowableValues = "range[1,10000000000]", required = true) @PathParam("userId") String userId,
@ApiParam(value = "訂單流水id", allowableValues = "range[1,10000000000]", required = true) @PathParam("orderId") String orderId) {
// hessian rpc測試
try {
return orderService.getOrder(userId, orderId);
}
}
具體如何發佈dubbo協議,不在此文介紹,能夠參考微服務開發指南這篇文章。這裏重點介紹如何定義rest協議:
<dubbo:protocol name="rest" server="jetty" extension="io.swagger.jaxrs.listing.SwaggerSerializers,com.yspay.framework.rest.easyrest.OriginAccessSettingFilter" host="10.211.61.58" port="8891" threads="10"/>
這裏有個屬性extension,都是對swagger的功能支持,是給easyrest使用的。
有了rest協議定義以後,把發佈的服務加上rest協議便可
<dubbo:service interface="com.yspay.sample.dubboprovider.api.IOrderServiceApi" ref="orderServiceApiImpl"
protocol="hessian3,rest" validation="false"></dubbo:service>
告訴swagger,要把項目中哪些接口做爲openapi發佈出去,在spring 任何一個配置文件裏面定義下面這個bean:
<bean id="swaggerConfig" class="io.swagger.jaxrs.config.BeanConfig">
<property name="title" value="Swagger 整合dubbo例子服務提供端應用"/>
<property name="version" value="1.0.0" />
<property name="schemes" value="http" />
<property name="resourcePackage" value="com.yspay.sample.dubboprovider.api"/>
<property name="scan" value="true"/>
<property name="prettyPrint" value="true"/>
</bean>
resourcePackage屬性定義開放接口所在的包
在spring 配置文件裏面定義:
<dubbo:service interface="com.yspay.framework.rest.swagger.IApiListingResourceService" ref="apiListingResource"
protocol="rest" validation="false"></dubbo:service>
<bean id="apiListingResource" class="com.yspay.framework.rest.swagger.ApiListingResourceServiceImpl"/>
這個接口是restful風格的dubbo接口,能夠經過訪問dubo restful接口同樣的方式獲取到對外接口的定義,swagger ui上面指定這個路徑便可訪問這個項目裏面的全部接口定義,一般路徑是http://10.211.61.58:8890/swagger.json
部署Swagger UI
swagger ui是一個純html+js+css項目,靜態web項目,隨意部署在一種web容器中便可;
有了上面服務端發佈的服務,客戶端只須要在接口上面指定是rest協議訪問方式便可:
<dubbo:reference id="orderServiceClient" protocol="rest" interface="com.yspay.sample.dubboprovider.api.IOrderServiceApi"></dubbo:reference>
在swagger ui部署提供的url訪問界面,把每一個應用的獲取swagger接口定義的url輸入到界面上面的輸入框,而後點擊explore就能夠出現這個應用的全部接口,點擊接口進去,可看到接口的參數定義,而後能夠輸入參數進行測試。接口調用結果會顯示在下面,馬上體驗一下吧!