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”,觀察返回結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM