0
点赞
收藏
分享

微信扫一扫

springCloud(1)【概述和】

花海书香 2022-02-17 阅读 43

文章目录


前言

微服务的概念,特点,优点,缺点
分布式框架的演变过程
springcloud简介和特征

springcloud组件和体系架构

编写一个微服务
Spring Cloud Alibaba的
提示:以下是本篇文章正文内容,下面案例可供参考

一、微服务

1.1、什么是微服务

        微服务(micro service),是一种架构风格,它将一个复杂的应用拆分成多个独立自治的服务,服务与服务间通过松耦合的形式交互。这些服务都可以单独的开发,测试,部署,运行;相互协作,更好完成原来大的业务系统的所有功能。

1.2 、特点

解耦: 服务做了拆分,相互影响会大大降低,符合软件设计的低耦合原则。
组件化: 每个服务都相当于一个独立的组件,可以进行独立升级和扩展,可以被重复使用,节省人力成本。
业务能力强: 职责明确,更专注于某一个业务职责明确,更专注于某一个业务
**自治:**一个微服务就是一个独立的实体,它可以独立部署、升级,服务与服务之间通过REST等形式的标准接口进行通信,并且一个微服务实例可以被替换成另一种实现,而对其它的微服务不产生影响。

敏捷性: 微服务可以敏捷开发(迭代)

1.3、优缺点

优点
易于开发和部署(单个项目)
启动快
局部更新,对整体影响很小
技术不受限制
按需求伸缩
devops 促进开发,运维和测试(质检QA)的协作

缺点
复杂度高:微服务间通过REST、RPC等形式交互,需要考虑被调用方故障、过载、消息丢失等,分布式锁,分布式事务
运维复杂:需要一个设计良好的监控系统对各个微服务的运行状态进行监控。
影响性能:微服务的间通过REST、RPC等形式进行交互,通信的时延会受到较大的影响

二、分布式服务系统框架演变

        随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

2.1.单一应用架构

        当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

2.2.垂直应用架构

        当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

2.3. 分布式服务架构

         当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

2.4.流动计算架构

         当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
在这里插入图片描述
(dubbo官网图能完美说明这个演变过程)

三、spring-cloud

中文官网
微服务架构集大成者,云计算最佳业务实践。Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话,集群状态)。分布式系统的协调导致了样板模式,使用 Spring Cloud 开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心以及 Cloud Foundry 等托管平台。

3.1、特征

  • 分布式/版本话配置
  • 服务注册和发现
  • 路由
  • 服务到服务调用
  • 负载均衡
  • 断路器
  • 全局锁
  • 领导选举和集群状态
  • 分布式信息传递

3.2、主要组件,结构和版本号

在这里插入图片描述

服务注册中心(服务注册和发现)

eureka :一个基于rest的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
nacos :Nacos致力于帮助你发现配置 和管理微服务。

服务路由(网关)

  • zull:zull是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。
  • gateway:该项目提供了一个库,用于在 Spring WebFlux 之上构建 API 网关。Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由到 API,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。

服务熔断器

  • hystrix:熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。(一个坏了知道调控到好的服务中)
  • sentinel:流量控制和访问降级,短路和系统自适应保护

消息队列(异步)

  • kafka:kafka是由apache软件基金会开发的一个开源流处理框架,由JAVA和scala语言编写。是一个高吞吐量的分布式的发布和订阅消息的一个系统。Kafka® 用于构建实时的数据管道和流式的app.它可以水平扩展,高可用,速度快,并且已经运行在数千家公司的生产环境。

服务到服务调用(同步)

  • ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用
  • open feign:Feign是一种声明式、模板化的HTTP客户端。

版本号

在这里插入图片描述

GA = General Availability,通用版本 一般可用性(发布); 应该非常稳定,功能齐全
SR = Server RELEASE 服务发布版本(主要版本之后的后续维护版本-RELEASE)
RC = Release Candidate 候选版本

