资讯详情

SpringCloud入门

1. 微服务理论

https://www.martinfowler.com/articles/microservices.html 微服务microservices http://blog.cuicc.com/blog/2015/07/22/microservices/ In short(简言), the microservice architectural style [1] is an approach to developing a single application as a suite of small services【独立应用成为一套小服务】, each running in its own process and communicating with lightweight(轻量级沟通) mechanisms(每一个都运行在自己的进程内(容器)), often an HTTP resource API(用HTTP,将功能写成可接受的请求。. These services are built around business capabilities (独立业务能力)and independently deployable by fully automated deployment machinery(应自动独立部署). There is a bare minimum of centralized management of these services(应该有一个能够管理这些服务的中心), which may be written in different programming languages (语言独立开发)and use different data storage technologies(独立数据存储)

2. 分布式概念

2.1. 分布式是什么?

分布式系统的原理和模型定义:分布式系统是几台独立计算机的集合,对用户来说就像一个单一的相关系统。 分布式系统(distributed system)是建立在网络之上的软件系统。

2.2. 分布式与集群的关系

集群是指将几台服务器集中在一起,实现同一业务。

2.3. 软件架构的演变

在这里插入图片描述 单一应用架构 当网站流量非常小时时,只需要一个应用程序来部署所有功能,以降低部署节点和成本。此时,用于简化工作量的数据访问框架(ORM)是关键。 垂直应用架构 当访问量逐渐增加时,单个应用程序会增加机器带来的加速度,并将应用程序分为几个不相关的应用程序,以提高效率。此时,用于加速前端页面的开发Web框架(MVC)是关键。 分布式服务架构

当垂直应用程序越来越多时,应用程序之间的互动是不可避免的。提取核心业务作为独立服务,逐步形成稳定的服务中心,使前端应用程序能够更快地响应可变的市场需求。此时,分布式服务框架用于改进业务再利用和集成(RPC)是关键。

流动计算架构 当越来越多的服务、容量评估、小型服务资源的浪费等问题逐渐出现时,需要根据访问压力增加调度中心,实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和管理中心(SOA)是关键。

2.4. RPC是什么

RPC【Remote Procedure Call】是指远程过程调用,是过程间通信的一种方式,它是一种技术思想,而不是标准。 它允许程序调用另一个地址空间的过程或函数(通常在共享网络的另一台机器上),而不需要程序员显式编码远程调用的细节。 也就是说,无论程序员调用本地函数还是远程函数,调用代码基本相同。

2.4.1. 解决分布式系统各服务之间的互动问题

2.4.2. RPC思想原理

2.4.3. 服务之间的互动有两种方式

? RPC ? Netty(Socket) 定制序列化 ? RestAPI (严格来说,SpringCloud是使用Rest服务之间的互动不属于RPC) ? HTTP JSON

2.5. 分布式思想和基本概念

2.5.1. 高并发

  1. 许多请求可以通过设计保证系统并行处理。处理大量流量和请求 ? Tomcat多少用户支持并发? Tomcat 默认配置的最大要求是 也就是说,同时支持150 150 并发,当然,也可以改大。 当某个应用程序拥有时 250 应用服务器应考虑应用服务器的集群。 要看硬件的配置,具体能承载多少并发,CPU 性能越高,分配越多 JVM 内存越多,性能越高,但也会加重 GC 的负担。 ? 操作系统对过程中的线程数有一定的限制: Windows 每个过程中的线程数不得超过 2000 Linux 每个过程中的线程数不得超过 1000 另外,在 Java 每次打开一个线程都需要消耗 1MB 的 JVM 用作线程栈的内存空间。 Tomcat 默认的 HTTP 实现采用阻塞式 Socket 通信,每个请求都需要创建一个线程处理。这种模式下的并发量受线程数的限制,但对于 Tomcat 几乎没有 BUG 存在了。 Tomcat 还可以配置 NIO 方式的 Socket 通信在性能上高于阻塞式,每个请求都不需要创建一个线程来处理,并发能力高于前者。但是没有阻塞式的成熟。 这种并发能力也与应用程序的逻辑密切相关。如果逻辑非常复杂,需要大量的计算,那么并发能力必然会下降。如果每个请求都包含大量的数据库操作,那么数据库的性能也非常高。 对于单个数据库服务器,允许客户端连接的数量是有限的。 并发性问题涉及整个系统架构和业务逻辑。 不同的系统环境,Tomcat版本不同、JDK不同的版本,不同的修改设置参数。并发量的差异仍然很大。 ? maxThreads=“1000” 最大并发数 ,默认值为200 ? minSpareThreads=默认值为100 ? acceptCount=“700”// 指定当使用所有可用处理请求的线程数时,可放入处理队列中的请求数。超过此数的请求不予处理,默认值为100 https://tomcat.apache.org/tomcat-8.0-doc/config/http.html
  2. 高并发衡量指标 ? 响应时间(RT) ? 响应请求的时间,即一个http请求返回使用时间 ? 吞吐量 ? 系统在单位时间内处理要求的数量 ? QPS(Query/Request Per Second)、 TPS(Transaction Per Second) ? 每秒查询(请求)数,每秒事务数 ? 专业测试工具:Load Runner ? Apache ab ? Apahe JMeter  并发用户数  承载的正常使用系统功能的用户的数量

