SpringCloud(三)了解了概念,现在来验证一下,玩个小案例

案例说明

按照普通方式模拟一个微服务之间的调用,后续将一步步使用Spring Cloud的组件对案例进行改造。

需求:

完整业务流程图:

案例数据库环境准备

CREATE TABLE products(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(50), #商品名称price DOUBLE, flag VARCHAR(2), #上架状态goods_desc VARCHAR(100), #商品描述images VARCHAR(400), #商品图片goods_stock INT, #商品库存goods_type VARCHAR(20) #商品类型
);

基于SpringBoot来构造工程环境,工程模块关系如下所示:

父工程 szx-parent

<!--父工程打包方式-->
<packaging>pom</packaging>
<!--spring boot 父启动器依赖-->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version>
</parent>
<dependencies><!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--日志依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><!--测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--lombok工具--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version><scope>provided</scope></dependency><!-- Actuator可以帮助你监控和管理Spring Boot应用--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>
</dependencies>
<build><plugins><!--编译插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>11</source><target>11</target><encoding>utf-8</encoding></configuration></plugin><!--打包插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>

公共组件微服务

<?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>szx-parent</artifactId><groupId>com.szx</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>szx-service-common</artifactId><dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version></dependency><!--pojo持久化使用--><dependency><groupId>javax.persistence</groupId><artifactId>javax.persistence-api</artifactId><version>2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency></dependencies></project>
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "products")
public class Products implements Serializable {@Id@Column(name = "id")private int id;private String name;private double price;private String flag;private String goodsDesc;private String images;private long goodsStock;private String goodsType;}

商品微服务

商品微服务是服务提供者,页面静态化微服务是服务的消费者

在商品微服务的pom文件中,引入公共组件坐标

<dependencies><dependency><groupId>com.szx</groupId><artifactId>szx-service-common</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>

在 application.properties 文件中配置端口、应用名、数据库连接等信息

#配置端口号,在微服务的集群环境中,通常会为每一个微服务叠加
server.port=9000#微服务中的唯一标识
spring.application.name=szx-service-product#MySQL数据库连接配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123

Mapper接口开发

/*** @Program: springclouddemo* @Author: XiaoXing* @Create: 2021-02-03 21:23* @Description: Product连接数据接口*      现在使用Mybatis-plus组件,该组件是Mybatis的加强版*      能给与SpringBoot进行非常友好的整合*      对比Mybatis框架只有使用便捷的改变*      没有具体功能的改变*      具体使用:只需要让Mapper接口继承BaseMapper即可**/
public interface ProductMapper extends BaseMapper<Products> {}

serive层开发

public interface ProductService {/*** 通过商品Id查询商品接口* @param id* @return*/public Products selectProductById(Integer id);}
@Service("productService")
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Overridepublic Products selectProductById(Integer id) {return productMapper.selectById(id);}}

controller层开发

@RestController
@RequestMapping("/product")
public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("/selectProductById/{id}")public Products selectProductById(@PathVariable Integer id){return productService.selectProductById(id);}}

启动类

@SpringBootApplication
@MapperScan("com.szx.mapper")
public class ProductApplication {public static void main(String[] args) {SpringApplication.run(ProductApplication.class,args);}}

页面静态化微服务

<?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>szx-parent</artifactId><groupId>com.szx</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>szx-service-page</artifactId><dependencies><dependency><groupId>com.szx</groupId><artifactId>szx-service-common</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
#配置端口号,在微服务的集群环境中,通常会为每一个微服务叠加
server.port=9100#微服务中的唯一标识
spring.application.name=szx-service-page#MySQL数据库连接配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123#开启驼峰命名
mybatis-plus.configuration.map-underscore-to-camel-case=true
@SpringBootApplication
public class PageApplication {public static void main(String[] args) {SpringApplication.run(PageApplication.class,args);}/*** 向容器中注入一个RestTemplate,封装了HttpClient* @return*/@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}}
@RestController
@RequestMapping("/page")
public class PageController {private static final String PRODUCTURL = "http://localhost:9000/product/selectProductById/";@Autowiredprivate RestTemplate restTemplate;@GetMapping("/getProduct/{id}")public Products getProduct(@PathVariable Integer id){//发送http请求给商品微服务,将id传递过去,获取id所对应的Product对象Products products = restTemplate.getForObject(PRODUCTURL + id, Products.class);return products;}}

案例代码问题分析

我们在页面静态化微服务中使用RestTemplate调用商品微服务的商品状态接口时(Restful API 接口)。在微服务分布式集群环境下会存在什么问题呢?怎么解决?

存在的问题

1)在服务消费者中,我们把url地址硬编码到代码中,不方便后期维护。

2)服务提供者只有一个服务,即便服务提供者形成集群,服务消费者还需要自己实现负载均衡。

3)在服务消费者中,不清楚服务提供者的状态。

4)服务消费者调用服务提供者时候,如果出现故障能否及时发现不向用户抛出异常页面?

5)RestTemplate这种请求调用方式是否还有优化空间?能不能类似于Dubbo那样玩?

