前言
在上一篇中,我們搭建了一個-API服務提供接口模塊,目的為了提供了消費方進行調用。為什么不直接在service層直接提供調用接口,而是重新創建一個接口層模塊?
首先我們需要對Feign有所了解。Feign是一種聲明式、模板化的HTTP客戶端。Feign的功能類似dubbo暴露服務,但是與dubbo稍有不同的是Feign是HTTP REST接口的形式暴露的。
正文
之前,我一直不理解,-interface模塊和-api模塊是否可以合並為一個,經過對項目的拆分測試,總算有所了解。那么,為了便於理解,對上一篇搭建的框架進行調整,把pinyougou-manager-web模塊單獨抽離出來,作為一個獨立的項目。
調整后結構如下:將標為紅色模塊刪除。
獨立新建一個項目:
一、提供接口服務
1、商品服務API
在pinyougou-sellergoods-ap模塊中,創建BrandApiService,提供商品服務接口:
@RequestMapping("/brand") public interface BrandApiService { /** * 下拉列表 * @return 品牌數據 */ @RequestMapping("/selectOptionList") public BaseResponse selectOptionList(); /** * 根據品牌名或首字母模糊查詢品牌並分頁 * @param brand 查詢條件 * @param page 當前頁 * @param size 每頁顯示的數量 * @return 總記錄數和當前頁數據的封裝對象 */ @RequestMapping("/search") public BaseResponse search(@RequestBody TbBrand brand, @RequestParam("page") int page, @RequestParam("size") int size); /** * 運營商后台 品牌列表分頁 * @param page 當前頁 * @param size 每頁顯示數量 * @return 總記錄數和當前頁數據的封裝對象 */ @RequestMapping("/findPage") public BaseResponse findPage(@RequestParam("page") int page,@RequestParam("size") int size); /** * 顯示所有品牌 * @return 所有品牌對象 */ @RequestMapping("/findAll") public BaseResponse findAll(); /** * 添加品牌 * 注:此處對空白,重名方法未進行校驗(或可以在數據庫中添加唯一約束和not null) * @param brand 實體類對象 * @return 添加成功或失敗 */ @RequestMapping("/add") public BaseResponse add(@RequestBody TbBrand brand); /** * 根據id查詢品牌 * @param id 品牌id * @return 品牌對象 */ @RequestMapping("/findOne") public BaseResponse findOne(@RequestParam("id") Long id); /** * 更新品牌數據 * @param brand 品牌對象 * @return 成功或失敗 */ @RequestMapping("/update") public BaseResponse update(@RequestBody TbBrand brand); /** * 多項品牌數據刪除 * @param ids 品牌id數組 * @return 成功或失敗 */ @RequestMapping("/delete") public BaseResponse delete(@RequestParam("ids") Long[] ids); }
我們可以理解為就是一個controller,可以根據需求提供REST風格的api
2.商品服務API的實現
在pinyougou-sellergoods-service模塊中實現API接口
@RestController public class BrandApiServiceImpl extends BaseApiService implements BrandApiService { @Autowired private IBrandService brandService; @Override public BaseResponse selectOptionList() { List<Map> mapResult = brandService.selectOptionList(); return setResultSuccess(mapResult); } @Override public BaseResponse search(TbBrand brand, int page, int size) { PageResult pageResult = brandService.findPage(brand, page, size); return setResultSuccess(pageResult); } @Override public BaseResponse findPage(int page, int size) { PageResult pageResult = brandService.findPage(page, size); return setResultSuccess(pageResult); } @Override public BaseResponse findAll() { List<TbBrand> listResult = brandService.findAll(); return setResultSuccess(listResult); } @Override public BaseResponse add(TbBrand brand) { try{ int result=brandService.add(brand); if(result>0){ return setResultSuccess(result); } return setResultError(); }catch (Exception e){ return setResultError(); } } @Override public BaseResponse findOne(Long id) { TbBrand result = brandService.findOne(id); return setResultSuccess(result); } @Override public BaseResponse update(TbBrand brand) { try{ int result = brandService.update(brand); if(result>0){ return setResultSuccess(result); } return setResultError(); }catch (Exception e){ return setResultError(); } } @Override public BaseResponse delete(Long[] ids) { try{ int result = brandService.delete(ids); if (result==ids.length && result>0){ return setResultSuccess(result); } return setResultError(result); }catch (Exception e){ return setResultError(); } } }
以上的兩部分代碼,我們可以理解為:該兩部分組成一個controller。
二、運營商管理后台
1、調用服務
在pinyougou-manager-web項目中,創建包feign,並創建一個BrandFeign,用於調用商品服務接口
@FeignClient(value = "sellergoods") //寫service層的名稱 public interface BrandFeign extends BrandApiService { }
使用FeignClient調用接口
在BrandFeign接口類中繼承商品服務提供的接口類 ,相當於可以使用BrandFeign 調用所有提供的商品服務。
2.使用服務
接着創建一個BrandController,進行服務的調用
@RestController @RequestMapping("/brands") public class BrandController extends BaseApiService { @Autowired private BrandFeign brandFeign; @RequestMapping("/selectOptionList") @CrossOrigin public BaseResponse selectOptionList() { Object object=brandFeign.selectOptionList(); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } @RequestMapping("/search") public BaseResponse search(@RequestBody TbBrand brand, @RequestParam("page") int page, @RequestParam("size") int size) { Object object= brandFeign.search(brand, page, size); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } @RequestMapping("/findPage") public BaseResponse findPage(int page, int size) { Object object= brandFeign.findPage(page, size); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } @RequestMapping("/findAll") public BaseResponse findAll() { Object object= brandFeign.findAll(); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } @RequestMapping("/add") public BaseResponse add(TbBrand brand) { Object object= brandFeign.add(brand); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } @RequestMapping("/findOne") public BaseResponse findOne(Long id) { Object object= brandFeign.findOne(id); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } @RequestMapping("/update") public BaseResponse update(TbBrand brand) { Object object= brandFeign.update(brand); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } @RequestMapping("/delete") public BaseResponse delete(Long[] ids) { Object object= brandFeign.delete(ids); String json=new JSONObject().toJSONString(object); BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class); return result; } }
到此,我們的項目代碼已經全部完成,但是,我們在BrandFeign中不能像在聚合工程中一樣,直接調用BrandApiService,我們想要繼承該類,必須提供api接口項目的依賴。
三、idea中jar包導出與導入
在idea中我們要怎么導出jar包使用?
這里提供兩種思路:
1.導出jar包本地使用
2.導出jar包,使用maven打包到本地倉庫
接下來我就簡單說一下第一種方式,更詳細資源請到其他資源查看。
1、idea導出jar包
直接上圖:之前一直使用eclipse,改用idea,花了我好長時間才弄好
1、ctrl+shift+s
直接照着圖片做,選擇Empty
然后就可以在當前項目中發現有一個out文件夾,里面就存着剛剛導出的jar包了
2、idea引用jar包
導出jar包怎么直接在項目中使用?
同樣:ctrl+shift+s
然后就直接看圖了:
然后,點'+',選擇JARs or directories,找到剛剛導出的jar包(在當前項目resource下,新建lib,包導出的jar包放里面),點擊就ok了
之后,我們就可以看到導入的jar包了
點開看一看?我們就可以知道,文章開始提出的問題了,主要目的還是不會讓服務消費者看到我們的源碼。
四、進入測試階段
同樣:啟動注冊中心,啟動service服務,最后啟動我們的manager-web項目
瀏覽器輸入地址:http://localhost:9101/api/brands/selectOptionList
如果能返回數據,說明我們成功了,感覺有點小激動啊。
本人聯系方式QQ:1136069753,后期項目會發布共享,項目持續更新