四、微服务案例

4.1、微服务规划

父子项目(以springboot为基础)
        父: springcloud_demo_20220217(方便jar包管理 type=‘pom’)
        注册中心eureka:
                子项目(单机版注册中心-独立模式): eureka_registry (14110)
                        子子项目(HA(High Available)注册中心):
                        registry_a(14111)
                        registry_b(14112)
                        registry_c(14113)
nacos 默认端口:8848(独立项目之外的)
微服务:(springboot+mybatis):
                子项目micro_services(统一管理微服务的jar包)
                子子项目:
                        订单管理(3个项目,目的讲解ribbon和open feign负载均衡)
                                order_sever_a(14121) 订单管理1(真正开发,开发一份代码,部署3个服务器)
                                order_server_b(14122) 订单管理2
                                order_server_c(14123) 订单管理3
                        商品管理(讲解ribbon)
                                goods_server_ribbon (14131)
                        sns管理(讲解feign)
                                sns_server_feign (14132)
                        营销活动管理(讲解ribbon的hystrix路由熔断)
                                market_server_ribbon_hystrix(14141)
                                market_server_ribbon_sentinel(14142)
                        会员服务管理(讲解feign的hystrix路由熔断)
                                member_server_feign_hystrix(14143)
                                member_server_feign_sentinel(14144)
        路由过滤中心
                子项目: zuul_server(14151)
                子项目: gateway_server(14152)
        配置中心
                子项目: config_server(14160)
                        nacos 默认端口:8848(独立项目之外的)

4.2、搭建父子工程

pom配置properties


    <!-- 常量属性配置  版本管理   -->
    <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>
            <spring-boot.version>2.3.4.RELEASE</spring-boot.version>
            <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
            <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
            <mybatis-plus.version>3.4.0</mybatis-plus.version>
            <mybatis-plus-extension.version>3.4.0</mybatis-plus-extension.version>
            <hutool.version>5.7.18</hutool.version>
            <swagger.fox.version>3.0.0</swagger.fox.version>
            <swagger-spring-boot>2.0.2.RELEASE</swagger-spring-boot>
            <nacos.version>2.0.3</nacos.version>
            <fastjson.version>1.2.78</fastjson.version>
            <mysql.version>5.1.10</mysql.version>
            <lombok.version>1.18.22</lombok.version>
            <druid.version>1.2.8</druid.version>
            <pagehelper.version>1.4.1</pagehelper.version>

    </properties>

pom的dependencyManagement

 <!--dependencies 会直接引入包 dependencyManagement会按需引入
    子项目直接继承父项目版本号 -->
    <dependencyManagement>
    <dependencies>
    <!-- spring boot 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <!-- spring cloud 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <!-- spring cloud alibaba 依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring-cloud-alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <!--springboot整合mybatis包-->
    <!-- <dependency>-->
    <!-- <groupId>org.mybatis.spring.boot</groupId>-->
    <!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
    <!-- <version>2.2.1</version>-->
    <!-- </dependency>-->
    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>${mybatis-plus.version}</version>
    </dependency>
    <!--mybatis-plus扩展包-->
    <!-- <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>${mybatis-plus-extension.version}</version>
    </dependency>-->
    <!--简化entity写法包-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
    <!-- mysql驱动包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    <!--测试包-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>${spring-boot.version}</version>
        <scope>test</scope>
    </dependency>
    <!--druid 连接池 其他常用连接池:dbcp c3p0 proxool -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
        <version>${druid.version}</version>
    </dependency>
        <!-- 分页插件pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>${pagehelper.version}</version>
        </dependency>
        <!-- 分页插件pagehelper -->
        <!-- swagger2 -->
        <!-- <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.fox.version}</version>
        </dependency>
        <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.fox.version}</version>
        </dependency>-->
        <!-- swagger-spring-boot-starter -->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>${swagger-spring-boot}</version>
        </dependency>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
    </dependencies>
    </dependencyManagement>

