Spring Boot & Spring Cloud

Spring Boot

约定优于配置

约定优于配置是一种软件设计范式,就是遵循约定

Spring 解决SSM的问题

  • 起步依赖,将具备某种功能的依赖坐标打包
  • 自动配置,springboot 自动配置bean,可以直接使用

Spring入门

spring-boot-starter-parent

  1. 指定项目编码utf-8
  2. 指定JDK1.8 版本
  3. 对项目依赖的版本进行管理,当前项目引入其他常用依赖不需要指定版本号
  4. 默认的资源过滤和插件管理

spring-boot-starter-web

引入 spring web和spring mvc 相关的依赖

SpringBoot的启动类

SpringBoot的启动类通常放在二级包中,比如:com.lagou.SpringBootDemo1Application 。 因为SpringBoot项目在做包扫描,会扫描启动类所在的包及其子包下的所有内容。

//标识当前类为SpringBoot项目的启动类 
@SpringBootApplication 
public class SpringBootDemo1Application {

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

整合mybatis

注解方式

  1. 创建一个对t_comment表数据操作的接口CommentMapper
public interface CommentMapper { 
    @Select("SELECT * FROM t_comment WHERE id =#{id}")  public Comment findById(Integer id); 
}
  1. 在Spring Boot项目启动类上添加@MapperScan("xxx")注解
@SpringBootApplication 
@MapperScan("com.lagou.mapper") 
public class Springboot02MybatisApplication {
    public static void main(String[] args){ 
SpringApplication.run(Springboot02MybatisApplication.class, args); 
}
}

配置文件方式

  1. 创建一个用于对数据库表t_article数据操作的接口ArticleMapper
@Mapper 
public interface ArticleMapper { 
    public Article selectArticle(Integer id);
}
  1. 创建XML映射文件
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.lagou.mapper.ArticleMapper">

    <select id="selectArticle" resultType="Article">

