前言

在上一篇中,我们搭建了一个-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,后期项目会发布共享,项目持续更新

基于【 springBoot +springCloud+vue 项目】二 || 后端框架详解的更多相关文章

  1. 基于【 springBoot +springCloud+vue 项目】一 || 项目架构简介

    一.前言 基于前期学习以及工作经验积累,持续更新基于springboot+springcloud+vue的demo项目.

  2. 基于【 springBoot +springCloud+vue 项目】一 || 后端搭建

    缘起 本项目是基于之前学习的一个Dubbo+SSM分布式项目进行升级,基于此项目对前后端分离项目.微服务项目进一步深入学习.之前学习了vue.springBoot.springCloud后,没有进行更 ...

  3. 基于【 springBoot +springCloud+vue 项目】三 || 项目部署

    前言 今天所要讲的项目部署,并非正式环境部署,而是作为开发中的测试环境部署.随着项目模块的增多,启动的模块也随之增多,本人的电脑启动四个模块就已经卡的不行了,为了减轻电脑压力,不得不自己学着搭建一个项 ...

  4. Java并发编程原理与实战三十二:ForkJoin框架详解

    1.Fork/Join框架有什么用呢? ------->Fork使用来切分任务,Join是用来汇总结果.举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做 ...

  5. 基于SpringBoot实现AOP+jdk/CGlib动态代理详解

    动态代理是一种设计模式.在Spring中,有俩种方式可以实现动态代理--JDK动态代理和CGLIB动态代理. JDK动态代理 首先定义一个人的接口: public interface Person { ...

  6. 基于springboot的web项目最佳实践

    springboot 可以说是现在做javaweb开发最火的技术,我在基于springboot搭建项目的过程中,踩过不少坑,发现整合框架时并非仅仅引入starter 那么简单. 要做到简单,易用,扩展 ...

  7. 基于Typescript的Vue项目配置国际化

    基于Typescript的Vue项目配置国际化 简介 使用vue-i18n插件对基于Typescript的vue项目配置国际化,切换多种语言, 配合element-ui或者其他UI库 本文以配置中英文 ...

  8. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  9. p2p网贷项目开发全过程技术详解,应用框架是ci2.2

    p2p网贷项目开发全过程技术详解,应用框架是ci2.2 很标准的mvc开发代码,代码也很简单,方便二次开发 这篇文章会不断更新

随机推荐

  1. [Java读书笔记] Effective Java(Third Edition) 第 6 章 枚举和注解

    Java支持两种引用类型的特殊用途的系列:一种称为枚举类型(enum type)的类和一种称为注解类型(annotation type)的接口. 第34条:用enum代替int常量 枚举是其合法值由一 ...

  2. smarty {for}{forelse}

    {for} {for}{forelse}用于创建一个简单的循环. 下面的几种方式都是支持的: {for $var=$start to $end}步长1的简单循环. {for $var=$start t ...

  3. 【ARTS】01_29_左耳听风-201900527~201900602

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  4. unity 读取灰度图生成三维地形并贴图卫星影像

    从 https://earthexplorer.usgs.gov/ 下载高程数据 从谷歌地球上保存对应地区卫星图像 从灰度图创建地形模型,并将卫星影像作为贴图 using System.Collect ...

  5. # 【ARM-Linux开发】在Win7的电脑上直接运行安装Ubuntu14.04发生的问题 标签(空格分隔): 【Linux开发】 --- > 一段时间以来,一直是在Windows上安装虚拟机

    [ARM-Linux开发]在Win7的电脑上直接运行安装Ubuntu14.04发生的问题 标签(空格分隔): [Linux开发] 一段时间以来,一直是在Windows上安装虚拟机,然后安装Ubuntu ...

  6. 启动Nginx 出现 nginx: [emerg] unknown directive "锘?user" 错误

    出现这种情况 一般是修改配置文件 nginx.conf 造成的 如果你修改文件后出现 那基本上就是这个原因 启动不了 重新打开 改为UTF-8 无BOM编码

  7. 阿里云ECS服务器 java JDK安装和配置 mysql安装和配置

    最近配置了一下阿里云ecs服务的服务器环境,主要对java jdk环境的安装和配置,以及数据库mysql的安装和配置,趁着热乎,记录一下! 服务器用的系统是ubuntu_16_04_64的,版本16. ...

  8. 【持续更新】一个简洁、易用的美赛 LaTeX 模板: easyMCM

    目录 1 当前美赛模板通行情况的概述 2 EasyMCM 宏包说明 2.1 与 mcmthesis 的关系之说明 2.2 easymcm宏包的简介 2.3 美赛模板下载地址 3 README 摘录 3 ...

  9. Hadoop之HDFS介绍

    1. 概述 HDFS是一种分布式文件管理系统. HDFS的使用场景: 适合一次写入,多次读出的场景,且不支持文件的修改: 适合用来做数据分析,并不适合用来做网盘应用: 1.2 优缺点 优点: 高容错性 ...

  10. Django使用DataTables插件总结

    Django使用Datatables插件总结 文章中的例子已上传至github 基本使用 Datatables插件是一款方便简单的展示数据的列表插件.关于基本使用,官方网站上的已介绍的很详细,这里我再 ...