微服务开发流程及详细案例

文章目录

  • 微服务开发流程及详细案例
    • 一、 微服务示例简介
    • 二、 IDEA创建父Maven工程及子项目
      • 2.1 使用IDEA创建Maven项目
      • 2.2创建子项目模块
      • 2.3父项目引入依赖
    • 三、编写子项目
      • 3.1 写入子项目(order-service和user-service)依赖
      • 3.2创建数据库表
      • 3.2 添加插件MybatisX
      • 3.3 IEDA连接数据库
      • 3.4通过MybatisX插件自动生成项目文件
      • 3.5编写控制类及接口
      • 3.6编写子项目配置文件
      • 3.7 编写项目启动类
    • 四、项目启动以及接口测试
      • 4.1 项目启动
      • 4.2 普通接口测试
      • 4.3 Swagger接口文档测试
    • 五、接口返回结果类编写
      • 5.1新建service-common子项目模块
      • 5.2 修改order-service接口返回类型
      • 5.3 重新启动并测试接口
    • 六、SpringCloud注册中心—Eureka
      • 6.1 新建service-eureka模块
      • 6.2 添加项目依赖
      • 6.3 在需要注册的微服务的pom文件中添加依赖
      • 6.4 编写配置文件
      • 6.5 编写启动类
      • 6.6 启动并测试
    • 七、SpringCloud网关—GateWay
      • 7.1 新建service-gateway模块
      • 7.2 添加项目依赖
      • 7.3 编写配置文件
      • 7.4 添加启动类
      • 7.5 启动项目并测试
    • 八、SpringCloud服务调用—OpenFeign
      • 8.1 要求:
      • 8.2 提供者与消费者
      • 8.3 详细过程
        • 8.3.1 服务消费者(order-service)引入依赖
        • 8.3.2 添加user-service依赖
        • 8.3.3 修改CloudOrder类
        • 8.3.4 修改服务启动类
        • 8.3.5 创建服务调用接口
      • 8.4 启动并测试

一、 微服务示例简介

cloud-demo:父工程,管理依赖

• 子工程 order-service:订单微服务,负责订单相关业务

​ – 接口:根据id查询订单

• 子工程 user-service:用户微服务,负责用户相关业务

​ – 接口:根据id查询用户

要求:

• 订单微服务和用户微服务都必须有各自的数据库,相互独立

• 订单服务和用户服务都对外暴露Restful的接口

• 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库

之后会补充Eureka、GateWay、OpenFeign,使微服务项目更完整。

项目笔记及代码:
百度网盘链接:https://pan.baidu.com/s/15SuZRNdU3co_4Ma_JPcp-w
提取码:6666

二、 IDEA创建父Maven工程及子项目

2.1 使用IDEA创建Maven项目

(这里项目名称路径改为自己的就行)

2.2创建子项目模块

用IDEA创建order-service和user-service

项目结构如下:

2.3父项目引入依赖

引入主要包括SpringBoot、SpringCloud,还包括需要用到的MySql,Mybatis和MybatisPlus,以及接口文档Swagger-Knife4j等

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.rjs.gm</groupId><artifactId>cloud-demo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>order-service</module><module>user-service</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR8</spring-cloud.version><mybatis.starter.version>2.1.2</mybatis.starter.version><mapper.starter.version>2.1.1</mapper.starter.version><mysql.starter.version>5.1.47</mysql.starter.version><mybatis-plus.starter.version>3.4.2</mybatis-plus.starter.version><swagger.version>2.6.1</swagger.version></properties><dependencyManagement><dependencies><!--            springcloud依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--            通用Mapper启动器--><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.starter.version}</version></dependency><!--            mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.starter.version}</version></dependency><!-- spring-boot-devtools热启动依赖包 start--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><version>2.3.7.RELEASE</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.8</version></dependency><!--swagger 自动生成接口文档end--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.starter.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>

三、编写子项目

3.1 写入子项目(order-service和user-service)依赖

    <dependencies><!--service-common module依赖  之后会用到--><!--        <dependency>--><!--            <groupId>com.cloud</groupId>--><!--            <artifactId>service-common</artifactId>--><!--            <version>1.0-SNAPSHOT</version>--><!--        </dependency>--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis 和 mybatisplus只能二选一,我这里选择使用mybatisplus--><!--        <dependency>--><!--            <groupId>org.mybatis.spring.boot</groupId>--><!--            <artifactId>mybatis-spring-boot-starter</artifactId>--><!--        </dependency>--><!--erueka客户端依赖,服务注册,之后会用到--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><!--fegin依赖,服务调用,之后会用到--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.18.12.0</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test</scope></dependency></dependencies>

