Spring Boot 相关注解
- @LocalServerPort:启动服务的端口,自动赋值给定义的变量
服务间通讯的方式
- 同步通信调用
- REST Http 通信(对外)-网络中只有字符串可以穿透防火墙(JSON数据传递)
JAX-RS
SpringBoot
Thrift(跨语言框架)
Dubbo(只能用于JAVA)
- 异步通信调用
Kafka(无Broker无需对消息做持久化)
Notify
MessageQueue
服务挂了的解决方法
- 重试机制
- 限流
- 熔断机制
- 负载均衡
- 降级(本地缓存)
分布式锁具备的条件
- 在分部署系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
- 高可用的获取锁与释放锁
- 高性能的获取锁与释放锁
- 具备可重入特性(高并发时不影响数据)
- 具备锁失效机制,防止死锁
- 具备非阻塞锁特性(超时返回信息)
Spring Boot的使用
- idea中选择new project选择Spring Initializr
Spring Boot的单元测试
- 添加注解
@SpringBootTest(classes = HelloSpringBootApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
Spring Boot启动时的banner图案修改
Spring Boot的配置文件
Spring Boot的日志配置(LogBack)
Spring Boot 提供的其他模板引擎
- FreeMarker
- Groovy
- Mustache
- Thymeleaf
- Velocity
- Beetl
Spring Boot整合Thymeleaf
- 引入Thymeleaf依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
- 添加Thymeleaf的yml相关配置
spring:
thymeleaf:
cache: false
mode: LEGACYHTML5
encoding: UTF-8
servlet:
content-type: text/html
- 创建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连接池)
- 配置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>
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
- 配置tk.mybatis
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
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 {
}
- 整合myBatis分页插件(PageHelper)
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
- 使用MyBatis的maven插件生成代码
<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>
<?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插件
- Spring-boot-mybatis使用测试
- 在入口处添加扫描mapper注解
@MapperScan(basePackages = "com.mrchen.hello.springboot.mybatis.mapper")
Spring Cloud的使用
- 创建统一的依赖管理
hello-spring-cloud-dependencies
- 服务注册与发现(eureka)
- Spring Boot启动类添加注解(eureka服务端)
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/
- 创建服务提供者
- Spring Boot启动类添加注解(eureka客户端)
spring:
application:
name: hello-spring-cloud-service-admin
server:
port: 8762
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
- 创建服务消费者(Ribbon)
- Spring Boot启动类添加注解(eureka消费者)
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其它服务接口
- 创建服务消费者(Feign-默认结合了ribbon)
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/
- ribbon使用Hystrix熔断器
- feign中使用熔断器(feign自带熔断器)
- 打开feign熔断器application.yml配置
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
- 增加feign熔断指定的熔断实现以及注解参数fallback
- 熔断器仪表盘(监控熔断)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- Spring Boot 启动类中添加EnableHystrixDashboard注解
http://localhost:8765/hystrix
- 使用路由网关统一访问接口(API网关-zuul)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
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
- 创建路由网关的服务过滤功能(继承ZuulFilter)
1. pre:路由之前
2. routing:路由之时
3. post:路由之后
4. error:发送错误调用
过滤的顺序(0,1,2...)
是否需要过滤(true,false)
过滤器的具体业务代码
Spring Cloud分布式配置中心(云配置-Spring Cloud Config)
- 添加了Spring Cloud分布式配置中心后所有配置文件均以bootstrap.xml命名
- 构建云配置服务端
- 添加pom配置
- Spring Boot启动类中添加开启注解
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/
- 本地配置改成云配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
spring:
cloud:
config:
uri: http://47.112.215.6/OhMyGit/spring-cloud-config.git
name: web-admin-feign
label: master
profile: dev
- 开启Spring Boot profile指定配置文件类型(开发,生产,测试)
- 通过命令打包不同的云配置(启动参数)
java -jar hello-spring-cloud-web-admin-feign-1.0.0-SNAPSHOP.jar --spring.profiles.active=pro
- Spring Cloud的链路追踪(ZipKin)
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
- Spring Boot Admin 服务监控
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…