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”,觀察返回結果
總結
以上是生活随笔為你收集整理的java微服务简介与实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《原神》心意涂鸦活动玩法攻略-原神心意涂
- 下一篇: 德不孤必有邻出自哪里(德不孤必有邻 唯志