3.2创建数据库表

首先,创建俩个数据表

cloud-user表中初始数据如下:

cloud-order表中初始数据如下:

cloud-order表中持有cloud-user表中的id字段。

3.2 添加插件MybatisX

3.3 IEDA连接数据库

点击右边栏的database(只有专业版IDEA才有,不是专业版自行下载)。选择MySql数据库

3.4通过MybatisX插件自动生成项目文件

目前的子项目目录结构。找到对于表点右键并点击MybatisX-Generator

选择要生成的项目以及生成的目录,我这里为了方便,直接生成到src/main/java下,包名是,entity是实体类文件名,可以自行修改

我这里选择mybatisplus3版本,并选择自动生成注释

生成文件及目录如下:

3.5编写控制类及接口

新建controller目录,并编写订单控制类,这里只编写一个简单查询接口,返回类型先不做限制,之后会介绍具体方法。

@Api(tags = "订单信息接口", description = "提供订单信息的相关 API")
@RestController
//@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping(value = "order")
public class OrderController {/*** 订单*/@Resourceprivate CloudOrderService cloudOrderService;@ApiOperation(value = "查询单个订单信息")@GetMapping("selectOrderById")public String selectPartById(@RequestParam(value = "id") Integer id){CloudOrder cloudOrder = cloudOrderService.getById(id);if (cloudOrder != null) {return cloudOrder.getName();}return "查询出错";}
}

3.6编写子项目配置文件

在resource目录下创建application.yml配置文件

主要包括端口号、数据库信息,还有一些注册中心eureka的相关信息(先不做了解),以及一些mybatis和mybatisplus的配置信息


server:# 服务端口号port: 8082
spring:application:# 服务名称 - 服务之间使用名称进行通讯name: Order-Servicedatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/gm?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8username: rootpassword: root
eureka:client:service-url:# 填写注册中心服务器地址defaultZone: http://127.0.0.1:8081/eureka# 是否需要将自己注册到注册中心register-with-eureka: true# 是否需要搜索服务信息fetch-registry: trueinstance:# 使用ip地址注册到注册中心prefer-ip-address: true# 注册中心列表中显示的状态参数instance-id: ${spring.cloud.client.ip-address}:${server.port}mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.cloud.OrderService.entitymybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.7 编写项目启动类

也是最后一步了,马上就能看到效果了,兄弟们坚持住!

在创建启动类

@SpringBootApplication
@EnableEurekaClient
@EnableSwagger2WebMvc
@MapperScan("com.rjs.gm.mapper")
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}}

user-service与order-sevice创建过程完全一样,端口号设置为8083。这里就不做具体简绍了,具体请看项目源码。

四、项目启动以及接口测试

4.1 项目启动

先打开Services窗口,方便查看多个SpirngBoot项目。

启动order-service和user-service俩个微服务。

报错的话首先看配置文件中数据库信息是否正确,部分报错是因为我们的服务注册还没有编写,不影响我们的使用,先忽略。

4.2 普通接口测试

根据控制类及接口参数等进行接口测试:

控制类接口信息:

测试结果如下:

4.3 Swagger接口文档测试

输入网址http://localhost:8082/doc.html#/打开之前我们专门用到的swagger接口文档,可以很清晰并方便的进行接口测试。

五、接口返回结果类编写

目前我们的返回结果类型仅仅是一个字符串,为了更方便的进行前后端交互以及更好的了解返回实际情况,我们需要专门编写一个返回控制类。

我们将类编写到service-commen子模块中,将以后的公共类以及一些工具类放入此模块中。

5.1新建service-common子项目模块

pom文件中添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud-demo</artifactId><groupId>com.rjs.gm</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>common-service</artifactId><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.11.0</version></dependency></dependencies>
</project>

新建ResultVO类

