java微服务简介与实战
今年做了一段时间的可见光、ceph存储,后端开发微服务项目,在这记录点东西,也方便大家借鉴查找。
springboot的项目实例:https://github.com/ityouknow/spring-boot-examples
springboot的官网:https://start.spring.io/
一、简介
1.1、什么是微服务架构?
传统的web开发模式:所有的功能打包在一个包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI等所有逻辑。(注:没找到更好的图片,只好转载一下CSDN的配图了)
这种方式比较适合小型的项目,开发集中简单,方便管理。
但是对于大型的项目来是说,系统的稳定性,扩展度,灵活性都差强人意。所以就需要分布式开发,也就是微服务架构了。 微服务的目的是有效的拆分应用,实现敏捷开发和部署 。
随着微服务理念的兴起,Spring Boot 正是在这样的一个背景下被抽象出来的开发框架,目的为了让大家更容易的使用 Spring 、更容易的集成各种常用的中间件、开源软件;另一方面,Spring Boot 诞生时,正处于微服务概念在慢慢酝酿中,Spring Boot 的研发融合了微服务架构的理念,实现了在 Java 领域内微服务架构落地的技术支撑。
1.2、什么是springboot?
作为微服务的入门级框架,springboot具有方便快速等优点,是我们的首选。
官网翻译:Spring Boot可以很简单的就创建一个你可以运行的独立的、生产级别的应用系统。我们可以使用Spring平台和第三方库快速的开始,很多的Spring Boot应用需要很少的配置。
翻译成大白话就是:Spring Boot是集成了多种架构于一体的架构,能够减少配置,更加便捷开发。
1.3、springboot的主要特点:
- 使用 Spring 项目引导页面可以在几秒构建一个项目
- 方便对外输出各种形式的服务,如 REST API、WebSocket、Web、Streaming、Tasks
- 非常简洁的安全策略集成
- 支持关系数据库和非关系数据库
- 支持运行期内嵌容器,如 Tomcat、Jetty
- 强大的开发包,支持热启动
- 自动管理依赖
- 自带应用监控
- 支持各种 IED,如 IntelliJ IDEA 、NetBeans
二、环境搭建
- IDE:eclipse
- java:jdk-8u171-windows-x64
- apache-maven-3.5.3
- apache-tomcat-6.0.37
- SourceTree
- Navicat for MySQL
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.1、工程结构
3.2、重点要做好swaggerConfig端口配置,配置好port端口号
3.3、配置dev的ip和端口信息:
3.4、写好xml的数据库查询文件:
3.5、右键debug-icmsDeviceApplication,启动运行程序
3.6、程序运行起来后,打开swagger界面
四、项目实例
controller层
4.1、增加用户
/** * @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.2、删除用户
/** * @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.3、修改用户
/** * @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.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.1、工作空间中,必须得有环境配置的pom
5.2、java配置由jre改成jdk
5.3、点开下拉项,在对话框里输入字符,点击“try it out”,观察返回结果