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映射文件






    

  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

标准表达式

  • 变量表达式
    ${…}

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

titile: 标题.

Thymeleaf 使用

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

静态资源

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

Spring Boot项目部署

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

微服务架构

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

微服务优缺点

优点

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

缺点

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

熔断

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

Spring Cloud

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

Spring Cloud解决的问题

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

MyBatis-Plus

继承BaseMapper

核心组件

网关

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

服务注册中心 Eureka

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

配置中心

对配置文件统一管理

服务注册中心 Eureka

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

Eureka集群

搭建Eureka集群应用名称一样

服务提供者改造

@Autowired private DiscoveryClient discoveryClient;

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

List 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,
触发熔断,接下来的时间窗口处于熔断降级状态,时间窗口结束后,恢复正常

你可能感兴趣的:(Spring Boot & Spring Cloud)