今年作了一段時間的可見光、ceph存儲,後端開發微服務項目,在這記錄點東西,也方便你們借鑑查找。html
springboot的項目實例:https://github.com/ityouknow/spring-boot-examplesjava
springboot的官網:https://start.spring.io/mysql
1、簡介git
1.一、什麼是微服務架構?github
傳統的web開發模式:全部的功能打包在一個包裏,基本沒有外部依賴(除了容器),部署在一個JEE容器(Tomcat,JBoss,WebLogic)裏,包含了 DO/DAO,Service,UI等全部邏輯。(注:沒找到更好的圖片,只好轉載一下CSDN的配圖了)web
這種方式比較適合小型的項目,開發集中簡單,方便管理。spring
可是對於大型的項目來是說,系統的穩定性,擴展度,靈活性都差強人意。因此就須要分佈式開發,也就是微服務架構了。 微服務的目的是有效的拆分應用,實現敏捷開發和部署 。sql
隨着微服務理念的興起,Spring Boot 正是在這樣的一個背景下被抽象出來的開發框架,目的爲了讓你們更容易的使用 Spring 、更容易的集成各類經常使用的中間件、開源軟件;另外一方面,Spring Boot 誕生時,正處於微服務概念在慢慢醞釀中,Spring Boot 的研發融合了微服務架構的理念,實現了在 Java 領域內微服務架構落地的技術支撐。數據庫
1.二、什麼是springboot?apache
做爲微服務的入門級框架,springboot具備方便快速等優勢,是咱們的首選。
官網翻譯:Spring Boot能夠很簡單的就建立一個你能夠運行的獨立的、生產級別的應用系統。咱們可使用Spring平臺和第三方庫快速的開始,不少的Spring Boot應用須要不多的配置。
翻譯成大白話就是:Spring Boot是集成了多種架構於一體的架構,可以減小配置,更加便捷開發。
1.三、springboot的主要特色:
2、環境搭建
eclipse直接安裝就好;
java安裝:https://jingyan.baidu.com/article/ed15cb1b2ed02a1be369818a.html
maven安裝及配置:http://xinzhi.wenda.so.com/a/1506490952200142
tomcat安裝及配置:https://jingyan.baidu.com/article/c14654139d5dac0bfcfc4cf0.html
Source Tree 和 Navicat for MySQL 直接安裝用就好;
ps:我連接的服務器,因此沒搭建本地sql數據庫;若是沒有服務器上的mysql數據庫,本地須要搭建一個並進行配置
3、項目實例
3.一、工程結構
3.二、重點要作好swaggerConfig端口配置,配置好port端口號
3.三、配置dev的ip和端口信息:
3.四、寫好xml的數據庫查詢文件:
3.五、右鍵debug-icmsDeviceApplication,啓動運行程序
3.六、程序運行起來後,打開swagger界面
4、項目實例
controller層
4.一、增長用戶
/** * @Title: insertRole * @Description: 增長角色 * @param: @param role * @param: @return * @return: Object * @throws */ @ApiOperation(value = "增長角色") @PostMapping(value = "${icmsuser.role.insertRoleUrl}", consumes = { "application/json;charset=UTF-8" }, produces = {"application/json;charset=UTF-8" }) public Object addUser(@RequestBody Role role) { logger.info("入口信息爲:"+role.toString()); Object result = null; if (role != null && StringUtils.isNotEmpty(role.getRoleName())) { try{ role.setCreator(1); roleService.insertRole(role); result = ResultFactory.getInstance().getSingleValueResult(Boolean.valueOf("true")); logger.info("增長角色信息成功:"+role.toString()+"返回信息:"+result.toString()); } catch(Exception e) { logger.error("增長角色信息異常",e); } }else { result = ResultFactory.getInstance().getErrorResult("00050003"); logger.error("您輸入的爲空或含有空信息,錯誤碼:00050003"); } logger.info("出口信息爲:"+result.toString()); return result; }
4.二、刪除用戶
/** * @Title: deleteRoleByID * @Description: 刪除角色 * @param: @param roleID * @param: @return * @return: Object * @throws */ @ApiOperation(value = "刪除角色") @DeleteMapping(value = "${icmsuser.role.deleteRoleByIDUrl}") public Object deleteRoleByID(@RequestParam(value="roleID", required = true) Integer roleID) { logger.info("入口信息:"+ roleID); Object result = null; if (roleID != null && !"".equals(roleID)) { roleService.deleteRoleByRoleID(roleID); result = ResultFactory.getInstance().getSingleValueResult(Boolean.valueOf("true")); logger.info("刪除角色信息成功ID爲:"+roleID+"返回信息:"+result.toString()); } else { result = ResultFactory.getInstance().getErrorResult("00050005"); logger.error("輸入信息不能爲空"); } return result; }
4.三、修改用戶
/** * @Title: updateRole * @Description: 修改角色 * @param: @param role * @param: @return * @return: Object * @throws */ @ApiOperation("修改角色") @PostMapping(value = "${icmsuser.role.updateRoleUrl}", consumes = { "application/json;charset=UTF-8" }, produces = {"application/json;charset=UTF-8" }) public Object updateRole(@RequestBody @ApiParam(name = "role", value = "角色信息", required = true) Role role) { logger.info("入口信息爲:"+role.toString()); Object result = null; Role roleQueryObj = roleService.findRoleByRoleID(role.getRoleID()); if (null == roleQueryObj) { logger.error("沒有此條記錄,錯誤碼:00050004"); result = ResultFactory.getInstance().getErrorResult("00050004"); }else { try{ // 修改角色 roleService.updateRole(role); // 返回信息 result = ResultFactory.getInstance().getSingleValueResult(Boolean.valueOf("true")); logger.info("修改角色信息成功:"+role.toString()+"返回信息:"+result.toString()); } catch(Exception e) { logger.error("修改角色信息異常",e); } } logger.info("出口信息爲:"+result.toString()); return result; }
4.四、查找用戶
/** * @Title: findRoleByRoleID * @Description: 根據ID查詢角色信息 * @param: @param roleID * @param: @return * @return: Object * @throws */ @ApiOperation("根據ID查詢角色信息") @GetMapping(value="${icmsuser.role.findRoleByIDUrl}") public Object findRoleByRoleID(@RequestParam(value="roleID", required = true) Integer roleID) { logger.info("入口信息爲:"+roleID); Object resultObj = null; if(roleID != null ){ try { Role role = roleService.findRoleByRoleID(roleID); resultObj = role; } catch(Exception e) { logger.error("角色ID獲取角色信息",e); } }else{ logger.error("根據編號查詢角色信息接口,輸入信息不能爲空,請從新輸入,錯誤碼:00050001"); resultObj = ResultFactory.getInstance().getErrorResult("00050001"); } return resultObj; }
domain層
/** * 類名稱: Role * 類描述: 角色表 * 建立人: xxx * 建立時間:2018年xxx * Company xxx * @version V1.0 */ @ApiModel(value = "Role", description = "角色對象表") public class Role extends BaseVO implements Serializable{ private static final long serialVersionUID = 1L; private Integer roleID; //角色編號 private String roleName; //角色姓名 private String roleRemark; //角色描述 private Integer creator; //建立者 private Date createTime; //建立時間 private Integer systemID; //系統編號 private String systemName; //系統名稱 //附加 private String creatorName;//建立人名稱 public Integer getSystemID() { return systemID; } public void setSystemID(Integer systemID) { this.systemID = systemID; } ..... }
mapper層
/** * 類名稱: RoleMapper * 類描述: 角色DAO * 建立人: xxx * 建立時間:2018年xxx * Company xxx * @version V1.0 */ @Mapper public interface RoleMapper { /** * @Title: findRoleByRoleID * @Description: 根據角色ID查詢角色 * @param: @param roleID * @param: @return * @return: Role * @throws */ public Role findRoleByRoleID(Integer roleID);public void insertRole(Role role); public void updateRole(Role role); public void deleteRoleByRoleID(int roleID); }
service層
public interface RoleService { /** * @Title: findRoleByRoleID * @Description: 根據角色編號查詢角色信息 * @param: @param roleID * @param: @return * @return: Role * @throws */ public Role findRoleByRoleID(Integer roleID);public void insertRole(Role role); public void updateRole(Role role); public void deleteRoleByRoleID(int roleID); }
serviceImpl層
package com.xxx.module.role.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.xxx.module.role.domain.Role; import com.xxx.module.role.mapper.RoleMapper; import com.xxx.module.role.service.RoleService; import com.xxx.page.PageUtil; /** * 類名稱: RoleServiceImpl * 類描述: 角色接口實現層 * 建立人: xxx * 建立時間:2018年xxx * Company xxx * @version V1.0 */ @Service public class RoleServiceImpl implements RoleService{ @Autowired private RoleMapper roleMapper; //角色DAO /** * @Title: findRoleByRoleID * @Description: 根據ID查詢角色信息 * @param: @param roleID * @param: @return * @return: Role * @throws */ @Override public Role findRoleByRoleID(Integer roleID){ Role role = roleMapper.findRoleByRoleID(roleID); return role; } /** * @Title: insertRole * @Description: 增長角色 * @param: @param role * @param: @return * @return: void * @throws */ @Override public void insertRole(Role role) { roleMapper.insertRole(role); } /** * @Title: updateRole * @Description: 修改角色 * @param: @param role * @param: @return * @return: void * @throws */ @Override public void updateRole(Role role) { roleMapper.updateRole(role); } /** * @Title: delectRoleByRoleID * @Description: 刪除角色 * @param: @param roleID * @param: @return * @return: void * @throws */ @Override public void deleteRoleByRoleID(int roleID) { roleMapper.deleteRoleByRoleID(roleID); } }
resource文件夾中的xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//xxxxxx" "http://mybatis.org/xxxxxxxxx"> <mapper namespace="com.xxxxx.module.role.mapper.RoleMapper"> <!-- 列表參數 --> <sql id="Base_Column_List"> a.roleID, a.roleName, a.roleRemark, a.creator, a.createTime, a.systemID, b.systemName </sql> <!-- 根據ID查詢角色信息 --> <select id="findRoleByRoleID" resultType="com.xxxxx.module.role.domain.Role" parameterType="java.lang.Integer"> select <include refid="Base_Column_List"/> from icms_admin_role as a left join icms_admin_system as b on a.systemID = b.systemID where a.roleID = #{roleID} </select> <!-- 根據系統ID查詢角色 --> <select id="findRoleBySystemID" resultType="com.xxxxx.module.role.domain.Role" parameterType="java.lang.Integer"> select <include refid="Base_Column_List"/> from icms_admin_role as a left join icms_admin_system as b on a.systemID = b.systemID where a.systemID = #{systemID} </select> <!-- 根據ID刪除角色信息 --> <delete id = "deleteRoleByRoleID" parameterType = "com.xxxxx.module.role.domain.Role"> delete from icms_admin_role where roleID = #{roleID} </delete> <!-- 增長角色信息 --> <insert id="insertRole" parameterType = "com.xxxx.module.role.domain.Role"> insert into icms_admin_role ( roleName, roleRemark, creator, createTime, systemID ) values ( #{roleName}, #{roleRemark}, #{creator}, now(), #{systemID} ) </insert> <!-- 根據ID修改角色信息 --> <update id="updateRole" parameterType="com.xxxxx.module.role.domain.Role"> update icms_admin_role <set> <if test = "roleName != null"> roleName = #{roleName}, </if> <if test = "roleRemark != null"> roleRemark = #{roleRemark}, </if> <if test = "creator != null"> creator = #{creator}, </if> <if test = "createTime != null"> createTime = #{createTime}, </if> <if test = "systemID != null"> systemID = #{systemID}, </if> </set> where roleID = #{roleID} </update> </mapper>
5、工做中可能出現的異常及排查
5.一、工做空間中,必須得有環境配置的pom
5.二、java配置由jre改爲jdk
5.三、點開下拉項,在對話框裏輸入字符,點擊「try it out」,觀察返回結果