今年做了一段时间的可见光、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微服务简介与实战的更多相关文章

  1. 字节跳动内部微服务架构-Docker实战学习笔记分享 真香

    前言 基于 Spring Cloud 的微服务设计和开发,已经越来越多地得到了更多企业的推广和应用,而 Spring Cloud 社区也在不断的迅速发展壮大之中,近几年时间,Spring Cloud ...

  2. Spring Cloud与微服务构建:微服务简介

    Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...

  3. 从成本角度看Java微服务

    近年来,微服务因其良好的灵活性和伸缩性等特点备受追捧,很多公司开始采用微服务架构或将已有的单体系统改造成微服务.IBM也于近日开源了轻量级Java微服务应用服务器 Open Liberty .但是采用 ...

  4. Java微服务对UTC时间格式的处理

    一.背景 先说一下为什么要使用UTC时间.开发一个全球化的系统,服务端(Java微服务)集中部署在同一个地方,用户在全球通过浏览器.手机客户端访问.不同地区的时区是不一样的,同一个时间戳,不同的用户看 ...

  5. Java微服务框架一览

    引言:本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架. 微服务在开发领域的应用越来越广泛,因为开发人员致力于创建更大.更复杂的应用程序,而这 ...

  6. Java微服务(二):服务消费者与提供者搭建

    本文接着上一篇写的<Java微服务(一):dubbo-admin控制台的使用>,上篇文章介绍了docker,zookeeper环境的安装,并参考dubbo官网演示了dubbo-admin控 ...

  7. Java微服务(二):负载均衡、序列化、熔断

    本文接着上一篇写的<Java微服务(二):服务消费者与提供者搭建>,上一篇文章主要讲述了消费者与服务者的搭建与简单的实现.其中重点需要注意配置文件中的几个坑. 本章节介绍一些零散的内容:服 ...

  8. 现如今,最热门的13个Java微服务框架

    曾经的 服务器领域 有许多不同的芯片架构???有哪些芯片架构???和操作系统???,经过长期发展,Java的“一次编译,到处运行”使得它在服务器领域找到一席之地,成为程序员们的最爱. 本文,我们将和大 ...

  9. 多云架构下,JAVA微服务技术选型实例解析

    [摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...

随机推荐

  1. Tomcat服务器的数字证书 HTTPS 连接!

    SUN公司提供了制作证书的工具keytool, 在JDK 1.4以后的版本中都包含了这一工具,它的位置为\bin\keytool.exe 注意要使用一下 cmd命令,请确认jdk环境变量可以使用,可以 ...

  2. Mysql 中删除重复数据(保留一条)

    sql去重 先根据需要去重的字段进行分组,取到主键值最小的记录(id 是主键,删除重复的 record_id 的记录) select min(id) from tb_traffic_wf_record ...

  3. AI 公司与比赛

    科大讯飞 网站:https://www.iflytek.com/ 比赛:http://challenge.xfyun.cn/2019/ AI 大学:https://www.aidaxue.com/ 华 ...

  4. vue + element-ui 国际化实现

    1. 安装组件和插件 cnpm i element-ui -S // 安装elementcnpm i vue-i18n -S //安装i18n 2.将国际化资源放在assets目录下 3.在src下新 ...

  5. JavaScript 和 Java 是完全不同的语言

    JavaScript 和 Java 是完全不同的语言这个是定论,两者是概念http://www.gzaos.com还是设计都不同. JavaScript 在 1995 年由 Brendan Eich ...

  6. [Vuex系列] - Vuex中的getter的用法

    Vuex 允许我们在store中定义“getter”(可以认为是store的计算属性).就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算. g ...

  7. mariadb-server安装问题(Error: MariaDB-common conflicts with 1:mariadb-libs-5.5.60-1.el7_5.x86_64)

    问题:今天在安装mariadb-server包时,提示错误,无法正确安装linux自带的mariadb包,提示错误很明确,是由于MariaDB-common包与mariadb-libs包冲突. 解决办 ...

  8. Splay树详解

    更好的阅读体验 Splay树 这是一篇宏伟的巨篇 首先介绍BST,也就是所有平衡树的开始,他的China名字是二叉查找树. BST性质简介 给定一棵二叉树,每一个节点有一个权值,命名为 ** 关键码 ...

  9. Selenium(七)多窗口切换、等待方法、alert对话框处理

    一.多窗口切换 1.打开百度首页 2.在百度中搜索博客园 3.从搜索结果中跳转到博客园 4.博客园首页和百度搜索页面切换 handle:句柄 二.等待方法 time.sleep(5) 先导入方法 参数 ...

  10. bug提交遵循的规则

    在提交缺陷时,需要遵循以下5个原则: 准确性:缺陷每个组成部分描述准确,不会产生误解,减少“异常”“正常”等模糊词的使用 完整性:复现该缺陷完整的步骤.截图.日志 一致性:按照一致的格式书写全部缺陷信 ...