Spring Boot和Spring Cloud(微服务)学习

1,255 阅读5分钟

Spring Boot 相关注解

  1. @LocalServerPort:启动服务的端口,自动赋值给定义的变量

服务间通讯的方式

  1. 同步通信调用
  • REST Http 通信(对外)-网络中只有字符串可以穿透防火墙(JSON数据传递)
JAX-RS
SpringBoot
  • RPC 远程过程调用(对内 在内网中很快)
Thrift(跨语言框架)
Dubbo(只能用于JAVA)
  1. 异步通信调用
Kafka(无Broker无需对消息做持久化)
Notify
MessageQueue

服务挂了的解决方法

  1. 重试机制
  2. 限流
  3. 熔断机制
  4. 负载均衡
  5. 降级(本地缓存)

分布式锁具备的条件

  1. 在分部署系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
  2. 高可用的获取锁与释放锁
  3. 高性能的获取锁与释放锁
  4. 具备可重入特性(高并发时不影响数据)
  5. 具备锁失效机制,防止死锁
  6. 具备非阻塞锁特性(超时返回信息)

Spring Boot的使用

  1. idea中选择new project选择Spring Initializr

Spring Boot的单元测试

  1. 添加注解
## 使单元测试能够检测到Spring Boot的配置
@SpringBootTest(classes = HelloSpringBootApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

Spring Boot启动时的banner图案修改

Spring Boot的配置文件

Spring Boot的日志配置(LogBack)

Spring Boot 提供的其他模板引擎

  1. FreeMarker
  2. Groovy
  3. Mustache
  4. Thymeleaf
  5. Velocity
  6. Beetl

Spring Boot整合Thymeleaf

  1. 引入Thymeleaf依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
## 添加非严格HTML模式
<dependency>
    <groupId>net.sourceforge.nekohtml</groupId>
    <artifactId>nekohtml</artifactId>
    <version>1.9.22</version>
</dependency>
  1. 添加Thymeleaf的yml相关配置
spring:
  thymeleaf:
    cache: false # 开发时关闭缓存,不然没法看到实时页面
    mode: LEGACYHTML5 # 用费严格的 HTML
    encoding: UTF-8
    servlet:
      content-type: text/html
  1. 创建index.html并引入thymeleaf标签配置
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"></html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<span th:text="${user.username}">张三</span>
</body>
</html>

Spring Boot 整合myBatis(Durid连接池)

  1. 配置mysql和durid连接池
  • 添加mysql和durid依赖
<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>
    <scope>runtime</scope>
</dependency>
  • 添加mysql的yml配置
spring:
datasource:
    druid:
      url: jdbc:mysql://47.112.215.6:3306/myshop/useUnicode=true&characterEncoding=utf-8&userSSL=false
      username: root
      password: 123456
      initial-size: 1
      min-idle: 1
      max-active: 20
      test-on-borrow: true
      driver-class-name: com.mysql.jdbc.Driver
  1. 配置tk.mybatis
  • 引入依赖
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>
  • 添加tk.mybatis配置
mybatis:
  type-aliases-package: com.mrchen.hello.springboot.mybatis.entity
  mapper-locations: classpath:mapper/*.xml
  • 创建一个通用的父级接口(MyMapper.class)
/**
* 自己的Mapper
* 特别注意,该接口不能被扫描到,否则会出错
* <p>Title: MyMapper</p>
* <p>Description: </p>
*
* @author Mrchen
* @version 1.0.0
* @date 2020/5/8 
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper {
}
  1. 整合myBatis分页插件(PageHelper)
  • 引入依赖
 <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.5</version>
</dependency>
  1. 使用MyBatis的maven插件生成代码
  • 添加pom插件配置
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.5</version>
    <configuration>
        <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
        <overwrite>true</overwrite>
        <verbose>true</verbose>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>3.4.4</version>
        </dependency>
    </dependencies>
</plugin>
  • 配置generatorConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <properties resource="jdbc.properties"/>

    <context defaultModelType="flat" id="Mysql" targetRuntime="MyBatis3Simple">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>


        <!-- 生成根Mapper 所有的Mappwe都 继承这个 根   -->
        <!-- 这个地方 注意一下 , 和你配置的 Application上面 MapperScan 的 mapper包扫描 不要再一个文件夹下,
        比如我的 我的包扫描是 @MapperScan("com.jzj.tkdemo.dao") 这个地方是 其他的包
        总而言之就是  BaseMapper 不要放在Mapper的 包扫描中, 具体原因看 下面介绍
        -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.MyMapper"/>
        </plugin>


        <jdbcConnection
                driverClass="${jdbc.driverClass}"
                connectionURL="${jdbc.connectionURL}"
                userId="${jdbc.username}"
                password="${jdbc.password}">
        </jdbcConnection>

        <!-- 生成的数据库实体 PO 所在位置 -->
        <javaModelGenerator targetPackage="com.mrchen.hello.springboot.mybatis.entity"
                            targetProject="src/main/java">
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- MAPPER XML java 文件所在位置-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
        </sqlMapGenerator>

        <!-- Mapper.java 所在的文件夹,也就是mapper接口 文件夹
            1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
            2,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
            3.这个包是 com.jzj.tkdemo.dao  不要把上面的BaseMapper 放在下面 切记切记
        -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.mrchen.hello.springboot.mybatis.mapper"
                             targetProject="src/main/java">
        </javaClientGenerator>


        <!-- user 是数据库表, UserPO 是你根据报表 要生成的 实体类-->
        <!-- 配置需要生成的表, % 代表所有 -->
        <table tableName="%">
            <!-- mysql 配置 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
        </table>

    </context>
</generatorConfiguration>
  • 运行mybatis-generator:generate插件

  1. Spring-boot-mybatis使用测试
  • 在入口处添加扫描mapper注解
    @MapperScan(basePackages = "com.mrchen.hello.springboot.mybatis.mapper")

Spring Cloud的使用

  1. 创建统一的依赖管理
hello-spring-cloud-dependencies
  1. 服务注册与发现(eureka)
  • Spring Boot启动类添加注解(eureka服务端)

  • 添加application.yml配置
spring:
  application:
    name: hello-spring-cloud-eureka

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  1. 创建服务提供者
  • Spring Boot启动类添加注解(eureka客户端)

  • 添加application.yml配置
spring:
  application:
    name: hello-spring-cloud-service-admin

server:
  port: 8762

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  1. 创建服务消费者(Ribbon)
  • Spring Boot启动类添加注解(eureka消费者)

  • 添加application.yml配置
spring:
  application:
    name: hello-spring-cloud-web-admin-ribbon
  thymeleaf:
    cache: false
    mode: LEGACYHTML5
    encoding: UTF-8
    servlet:
      content-type: text/html

server:
  port: 8764

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  • ribbon(负载均衡) + RestTemplate(发出Rest请求)方式请求eureka其它服务接口

  1. 创建服务消费者(Feign-默认结合了ribbon)
  • Spring Boot启动类添加注解

  • 添加application.yml配置
spring:
  application:
    name: hello-spring-cloud-web-admin-feign
  thymeleaf:
    cache: false
    mode: LEGACYHTML5
    encoding: UTF-8
    servlet:
      content-type: text/html

server:
  port: 8765

eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8761/eureka/
  1. ribbon使用Hystrix熔断器
  • SpringBoot中添加注解

  • 添加熔断方法注解并指定熔断方法

  1. feign中使用熔断器(feign自带熔断器)
  • 打开feign熔断器application.yml配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  • 增加feign熔断指定的熔断实现以及注解参数fallback

  1. 熔断器仪表盘(监控熔断)
  • 添加pom依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  • Spring Boot 启动类中添加EnableHystrixDashboard注解

  • 添加配置类

  • 访问仪表盘路径
http://localhost:8765/hystrix
  1. 使用路由网关统一访问接口(API网关-zuul)
  • 添加pom依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  • Spring Boot 启动类中添加注解

  • 添加application.yml配置
spring:
  application:
    name: hello-spring-cloud-zuul

server:
  port: 8769

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

zuul:
  routes:
    api-a:
      path: /api/a/**
      serviceId: hello-spring-cloud-web-admin-ribbon
    api-b:
      path: /api/b/**
      serviceId: hello-spring-cloud-web-admin-feign
  • 配置网管路由失败时的回调

  1. 创建路由网关的服务过滤功能(继承ZuulFilter)
  • 路由的过滤器的四个方法
## fiterType(执行过滤器的时刻)
1. pre:路由之前
2. routing:路由之时
3. post:路由之后
4. error:发送错误调用

## filterOrder
过滤的顺序(0,1,2...)

## shouldFilter
是否需要过滤(true,false)

## run
过滤器的具体业务代码

Spring Cloud分布式配置中心(云配置-Spring Cloud Config)

  • 添加了Spring Cloud分布式配置中心后所有配置文件均以bootstrap.xml命名
## Apollo
## Spring Cloud Config
  1. 构建云配置服务端
  • 添加pom配置
  • Spring Boot启动类中添加开启注解

  • 添加application.yml配置
spring:
  application:
    name: hello-spring-cloud-config
  cloud:
    config:
      label: master
      server:
        git:
          uri: http://47.112.215.6/OhMyGit/spring-cloud-config.git
          search-paths: respo
          username: 365984197@qq.com
          password: 365984197

server:
  port: 8888

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  1. 本地配置改成云配置
  • 添加云配置客户端pom依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  • 添加application.yml配置
spring:
  cloud:
    config:
      uri: http://47.112.215.6/OhMyGit/spring-cloud-config.git
      name: web-admin-feign
      label: master
      profile: dev
  1. 开启Spring Boot profile指定配置文件类型(开发,生产,测试)

  1. 通过命令打包不同的云配置(启动参数)
java -jar hello-spring-cloud-web-admin-feign-1.0.0-SNAPSHOP.jar --spring.profiles.active=pro
  1. Spring Cloud的链路追踪(ZipKin)
  • 添加Spring Boot启动类注解

  • 添加application.yml配置
spring:
  application:
    name: hello-spring-cloud-zipkin

server:
  port: 9411

eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8761/eureka/

management:
  metrics:
    web:
      server:
        auto-time-requests: false
  • 所有需要追踪的项目都要增加依赖及配置
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

spring:
  zipkin:
    base-url: http://localhost:9411
  1. Spring Boot Admin 服务监控
  • 添加Spring Boot启动项注解

  • 添加application.yml配置(服务端)
spring:
  application:
    name: hello-spring-cloud-admin
  zipkin:
    base-url: http://localhost:9411

server:
  port: 8084

management:
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: ["health", "info"]

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  • 被监控的服务所需依赖和配置
<dependency>
    <groupId>org.jolokia</groupId>
    <artifactId>jolokia-core</artifactId>
</dependency>
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>

spring:
  boot:
    admin:
      client:
        url: http://localhost:8084
  • 服务启动顺序
1. 注册与发现
2. 分布式配置中心
3. 链路监控
4. 服务监控
3. 服务提供者
4. 服务消费者
5. API 网关

比较好用的工具

www.bilibili.com/video/BV1mt…