美文网首页
Spring Boot & Spring Cloud

Spring Boot & Spring Cloud

作者: 极速魔法 | 来源:发表于2020-11-16 21:23 被阅读0次

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

    相关文章

      网友评论

          本文标题:Spring Boot & Spring Cloud

          本文链接:https://www.haomeiwen.com/subject/cmzzbktx.html