6)这么多的微服务统一认证如何实现?

7)配置文件每次都修改好多个很麻烦!?

8)…

上述分析出的问题,其实就是微服务架构中必然面临的一些问题:

1)服务管理:自动注册与发现、状态监管

2)服务负载均衡

3)熔断

4)远程过程调用

5)网关拦截、路由转发

6)统一认证

7)集中式配置管理,配置信息实时自动更新

这些问题,Spring Cloud 体系都有解决方案

SpringCloud(三)了解了概念,现在来验证一下,玩个小案例相关推荐

  1. JavaScript高级程序设计红宝书学习笔记第三章基本概念

    第三章 基本概念 本章内容 语法 数据类型 操作符 语句 函数 3.1 语法 3.1.1 区分大小写,ECMAScript中的一切(变量.函数名和操作符)都区分大小写. 3.1.2 标识符 标识符:变 ...

  2. Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)

    Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 理解了这三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 Docke ...

  3. SpringCloud(三):监控中心 hystrix turbine

    SpringCloud(三):监控中心 hystrix turbine 1.介绍 Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我 ...

  4. 树莓派学习(三):安装pytorch并验证

    树莓派学习(三):安装pytorch并验证标题 步骤一:创建一个虚拟环境 步骤二:安装pythorch 步骤三:测试 彩蛋 步骤一:创建一个虚拟环境 conda create --name pytor ...

  5. ACPI Specification 第三章 ACPI概念

    目录 第三章 ACPI 概念... 2 3.1系统电源管理... 3 3.2电源状态... 3 3.2.1电源按钮... 4 3.2.2平台电源管理特点... 5 3.2.2.1移动电脑... 5 3 ...

  6. ML之MLiR:利用多元线性回归法,从大量数据(csv文件)中提取五个因变量(输入运输任务总里程数、运输次数、三种不同的车型,预测需要花费的小时数)来预测一个自变量

    ML之MLiR:利用多元线性回归法,从大量数据(csv文件)中提取五个因变量(输入运输任务总里程数.运输次数.三种不同的车型,预测需要花费的小时数)来预测一个自变量 输出结果 代码设计 from nu ...

  7. c语言中从键盘上输入三个数,将之排序后按由大到小的顺序输出,从键盘上输入3个数,将它们按由大到小的顺序排列好输出...

    vb中从键盘上输入10个数,判断有几个偶数,有几个奇数? 我给你写了,挺简单的.窗体上添加两个label控件一个command控件Dima(1To10)DimbDimcAsIntegerDimdAsI ...

  8. layui自带验证体系:手机号验证、邮箱验证、必填项非空验证、数字验证(含代码、案例)

    layui自带验证体系:手机号验证.邮箱验证.必填项非空验证.数字验证(含代码.案例) 案例 · 截图: 实例代码: <!DOCTYPE html> <html> <he ...

  9. c语言学习-从键盘输入三个数,按照从小到大(或从大到小)的顺序输出

    从键盘输入三个数,按照从小到大(或从大到小)的顺序输出 程序流程图: 代码: #include<stdio.h> void main() {float a,b,c,d; printf(&q ...

  10. HTML+CSS+JavaScript小案例(注册页面表单验证轮播图跳转主页动态表格select联动)

    案例:(表单验证) <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

最新文章

  1. 替换不文明词语和非法字符
  2. 抱歉,你和社会脱节了——对于中国教育的反思
  3. 使用C#检验.NET FrameWork版本
  4. mysql 符_mysql命令操作符
  5. loj 1316(spfa预处理+状压dp)
  6. numpy matlab 索引不同,与Numpy相似的MATLAB数组索引
  7. plsql(轻量版)_流程控制
  8. 怎样的代码算是好代码?
  9. 阿里影业授出1672.5万份购股权
  10. win10调整分区后盘符不见的文件怎样找回
  11. Python2安装说明
  12. 打开文件、网页、文件夹等
  13. java实习生面试题
  14. 操作系统实验Mit6.S081笔记 Lab4: Traps
  15. 【稀饭】react native 实战系列教程之项目介绍
  16. 厉害!不到30行代码,自制成语接龙小游戏
  17. iOS 导航栏遮挡UIViewController问题
  18. 通过图片获取地理位置
  19. 【NLP】自然语言处理的中间序列建模
  20. android adb 电池电量,adb 查看电池状态信息。详解

热门文章

  1. Gerrit触发jenkins构建job后,不能给review的代码Verified+1
  2. Linux网卡驱动分析
  3. 举头望明月打计算机术语,与月亮有关的谜语
  4. The Crime-solving Plan of Groundhog
  5. (附源码)计算机毕业设计SSM基于java学科竞赛管理系统
  6. Crashing Robots
  7. mysql的建表赋权_mysql创建用户并赋权
  8. 【雅思口语】安娜口语学习记录 Part1
  9. ROS2系列知识【5】:从海龟教程开始【1】
  10. 翻遍互联网都找不到的解决方案,一行代码轻松实现 Gitbook 默认折叠左侧菜单效果