前言
在上一篇中,我們搭建了一個-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,后期項目會發布共享,項目持續更新