2.5.2. 高可用

服务集群部署 数据库主从+双机热备  主-备方式(Active-Standby方式) 主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。  双主机方式(Active-Active方式) 双主机方式即指两种不同业务分别在两台服务器上互为主备状态(即Active-Standby和Standby-Active状态)

2.5.3. 注册中心

保存某个服务所在地址等信息,方便调用者实时获取其他服务信息  服务注册  服务提供者  服务发现  服务消费者

2.5.4. 负载均衡

 动态将请求派发给比较闲的服务器 策略:  轮询(Round Robin)  加权轮询(Weighted Round Robin)  随机Random  哈希Hash  最小连接数LC  最短响应时间LRT

2.5.5. 服务雪崩

服务之间复杂调用,一个服务不可用,导致整个系统受影响不可用

2.5.6. 熔断

某个服务频繁超时,直接将其短路,快速返回mock(模拟/虚拟)值

2.5.7. 限流

限制某个服务每秒的调用本服务的频率

2.5.8. API网关

API网关要做很多工作,它作为一个系统的后端总入口,承载着所有服务的组合路由转换等工作,除此之外,我们一般也会把安全,限流,缓存,日志,监控,重试,熔断等放到 API 网关来做

2.5.9. 服务跟踪

追踪服务的调用链,记录整个系统执行请求过程。如:请求响应时间,判断链中的哪些服务属于慢服务(可能存在问题,需要改善)。

2.5.10. 弹性云

Elastic Compute Service(ECS)弹性计算服务 动态扩容,压榨服务器闲时能力 例如:双11,618,高峰时多配置些服务器,平时减少多余的服务器配置(用于其他服务应用),避免资源浪费

3. SpringCloud背景

3.1. 背景介绍

3.1.1. 微服务架构

物联网( IoT ,Internet of things )即“万物相连的互联网”,是互联网基础上的延伸和扩展的网络,将各种信息传感设备与互联网结合起来而形成的一个巨大网络,实现在任何时间、任何地点,人、机、物的互联互通。 Breaker dashboard 断路器仪表板 Distributed Tracing分布式跟踪 (分布式处理程序链跟踪用于监视网络等待时间,并可视化通过微服务的请求流)

3.1.2. 微服务框架之SpringBoot

https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/

3.1.3. 分布式系统微服务架构之SpringCloud

https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/ 英文困难的同学,也不耽误学习的 https://www.bookstack.cn/read/spring-cloud-docs/docs-index.md

3.1.4. 组件概述

3.2. 关于SpringBoot和SpringCloud版本

3.2.1. SpringCloud版本选择

SpringBoot2.X版和SpringCloud H版 SpringCloud Alibaba 2.1

3.2.2. Springboot版本选择

git源码地址: https://github.com/spring-projects/spring-boot/releases/ SpringBoot2.0新特性: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes 通过上面官网发现,Boot官方强烈建议你升级到2.X以上版本

3.2.3. 官网看Boot版本

springboot(截至2020.4.4)