该返回结果对象类属性包括返回状态码(code)、返回消息(message)、返回数据(data)、返回总记录数(total)【用于分页查询使用】。方法主要包括请求成功、请求失败、没权限等几种函数。

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultVO<T> {public static final Integer SUCCESS = 0;public static final Integer FAILED = 1;public static final Integer ERROR = 2;public static final Integer UNLOG = 3;public static final Integer NOAUTH = 4;//("状态码 0成功 1失败 2服务器出错 3未登录 4没有权限")private Integer code=SUCCESS;private String message;//("返回数据")private T data;private Long total= 1L;private ResultVO() {this.code = SUCCESS;this.message = "请求成功...";}private ResultVO(T data) {this.code = SUCCESS;this.message = "请求成功...";this.data = data;}private ResultVO(T data, Long total) {this.code = SUCCESS;this.message = "请求成功...";this.data = data;this.total = total;}private ResultVO(Integer code, String message) {this.code = code;this.message = message;}private ResultVO(Integer code, String message, T data) {this.code = code;this.message = message;this.data = data;}private ResultVO(Integer code, String message, T data, Long total) {this.code = code;this.message = message;this.data = data;this.total = total;}private ResultVO(Throwable exp){this.code=ERROR;this.message=exp.getMessage();}/*** 请求成功  状态码 1** @param <T> 类型* @return ResultVO*/public static <T> ResultVO getSuccess(T data) {return new ResultVO<T>(data);}/*** 请求成功  状态码 1** @param <T> 类型* @return ResultVO*/public static <T> ResultVO getSuccess(T data, Long total) {return new ResultVO<T>(data,total);}/*** 请求成功  状态码 1** @param <T> 类型* @return ResultVO*/public static <T> ResultVO getSuccess() {return new ResultVO<T>();}/*** 请求成功  状态码 1** @param message  返回信息* @param data 返回对象* @param <T>  类型* @return ResultVO*/public static <T> ResultVO getSuccess(String message, T data) {return new ResultVO<T>(SUCCESS, message, data);}/*** 请求成功  状态码 1** @param message  返回信息* @param data 返回对象* @param <T>  类型* @return ResultVO*/public static <T> ResultVO getSuccess(String message, T data, Long total) {return new ResultVO<T>(SUCCESS, message, data, total);}/*** 请求失败   状态码 0** @param message 返回信息* @param <T> 类型* @return ResultVO*/public static <T> ResultVO getFailed(String message) {return new ResultVO<T>(FAILED, message);}/*** 请求失败  状态 0** @param message  返回信息* @param data 返回数据* @param <T>  类型* @return ResultVO*/public static <T> ResultVO getFailed(String message, T data) {return new ResultVO<T>(FAILED, message, data);}/*** 用户未登录** @param <T> 类型* @return ResultVO*/public static <T> ResultVO getNoLogin() {return new ResultVO<T>(UNLOG, "用户未登录,请重新登录");}/*** 用户没有操作权限** @param <T> 类型* @return ResultVO*/public static <T> ResultVO getNoAuthorization() {return new ResultVO<T>(NOAUTH, "用户没有操作权限,请重新登录");}public static <T> ResultVO getException(Throwable exp) {return new ResultVO<T>(exp);}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Long getTotal() {return total;}public void setTotal(Long code) {this.total = total;}
}

5.2 修改order-service接口返回类型

首先需要在order-service和user-service引入我们的common-service模块的依赖

        <dependency><groupId>com.rjs.gm</groupId><artifactId>common-service</artifactId><version>1.0-SNAPSHOT</version></dependency>

接下来就可以修改我们的控制类接口的返回类型了。

我们重新编写一个查询接口,这次返回一个ResultVO泛型类。

@Api(tags = "订单信息接口", description = "提供订单信息的相关 API")
@RestController
//@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping(value = "order")
public class OrderController {/*** 订单*/@Resourceprivate CloudOrderService cloudOrderService;
//    @ApiOperation(value = "查询单个订单信息")
//    @GetMapping("selectOrderById")
//    public String selectOrderById(@RequestParam(value = "id") Integer id){//        CloudOrder cloudOrder = cloudOrderService.getById(id);
//
//        if (cloudOrder != null) {//            return cloudOrder.getName();
//        }
//
//        return "查询出错";
//    }@ApiOperation(value = "根据id查询单个订单信息")@GetMapping("selectOrderById")public ResultVO<CloudOrder> selectOrderById(@RequestParam(value = "id") Integer id){CloudOrder cloudOrder = cloudOrderService.getById(id);if (cloudOrder != null) {return ResultVO.getSuccess(cloudOrder);}return ResultVO.getFailed("请求出错");}
}

5.3 重新启动并测试接口

普通测试

Swagger测试

部分完结撒花

