SpringCloud入门篇

SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶

  • 服务注册与发现 EUREKA
  • 服务调用 NETFLIX OSS RIBBON
  • 服务熔断 HYSTRIX
  • 负载均衡
  • 服务降级
  • 服务消息队列
  • 配置中心管理
  • 服务网关 Zuul
  • 服务监控
  • 全链路追踪
  • 自动化构建部署
  • 服务定时任务调度操作

笨逼从0开始

总父工程–>各个module

IDEA新建project工作空间

1.创建maven项目
SpringCloud入门篇_第1张图片
SpringCloud入门篇_第2张图片设置编码UTF-8
SpringCloud入门篇_第3张图片
注解生效激活

  • 让idea支持lombok编译,不用频繁写get和set方法了,看着清爽
    SpringCloud入门篇_第4张图片
    Java编译版本选择8
    SpringCloud入门篇_第5张图片
    父工程把src删去,修改pom文件
  • 设置pom
  • pom工程:用在父级工程或聚合工程中。用来做jar包的版本控制。
  • war工程:将会打包成war,发布在服务器上的工程。如网站或服务。
  • jar工程:将会打包成jar用作jar包使用。

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.hsw.cloud</groupId>
    <artifactId>springcloud2021</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>
    <description>父工程,统一管理jar包版本</description>

    <!--统一管理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>8.0.18</mysql.version>
        <druid.version>1.1.16</druid.version>
        <druid.spring.boot.starter.version>1.1.10</druid.spring.boot.starter.version>
        <spring.boot.version>2.2.2.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR1</spring.cloud.version>
        <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
        <mybatis-spring-boot-starter.version>2.1.1</mybatis-spring-boot-starter.version>
        <hutool-all.version>5.1.0</hutool-all.version>
    </properties>

    <!--子模块继承后,提供作用:锁定版本+子module不用groupId和version-->
    <dependencyManagement>
        <dependencies>
            <!--springboot 2.2.2-->
            <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 Hoxton.SR1-->
            <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 2.1.0.RELEASE-->
            <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>
            <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>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${
     druid.spring.boot.starter.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${
     mybatis-spring-boot-starter.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${
     lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

知识点:dependencies与dependencyManagement的区别

  • 在我们项目顶层的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
  • 相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
  • dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
  • dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

maven跳过单元测试
SpringCloud入门篇_第6张图片
父工程创建完成执行mvn:insall将父工程发布到仓库方便子工程继承
SpringCloud入门篇_第7张图片

Rest微服务工程搭建

如何构建一个微服务模块

  • 建module
  • 该pom
  • 写YML
  • 主启动
  • 业务类

建module
SpringCloud入门篇_第8张图片建完后父pom新增
SpringCloud入门篇_第9张图片
子pom默认
SpringCloud入门篇_第10张图片
改pom:cloud-provider-payment8001pom文件内容

<?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>springcloud2021</artifactId>
        <groupId>org.hsw.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

<!--    由于是继承只需要写项目名就可以了-->
    <artifactId>cloud-provider-payment8001</artifactId>

    <description>支付模块</description>


    <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>${
     druid.spring.boot.starter.version}</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <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>

写yml

server:
  port: 8001
spring:
  application:
    name: cloud-payment-service
  datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql驱动类
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.hsw.springcloud.entities

主启动类

SpringCloud入门篇_第11张图片
开始写业务逻辑

payment8001业务类编写

建数据库表sql

CREATE TABLE `payment`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `serial` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '支付流水号',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '支付表' ROW_FORMAT = Dynamic;

表对应entities
SpringCloud入门篇_第12张图片
与前端交互的格式(最后转成json传出去)
SpringCloud入门篇_第13张图片
dao

意思一下
SpringCloud入门篇_第14张图片

@Param(“id”)有啥作用?

  • 在xml中写sql时传参#{“id”},详细作用可以百度

对应的编写xml
SpringCloud入门篇_第15张图片

service的编写

SpringCloud入门篇_第16张图片
controller编写

package com.hsw.cloud.controller;

import com.hsw.cloud.entities.CommonResult;
import com.hsw.cloud.entities.Payment;
import com.hsw.cloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@Slf4j  //lombok的注解
public class PaymentController {
     
    @Autowired
    private PaymentService paymentService;

    @PostMapping("/payment/create")
    public CommonResult create(Payment payment){
     
        int result = paymentService.create(payment);
        log.info("结果是-->"+result);
        if(result>0){
     
            return new CommonResult(200,"奥里给!",result);
        }else {
     
            return new CommonResult(444, "阿西吧!");
        }
    }
    @GetMapping("/payment/get")
    public CommonResult getById(@RequestParam("id") Long id){
     
        Payment paymentById = paymentService.getPaymentById(id);
        if(paymentById!=null){
     
            return new CommonResult(200,"奥里给!找到了",paymentById);
        }else {
     
            return new CommonResult(444, "阿西吧!啥也没有");
        }
    }
}

postman测试一波没啥问题

  • 其实有些问题,不过百度可以解决问题不大。

热部署

1.在当前项目中添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

2.再父工程中设置插件

<build>
    <fileName>你自己的工程名字<fileName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <addResources>true</addResources>
            </configuration>
            <version>2.3.5.RELEASE</version>
        </plugin>
    </plugins>
</build>

3.修改设置
SpringCloud入门篇_第17张图片
4.ctrl+shirft+alt+/
SpringCloud入门篇_第18张图片下边两项打勾
SpringCloud入门篇_第19张图片

consumerorder80编写

1.建module
SpringCloud入门篇_第20张图片

2.写pom

  • 复制payment8001即可

3.写yml

SpringCloud入门篇_第21张图片

4.主启动
SpringCloud入门篇_第22张图片

5.写业务

由于是业务对外提供者,只要提供controller供用户调用,至于功能实现调用其他微服务去完成。

  • 只需要增加controller和enttities包就可以了
    SpringCloud入门篇_第23张图片
  • 调用其他服务,初期版本就是HttpClient,这里可以用Spring封装的RestTemplate,所以先注入
    SpringCloud入门篇_第24张图片

@Autowired和@Resource的区别是一个是按类型注入,一个是按名称注入

  • 写Controller(注意注解是RestController,因为返回的是json数据)
    SpringCloud入门篇_第25张图片这时测试create方法虽然返回正确信息,但是实际上没有插入正确的数据
    SpringCloud入门篇_第26张图片在这里插入图片描述

  • 给8001的create方法中添加@ResquestBody注解
    SpringCloud入门篇_第27张图片这时就插入成功了
    在这里插入图片描述

工程重构

  • 问题:代码重复
    SpringCloud入门篇_第28张图片
  • 建一个module:cloud-api-commons
    SpringCloud入门篇_第29张图片
  • 改pom
 <dependencies>
        <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>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>
  • 通用实体抽取出来
    SpringCloud入门篇_第30张图片
  • maven打包:clean,install
    SpringCloud入门篇_第31张图片
  • 改造80和8001端口
    SpringCloud入门篇_第32张图片
    分别给两个module引入依赖
    SpringCloud入门篇_第33张图片
    至此:
    SpringCloud入门篇_第34张图片

你可能感兴趣的:(SpringCloud入门篇)