3.2.4. SpringCloud版本选择

 git源码地址: https://github.com/spring-projects/spring-cloud/wiki  官网: https://spring.io/projects/spring-cloud 官网看Cloud版本  Cloud命名规则 Spring Cloud采用了英国伦敦地铁站的名称来命名,并由地铁站名称字母A-Z依次类推的形式来发布迭代版本。 Spring Cloud 是一个由许多子项目组成的综合项目,各子项目有不同的发布节奏。为了管理SpringCloud与各子项目的版本依赖关系,发布了一个清单,其中包括了某个SpringCloud版本对应的子项目版本。为了避免SpringCloud版本号与子项目版本号混淆,SpringCloud版本采用了名称而非版本号的命名,这些版本的名字采用了伦敦地铁站的名字,根据字母表的顺序来应对版本时间顺序。例如Angel是第一个版本,Brixton是第二个版本。当SpringCloud的发布内容积累到临界点或者一个重大BUG被解决后,会发布一个"service releases"版本,简称SRX版本,比如Greenwich.SR2就是SpringCloud发布的Greenwich版本的第二个SRX版本。  SpringCloud(截至2020.4.4)

3.2.5. SpringCloud和Springboot之间的依赖关系

https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/

最新版本对应关系:截止2020年4月初 https://cloud.spring.io/spring-cloud-static/Hoxton.SR3/reference/html/spring-cloud.html 更详细的版本对应查看方法: https://start.spring.io/actuator/info

3.2.6. SpringCloud(授课选择版本)

o cloud • Hoxton.SR1 o boot • 2.2.2.RELEASE o cloud Alibaba • 2.1.0.RELEASE o java • JAVA8 o maven • 3.5及以上 o mysql • 5.7及以上

3.3. 微服务架构编码构建-IDEA新建project工作空间

3.3.1. 微服务cloud整体聚合父工程Project

1. New Project

2. 聚合总工程名字

3. Maven选版本

4. 工程名字

5. 字符编码

6. 注解生效激活

7. java编译版本

8. File Type过滤【可选】

3.3.2. 父工程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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.atguigu.springcloud</groupId>
  <artifactId>cloud2020</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <!-- 统一管理jar包版本 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.16.18</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.version>1.1.16</druid.version>
    <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
  </properties>

  <!-- 子模块继承之后,提供作用:定版本+子modlue不用写groupId和version -->
  <dependencyManagement>
    <dependencies>
      <!--spring boot 2.2.2-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.2.2.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud Hoxton.SR1-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud alibaba 2.1.0.RELEASE-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.1.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.spring.boot.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <optional>true</optional>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

3.3.3. Maven工程落地细节复习

Maven中的dependencyManagement和dependencies区别 maven中跳过单元测试【可选】

3.3.4. 父工程创建完成执行mvn:install

3.4. 微服务架构编码构建-Rest微服务-【服务提供者】

3.4.1. 建cloud-provider-payment8001

创建完成后请回到父工程查看pom文件变化,增加了聚合模块

  <modules>
    <module>cloud-provider-payment8001</module>
  </modules>

3.4.2. 改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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8001</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
           <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>

3.4.3. 写YML

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root

mybatis:
  mapperLocations: classpath:/mapper/*.xml
  type-aliases-package: com.atguigu.springcloud.entities

3.4.4. 主启动

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class PaymentMain8001 { 
        
    public static void main(String[] args) { 
        
        SpringApplication.run(PaymentMain8001.class,args);
    }
}

3.4.5. 业务类

1. 建表SQL

CREATE DATABASE  IF NOT EXISTS cloud2020 DEFAULT CHARACTER SET utf8 ;

USE cloud2020 ;

DROP TABLE IF EXISTS payment ;

CREATE TABLE payment (
  id BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  SERIAL VARCHAR (300) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE = INNODB AUTO_INCREMENT = 33 DEFAULT CHARSET = utf8 ;

INSERT INTO payment (id, SERIAL) VALUES(31, '尚硅谷001'),(32, 'atguigu002') ;

2. Entitles

1) 主实体Payment

package com.atguigu.springcloud.entities;

import lombok.AllArgsConstructor;
import lombo

标签: zh1032d胀差变送器装置

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台