Java微服务开发流程及详细案例相关推荐

  1. java微服务开发(基础环境篇)

    java微服务开发(基础环境篇) 我们的目标是~~_浩瀚的宇宙 _~~全栈开发 俗话说的好 _工欲善其事 必先利其器 _对于一个开发者来说 一个好的开发环境可以带来的收益是巨大的 本篇的重点主要是li ...

  2. 华为云鲲鹏服务器部署文档-修正版-CentOS+java微服务开发

    华为云鲲鹏服务器部署文档 河南中电高科计算机技术有限公司 http://www.ceht.com.cn 2020.5.12 适用于java微服务开发运行基础软件环境部署,实测通过. CentOS 7. ...

  3. Java微服务开发指南-Java环境下的微服务

    本文涉及的内容,能让你学到什么? 本书适用于开发微服务的Java开发人员和架构师.我们在开始介绍微服务架构前,先讲述一些抽象的基本概念.不幸的是,使用新技术并不能神奇地解决分布式系统问题.但是我们通过 ...

  4. Java微服务开发指南 -- Java环境下的微服务

    Java环境下的微服务 本文涉及的内容,能让你学到什么? 本书适用于开发微服务的Java开发人员和架构师.我们在开始介绍微服务架构前,先讲述一些抽象的基本概念.不幸的是,使用新技术并不能神奇地解决分布 ...

  5. Java微服务开发指南-使用Dropwizard构建微服务

    Dropwizard的历史要早于Spring Boot和WildFly Swarm,它最早是在2011.12发布的v0.1.0版本,在本文编写的过程中,它已经发布了v0.9.2版本,而v1.0.0版本 ...

  6. Golang微服务开发实践

    github: github.com/yun-mu/Micr- 微服务概念学习:可参考 Nginx 的微服务文章 微服务最佳实践:可参考 微服务最佳实践 demo 简介 服务: consignment ...

  7. java 搭建企业应用框架_溯源微服务开发体系:一位Java开发者的转型思考

    作者丨赵钰莹 简单来说,微服务是将大型单体应用程序和服务拆分为数个甚至数十个微服务,可扩展单个组件而不是整个应用程序堆栈,从而满足服务等级协议.然而,这个过程涉及很多问题需要解决,比如拆分原则.容量规 ...

  8. 十款优质企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)

    Java微服务开源项目 前言 一.pig 二.zheng 三.SpringBlade 四.SOP 五.matecloud 六.mall 七.jeecg-boot 八.Cloud-Platform 九. ...

  9. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

最新文章

  1. 旺铺免费,淘宝的义务不能免
  2. 基于瞳孔检测,湖北中学推出人脸支付!网友提出安全投诉,学校:符合法规,无风险...
  3. Golang 匿名结构体及测试代码编写技巧
  4. Asp.Net 2.0中的客户端脚本
  5. [羊城杯 2020]RRRRRRRSA
  6. Java 中判断连接Oracle数据库连接成功
  7. 关于那些表单的验证码
  8. java 树形菜单遍历_java实现遍历树形菜单方法——service层
  9. 『教程』笔记本win7下自建Wifi热点–便于手机Wifi上网 (转 )
  10. [Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)
  11. matlab2c使用c++实现matlab函数系列教程-mean函数
  12. VScode找不到C++万能头文件<bits/stdc++.h>解决办法
  13. 编码器-解码器网络:神经翻译模型详解
  14. Julia也能做爬虫?可以,但没必要
  15. maxscale mysql_安装maxscale MySql读写分离
  16. 新建数据库监听端口被占用
  17. PDA车牌识别/手持机车牌识别SDK—应用处理
  18. 解密古代五大美男的凄惨结局
  19. 博客的WordPress地址(URL)修改后博客打不开解决方法
  20. 致奋斗的年轻人 阿里云在云栖大会等你

热门文章

  1. 回购国内股份,改回中国国籍,93岁的李嘉诚葫芦里卖的什么药?
  2. 固态硬盘母盘制作 linux,Windows系统母盘制作教程
  3. java automapper 使用_AutoMapper入门使用
  4. 数据压缩的历史、常用算法原理
  5. vs2019无法打开文件“libboost_thread-vc141-mt-gd-1_69.lib”
  6. 每日一个小技巧:音频提取软件免费版有哪些?这3款收好了
  7. chunk-vendors.fcca6113.js:1 Uncaught SyntaxError: Unexpected token ‘<‘
  8. 腾讯2021春招面经C++后端开发面试试题
  9. python网络开发_python网络编程相关
  10. 基于Java+MySQL实现(窗体)奖学金信息管理系统【100010179】