        select * from Article 
    </select>
</mapper>
  1. 配置XML映射文件路径
mybatis:
    #配置MyBatis的xml配置文件路径 
    mapper-locations: classpath:mapper/*.xml #配置XML映射   #文件中指定的实体类别名路径 
    type-aliases-package: com.lagou.base.pojo

单元测试

@SpringBootTest,标记当前类为SpringBoot测试类,加载项目的ApplicationContext 上下文环境
@RunWith(SpringRunner.class) 指定运行器,

热部署

  1. 添加SpringBoot热部署依赖
  2. 开启idea自动编译,Settings->Compiler->Build project automatically
  3. 开启idea运行中自动编译,Mac option+Command+Shift+/, Win Ctrl+Shift+Alt+/,勾选 compiler.automake.allow.when.app.running

全局配置文件

  • application.properties
  • application.yaml
  • application.yml
    application.yml,application.properties,application.yaml可以共存
    加载顺序 yml < yaml < properties,后加载的会覆盖先加载文件中相同配置的内容

@ConfigurationProperties(prefix=“person”),配置文件中所有以person开头的配置信息注入当前类

  • 配置文件person的属性和实体类属性名一致
  • Person类属性有set方法

@Value注解

支持基本数据类型和String。${person.name} 取出配置文件中的person.name注入

@Value(“${person.name}”)
private String name;

加载自定义配置文件

@PropertysSource("classpath:my.properties") // 自定义配置文件 my.properties
@ConfigurationProperties(prefix=“person”) //属性值注入
class Product {
    ...
}

配置类

// 标识当前类是配置类,springboot会扫描该类,所有标识@Bean注解返回值注入容器
@Configuration 
public class MyConfig {
    @Bean
    public MyService myservice(){
        return new MyService();
    }
}
// 测试配置类是否成功,ApplicationContext导入spring包
@Autowired private ApplicationContext applicationContext; @Test 
public void iocTest(){
    System.out.println(
        applicationContext.containsBean("myService)); 
}

SpringBoot原理剖析

依赖管理

springboot项目 → spring-boot-starter-parent → spring-boot-dependeencies(定义了依赖版本,引入其他相关依赖,可以不指定版本)

SpringBoot视图

Thymeleaf

标准表达式

  • 变量表达式
    ${…}

  • 选择变量表达式
    *{…},选定对象取属性值

<div th:object="${book}"> 
<p>titile: <span th:text="*{title}">标题</span>.</p> 
</div>
  • 消息表达式
    #{…}

  • 链接URL表达式,引入资源或页面跳转
    @{…}
    <a th:href="@{/jorder/details(orderId=${o.id},pid=${p.id})}">

  • 片段表达式,引入模板中的片段
    ~{…}

Thymeleaf 使用

template中的页面不能直接访问,需要通过控制器

静态资源

SpringBoot 依次从resouces目录下的public,resouces,static 寻找静态资源

Spring Boot项目部署

  1. 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中;可以使用maven的 package 命令
  2. 部署:java -jar 包名

微服务架构

服务拆分粒度更小,关键在于微小,独立,轻量级通信

微服务优缺点

优点

  • 微服务很小,便于特定业务功能聚焦
  • 解耦,实施敏捷开发
  • 重用和模块组装
  • 微服务独立,松耦合

缺点

  • 分布式复杂难以管理,治理困难
  • 分布式链路追踪难

熔断

熔断即断路保护。下游服务访问压力过大,上游服务切断对下游服务调用,保护系统可用性

Spring Cloud

一系列框架的有序集合,是一个规范(有哪些功能组件,组件之间怎么配合)。利用springboot 简化了分布式系统基础设施的开发。

Spring Cloud解决的问题

  • 微服务服务注册发现
  • 熔断
  • 服务调用
  • 负载均衡
  • 选举和集群管理
  • 分布式消息传递平台

MyBatis-Plus

继承BaseMapper<T>

核心组件

网关

所有服务的入口,每个请求都会到达网关

服务注册中心 Eureka

微服务的名称,IP,端口号

配置中心

对配置文件统一管理

服务注册中心 Eureka

本质是为了解耦服务提供者和服务消费者

Eureka集群

搭建Eureka集群应用名称一样

服务提供者改造

@Autowired private DiscoveryClient discoveryClient;

//1.获得Eureka中注册的lagou-service-product实例集合

List<ServiceInstance> instances = discoveryClient.getInstances("lagou-service-product");

//2.获得实例集合中的第一个 
ServiceInstance instance = instances.get(0); 
//3.根据实例信息拼接IP地址 
String host = instance.getHost(); 
int port = instance.getPort(); 
String url = "http://"+host+":"+port+"/product/query/"+id;

Eureka元数据

  1. 标准元数据 主机名,ip,端口
  2. 自定义元数据 eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式

Ribbon负载均衡

客户端负载均衡
负载均衡策略:
默认区域权衡策略:先过滤,再轮训

服务雪崩效应

是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不 可用逐渐放大的现象。
扇入:该服务被调用
扇出:该服务对下游调用

雪崩效应解决方案

  • 服务熔断
  • 服务降级
@HystrixCommand( // 线程池标识,要保持唯一,不唯一的话就共用


 // commandProperties熔断的一些细节属性配置commandProperties = {

// 每一个属性都是一个HystrixProperty 
    @HystrixProperty(name = 
    }, 
    // 回退方法
    fallbackMethod = "myFallBack"
)
@RequestMapping("/getPort3") public String getProductServerPort3() {

String url = "http://lagou-service-product/server/query";

return restTemplate.getForObject(url, String.class); }
/* 定义回退方法,返回预设默认值 * 注意:该方法形参和返回值与原始方法保持一致 */ 
public String myFallBack() { return "-1"; // 兜底数据 }
  • 服务限流

Hystrix

Hystrix舱壁模式

不进行任何设置,所有熔断方法使用一个Hystrix线程
池(10个线程)
queueSizeRejectionThreshold属性,这个属性是控制队列最大阈值的,而Hystrix默认只配置了5个

Feign远程调用

轻量级RESTful 风格的HTTP 服务客户端(发起请求,远程调用)
Fegin = RestTemplate+ Ribbon+Hystrix

将调用一个 微服务的信息都定义在一个Feign接口中。

对熔断器支持

设置超时时间 Ribbon Hystrix ,熔断的时候是根据这两个时间的最小 值来进行的。

GateWay

#网关的配置 cloud:

gateway:

  routes: #配置路由
    - id: service-page-router 
      uri: http://127.0.0.1:9100 
      predicates: #当断言成功后,交给某一个微服务处理时使用的是转发
        - Path=/page/** 
    - id: service-product-router 
      uri: http://127.0.0.1:9000 
      predicates:
        - Path=/product/** 
      filters:

# http://127.0.0.1:9300/product/service/port--> /service/port -->商品微服务

        - StripPrefix=1 #去掉uri中的第一部分,所以就要求我们通过网关访问的时候,把uri 的第一部分设置为product,从uri的第二部分开始才是真正的uri

网关过滤器

实现自定义过滤器,要实现GlobalFilter,Ordered(过滤顺序)接口

Spring Cloud Config分布式配置中心

config和bus实现配置自动更新

实现一次通知,处处生效
在微服务架构中,结合消息总线(Bus)实现分布式配置的自动更新(Spring Cloud Config + Spring Cloud Bus)

Spring Cloud Alibaba

Nacos

Nacos数据模型

一个命名空间中可以定义多个group,各个分组相互隔离。
一个group可以定义多个 service/dataid

Namespace + Group + Service 如同 Maven 中的GAV坐标,GAV坐标是为了锁定Jar,而这里是为了锁定服务
Namespace + Group + DataId 如同 Maven 中的GAV坐标,GAV坐标是为了锁定Jar,而这里是为了锁定配置文件

流量防卫兵Sentinel

流量控制,熔断降级

链路限流

指定入口资源,进行限流统计时,只统计入口进来的流量

Warm Up 预热

场景项目刚上线时,缓存还没有加载。预热时长默认为秒,10s内属于预热期,预热期的阈值是设定阈值的 1/3

降级

流控是对外部来的大流量进行控制,熔断降级的视角是对内部问题进行处理。

RT: 请求平均的响应时间
访问一个资源,1s持续进入 5个或以上请求,平均响应时间 > RT,
触发熔断,接下来的时间窗口处于熔断降级状态,时间窗口结束后,恢复正常

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容