知识点-----------------------------------------------------------------------------
当没有子项目引入jar包的时候jar包的配置会变成红色 不影响
dependencyManagement和dependencies区别:

  • dependencies: 自动引入声明在dependencies里的所有依赖,并默认被所有的子项目继承。如果项目中不写依赖项,则会从父项目继承(属性全部继承)声明在父项目dependencies里的依赖项。
  • dependencyManagement里只是声明依赖, 子项目按需依赖。只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom。 如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

dependency中type属性:引入包的类型 默认为jar 当为pom时,作用为需要引入很多jar包的时候会导致pom.xml过大,可以定义一个父项目,通过type=pom把父项目的所有包都可以引入,选择性使用。

dependency中scope属性: 打包范围,有以下选项:

  • provided,类似compile,期望JDK、容器或使用者会提供这个依赖。
  • runtime, 在运行时使用,如JDBC驱动,适用运行和测试阶段。
  • test 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
    打包命令示例: mvn package -Dmaven.test.skip=true
  • system, 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
  • import, 引入一个父类项目pom,选择性的继承,达到类似parent标签的作用,解决了单继承问题

4.3、一个微服务工程

  1. 数据库表
CREATE TABLE tb_order (
id int(11) PRIMARY key NOT NULL AUTO_INCREMENT COMMENT '订单id' ,
member_id int(10) NOT NULL ,
shop_id int(10) NULL DEFAULT NULL ,
group_promotion_id int(10) NULL DEFAULT NULL COMMENT '拼团活动ID' ,
coupon_id int(10) NULL DEFAULT NULL COMMENT '促销活动ID' ,
order_sn varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单编号' ,
member_username varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户帐号' ,
total_amount decimal(10,2) NULL DEFAULT NULL COMMENT '订单总金额'
);
  1. 创建 micro_services引入jar包
      <!--springboot web包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--springboot整合druid包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <!--mysql驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
<!--        lombok 减化实体写法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- mybatis plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <!-- swagger-spring-boot-starter -->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
        </dependency>
  1. 创建子项目order_server_a 编写配置文件
#服务端口号
server:
  port: 14121
  #配置项目范围名称
#  servlet:
#    context-path:

#阿里druid 配置连接池
spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/db_qy141?serverTimezone=GMT%2B8&yesSSL
      username: root
      password: '04161220'
      initial-size: 5
      max-active: 20
      min-idle: 10
      max-wait: 10
  application:
    #当前应用的名称 注册后 注册中心 会显示 名称  其他 服务调用的时候也是用该名称
    name: orderService
  #xml配置
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  #控制台输出配置
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #包别名配置
  type-aliases-package: com.aaa.os.entity

#swagger配置
swagger:
  base-package: com.aaa.os.controller
  title: "电商项目-订单模块"
  description: "描述"
  version: "3.0"
  contact:
    name: "AAA"
    email: "test@163.com"
    url: "https://www.baidu.com"
  terms-of-service-url: "服务条款:https://www.baidu.com"

  1. EasyCode自动生成代码 编写 mybatis plus分页插件
package com.aaa.os.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2022/2/17 9:34
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        return interceptor;
    }
}

  1. 测试
    http://localhost:14121/order/selectAll
  2. 加入swagger

上面已经加过jar包了
yml配置 swagger

#swagger配置
swagger:
  base-package: com.aaa.os.controller
  title: "电商项目-订单模块"
  description: "描述"
  version: "3.0"
  contact:
    name: "AAA"
    email: "test@163.com"
    url: "https://www.baidu.com"
  terms-of-service-url: "服务条款:https://www.baidu.com"

  1. 启动类配置
    @EnableSwagger2 //开启swagger
  2. 测试
    http://localhost:14121/swagger-ui/index.html
举报

相关推荐

0 条评论