zoukankan      html  css  js  c++  java
  • 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”,观察返回结果

  • 相关阅读:
    splinter webdriver API 的基本实现
    201253 线程和进程的区别
    Winform中的默认图片
    [收藏】正确使用SqlConnection对象,兼谈数据库连接池
    手机相关的基础名称
    常见排序
    SIP相关内容
    How to set the WIFI configuration
    本地化的设置和读取
    Serialize And Deserialize Binary Tree
  • 原文地址:https://www.cnblogs.com/huxianhe0/p/10119017.html
Copyright © 2011-2022 走看看