SpringCloud学习笔记【松思园】

一、Ideal搭建项目框架

通过ideal工具,建立各个模块功能:主要包括1、父项目;2、api模块,用于数据库相关的对象包装;3、服务中心模块;4、服务提供者模块;5、消费者模块
在这里插入图片描述下面做简单的代码介绍,具体的代码工程,访问gitlab:http://172.30.136.7/blackmatter/springcloudstudy.git

拉取代码后,要修改provider模块中数据库的连接配置, 本地maven仓库的配置。

1.1 springcloud父工程模块

1.1.1 ideal新建maven项目工程,然后删除src目录,因为我们父模块,我们主要用于做模块和依赖的管理:
pom.xml
dependencyManagement 做子模块的依赖管理,这里配置好版本,在子模块用时引用,才会被导入jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.gys</groupId>
    <artifactId>springCloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>spring_cloud_api</module>
        <module>springcloud_provider_8080</module>
        <module>springcloud_consumar_80</module>
        <module>springcloud_eureka_8090</module>
        <module>springcloud_eureka_8091</module>
        <module>springcloud_erueka_8092</module>
    </modules>

    <!--打包方式-->
    <packaging>pom</packaging>
    <!--版本号定义-->
    <properties>
        <mybatisplus.version>3.2.0</mybatisplus.version>
        <junit.version>4.12</junit.version>
        <druid.version>1.1.10</druid.version>
        <lambok.version>1.18.10</lambok.version>
        <log4j.version>1.2.17</log4j.version>
        <logback.version>1.2.3</logback.version>
        <mysql.version>8.0.17</mysql.version>
        <eureka.version>1.4.6.RELEASE</eureka.version>
        <actuator.version>2.1.4.RELEASE</actuator.version>
        <ribbon.version>1.4.6.RELEASE</ribbon.version>
    </properties>

    <!--依赖管理-->
    <dependencyManagement>
        <dependencies>
            <!--springcloud 依赖的包-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>


            <!--springboot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lambok.version}</version>
            </dependency>
            <!--数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatisplus.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.baomidou</groupId>
                        <artifactId>mybatis-plus-generator</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-annotation</artifactId>
                <version>${mybatisplus.version}</version>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>

            <!--eureka-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>${eureka.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>${eureka.version}</version>
            </dependency>

            <!--acturtor-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
                <version>${actuator.version}</version>
            </dependency>
            <!--ribbon-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
                <version>${ribbon.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

1.2 spring_cloud_api模块

该模块主要做数据对象包装模块
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>org.gys</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring_cloud_api</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-annotation</artifactId>
        </dependency>
    </dependencies>
</project>

Dept.java 数据对象
在这里插入图片描述

@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("dept")
public class Dept implements Serializable {
    private Integer id;
    private String dept_name;
    private Integer dept_no;
    private String dept_source;
    public Dept(String dept_name) {
        this.dept_name = dept_name;
    }
}

application.yml

server:
  port: 8080
  servlet:
    context-path: /
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false
spring:
  application:
    name: springcloud-provider-8080
  thymeleaf:
    cache: false
  datasource:
    username: root
    password: "0508"
    url: jdbc:mysql://localhost:3306/db_springcloud?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver

#eureka 的配置
#服务注册到哪里
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka/, http://localhost:8091/eureka/, http://localhost:8092/eureka/
  instance:
    instance-id: springcloud-provider-8080  # 修改eureka上的默认的描述信息
    prefer-ip-address: true #访问路径显示ip地址

#配置actuator
info:
  app.name: gys_spring_cloud
  company.name: sichuanair

1.3 springcloud_provider_8080模块

该模块是服务的提供者,也就是用于做具体的业务处理操作的逻辑,实际业务中,我们会根据不同的业务进行微服务拆分,会有多个模块进行不同的服务提供,该模块使用mybatis-plus、mysql框架
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>org.gys</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>springcloud_provider_8080</artifactId>

    <dependencies>
        <!--服务提供者,导入eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!--        actuator 服务监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.gys</groupId>
            <artifactId>spring_cloud_api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>

省略对应的mapper、service、controller层代码
在这里插入图片描述

1.4 springcloud_eureka_8090、8091、8092 三个模块

这三个模块,是用于做eureka服务中心,多个接口的服务中心相互关联,实现eureka服务中心的集群
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>org.gys</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>springcloud_eureka_8090</artifactId>
    <!--导包-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>

application.yml

server:
  port: 8090

#eureka配置
eureka:
  instance:
    hostname: localhost8090   # Eureka 服务端的实例名称
  client:
    register-with-eureka: false  #标识是否想eureka注册中心注册自己
    fetch-registry: false   #标识自己是否为注册中心
    service-url:   #监控页面
      defaultZone: http://localhost:8091/eureka/,http://localhost:8092/eureka/

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

1.5 spring_cloud_consumar模块

该模块作为客户端,用于对用户提供各种操作,主要用于调用eureka服务中心中的服务
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>org.gys</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud_consumar_80</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.gys</groupId>
            <artifactId>spring_cloud_api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--ribbon-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        <!--eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    </dependencies>

</project>

application.yml

server:
  port: 80
  servlet:
    context-path: /

#eureka 配置
eureka:
  client:
    register-with-eureka: false #不向eureka中注册自己
    service-url:
      defaultZone: http://localhost:8090/eureka/,http://localhost:8091/eureka/,http://localhost:8092/eureka/

二、Eureka

pom.xml

<!--eureka-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>

1.1 eureka原理

        eureka采用了CS的设计架构,有两个组件,分别是eureka client和eureka server。
       Eureka client 是一个Java客户端,用与简化Eureka Server的交互,客户端同时也具备一个内置的,使用轮询(round-robin)的负载均衡器,在pom中引入的是spring-cloud-starter-eureka。
       Eureka server 是提供服务的注册服务,负责管理各各微服务结点的信息和状态,在pom中引入的是spring-cloud-starter-eureka-server;在默认配置中EurekaServer服务在一定时间如果没接受到某个服务的心跳连接后,EurekaServer会注销该服务。但是会存在当网络分区发生故障,导致该时间内没有心跳连接,但该服务本身还是健康运行的情况。Eureka通过“自我保护模式”来解决这个问题,在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例,同时,还会接收新的服务的注册。
       CAP C 强一致性; A 可用性; P分区容错性;著名的CAP理论指出,一个分布式系统不可能同事满足C、A、P ,由于分区容错性P在分布式系统中是必须要保证的,因此我们只能在A和C之间进行权衡。(下面引用狂神的一些总结)
在这里插入图片描述

1.2 eureka集群

       一个eureka服务中心,如果出现服务中心崩盘,那么所有服务都无法获取,这肯定会影响项目正常运行,eureka集群就是用来保证高可用的服务注册中心,多个服务中心,相互关联。
在这里插入图片描述

1.3 eureka集群搭建

本项目中有三个服务中心,端口分别为8090,8091和8092。
在这里插入图片描述
1.3.1 三个服务注册中心的pom中都引入

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>

1.3.2 在启动类上添加注解:@EnableEurekaServer
1.3.3 在hosts文件中添加域名映射
在这里插入图片描述
1.3.3 然后分别配置8090,8091,8092的application.yml文件
8090-------application.yml

server:
  port: 8090

#eureka配置
eureka:
  instance:
    hostname: peer0   # Eureka 服务端的实例名称
    preferIpAddress: false
    lease-renewal-interval-in-seconds: 30
    lease-expiration-duration-in-seconds: 30
  client:
#    register-with-eureka: false  #标识是否想eureka注册中心注册自己
#    fetch-registry: false   # 要不要去注册中心获取其他服务的地址
    service-url:   #监控页面
      defaultZone: http://peer1:8091/eureka/, http://peer2:8092/eureka/

8091-------application.yml

server:
  port: 8091

#eureka配置
eureka:
  instance:
    hostname: peer1   # Eureka 服务端的实例名称
    preferIpAddress: false
    lease-renewal-interval-in-seconds: 30
    lease-expiration-duration-in-seconds: 30
  client:
#    register-with-eureka: false  #标识是否向eureka注册中心注册自己
#    fetch-registry: false   # 要不要去注册中心获取其他服务的地址
    service-url:   #监控页面
      defaultZone: http://peer0:8090/eureka/, http://peer2:8092/eureka/

8092-------application.yml

server:
  port: 8092

#eureka配置
eureka:
  instance:
    hostname: peer2   # Eureka 服务端的实例名称
    preferIpAddress: false
    lease-renewal-interval-in-seconds: 30
    lease-expiration-duration-in-seconds: 30
  client:
#    register-with-eureka: false  #标识是否向eureka注册中心注册自己
#    fetch-registry: false   # 要不要去注册中心获取其他服务的地址
    service-url:   #监控页面
      defaultZone: http://peer0:8090/eureka/, http://peer1:8091/eureka/

1.3.4 在我们的服务client中,要注册到三个服务中心上:

#eureka 的配置
#服务注册到哪里
eureka:
  client:
    service-url:
      defaultZone: http://peer0:8090/eureka/, http://peer1:8091/eureka/, http://peer2:8092/eureka/
  instance:
    instance-id: springcloud-provider-8080  # 修改eureka上的默认的描述信息
    prefer-ip-address: true #访问路径显示ip地址

三、Ribbon

1.1 ribbon原理

    spring cloud ribbon是用来实现客户端的负载均衡的工具。他是一个进程内LB(负载均衡),主要功能是提供客户端的软件负载均衡算法,将NetFlix的中间层服务连接到一起。简单的说就是在配置文件中列出LoadBalancer后面所有的机器,Ribbon会自动帮助基于某种规则(如简单轮询,随机连接等)去连接这些机器,当然也可以使用ribbon实现自定义的负载均衡算法。

1.2 ribbon使用

1.2.1 pom.xml 添加引用

<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>

1.2.2 配置客户端的负载均衡,在RestTemplate的bean上添加一个@LoadBalanced注解即可;
在这里插入图片描述在这里插入图片描述1.2.3 为更好的模拟实际的业务逻辑,我们在多建两个数据库,同时在新建两个服务提供者,配置数据库连接到新增的数据库上,配置对应的服务端口号分别为8081 和 8082;
在这里插入图片描述目前为止的系统模块结构如下:
在这里插入图片描述配置完成之后,在访问服务消费者时,可以发现会在各个服务之间进行轮询调用。刷新3次,会轮询三个查询结果。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.3 自定义ribbon的算法

ribbon默认会使用轮询的算法,来实现负载均衡。
可以自己写负载均衡的策略,主要是 IRule 接口:
void setLoadBalancer 方法为设置策略,里面已经有好几种实现策略:
AvailabilityFilteringRule:会先过滤掉,跳闸,访问故障的服务,对剩下的服务进行轮询;
RoundRobinRule:默认的轮询策略;
WeightedResponseTimeRule:根据配置的权重调用;
RetryRule:会先按照轮询获取服务,如果服务获取失败,则会在指定时间内进行重试;
RandomRule:随机策略;
……
在这里插入图片描述这些策略都继承了:AbstractLoadBalancerRule。自定义的策略,要集成该类;
1.新建自定义的rule;
2.在客户端启动类配置ribbon启动参数,我们自定义的ribbon客户端。(要注意:它不应在主启动类的上下文中,否在就会由所有的@RibbonClients共享,可以采用措施避免,这里我们将其放在一个单独的,不重叠的包中)

四、Feign

1.1 feign介绍

      它是声明式的web service客户端,类似controller调用service,调用微服务的两种方式:1.使用微服务的名字[ribbon];2.接口和注解[feign];
      在实际开发中,由于对微服务的依赖调用不止一处,往往一个接口会被多出调用,所以针对每个微服务通常会自动封装一些客户端来包装这些依赖服务的调用。二Feign在此基础上做了进一步的封装,有它来帮助定义和实现依赖服务接口的定义。我们只需要创建一个接口,并使用注解的方式来配置它(类似于在Dao接口上标注Mapper注解,现在是在一个微服务接口上标注一个Feign注解即可)--------其实feign它的本质还是调用了ribbon

1.2 使用

1.项目新建一个module,命名springcloud_consumar_feign_80。也是客户端消费者,我们这边将使用feign技术。
2.在springcloud-api底层公用模块,新建serivce层,供其他服务调用,跟我们服务提供者里面一样。在service接口中,添加注解@FeignClient,通过value指定服务名

@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER")
public interface DeptService {

    @RequestMapping("/dept/get/{id}")
    public Dept queryByID(@PathVariable("id") int id);

    @RequestMapping("/dept/list")
    public List<Dept> getAll();

}

3.修改我们springcloud_consumar_feign_80模块,服务调用的方式,这是以前的调用,通过名称指定“ private static final String REST_URL = “http://springcloud-provider”; ”,我们通过@Autowired使用接口(这里通过Feign来调用,有时出现,feign接口找不到,注入失败问题,原因是,在启动类中,没有添加扫描的包,要通过@EnableFeignClients() 指定feign接口扫描的包)注意同时,指定springboot启动扫描的包,加载其他的bean
在这里插入图片描述

四、Hystrix

服务雪崩:在微服务中,有一个服务调用时间过长或者无响应,进而引起系统崩溃,所谓的“雪崩效应”。我们要弃帅保车。

服务熔断:就是用来解决服务雪崩的机制,产生的一种微服务链路保护机制;

1.1 介绍

      hystrix是一个用于处理分布式系统的延迟和容错的开源库,他能保证一个服务出问题的情况下,不会导致整体的服务崩溃,避免级联故障,以提高分布式系统的弹性。
      断路器,类似于保险丝,向调用方返回一个服务预期的,可处理的备选相应,而不是长时间的等待或者是抛出异常,这样就可以避免长时间的资源占用,避免故障在分布式系统中的蔓延,导致雪崩。
作用:服务降级、服务熔断、服务限流、接近实时的监控……

hystrix会监控微服务之间的调用情况,当失败的调用达到一定的阀值,缺省值是5s内20次调用失败就会启用服务熔断机制。熔断机制的注解是@HystrixCommand.

1.2 使用

1.新建一个服务提供者(类似于springcloud_provider_8080\8081\8082, 不过是hystrix版的)
在这里插入图片描述2.pom.xml 引入jar包 版本1.4.6
在这里插入图片描述3 熔断机制
在服务端做
(1) 该模块的controller层,修改调用方法,通过id获取对象,添加上异常处理,和异常出现时,hystirx要调用的备用方法。
在这里插入图片描述(2) 在请求方法上添加注解@HystrixCommand属性fallbackMethod为失败调用的方法。
在这里插入图片描述

(3) 在启动类中添加对熔断的支持,注解@EnableCircuitBreaker
在这里插入图片描述4. 服务降级
在客户端做
(1) 建立降级操作,我们底层使用了feign调用微服务,新建DeptClientServiceFallbackFactory类,实现feign.hystrix.FallbackFactory接口,重写create方法,返回类型为我们feign调用接口,实现我们接口的方法。
在这里插入图片描述(2) 在feign微服务调用接口中,使用我们的降级服务,@FeignClient注解中加入fallbackFactory(工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码)
在这里插入图片描述(3) 在我们使用了feign的客户端,做开启feign的hystrix支持额配置,默认是false:
在这里插入图片描述注意:这时,启动feign消费者会报错,“java.lang.IllegalStateException: No fallback instance of type class”
原因是:我们将降级回调类:DeptClientServiceFallbackFactory 写在底层公用的api,我们在消费者启动类启动时,没有扫描该类,无法找到,注册bean。
解决办法:我们在主启动类启动时,手动让他扫描该包就可以了,如下代码:
在这里插入图片描述5. 服务熔断和服务降级的区别
服务熔断: 是在服务端做, 某个服务超时或者异常,引起熔断;
服务降级:是在客户端做, 从整体网站请求负载考虑,党某个服务熔断或者关闭之后,服务将不再被调用。此时客户端,我们可以准备一个FallbackFactory,返回一个默认的值(缺省值),整体的服务水平下降了,但整个服务还是能用。
6. 流量监控-------Dashboard
跟客户端有关
(1)新建模块springcloud_consumar_hystrix_dashboard_8880,导入pom依赖
在这里插入图片描述

(2)在主启动类中开启dashboard流量监控(主启动类加@EnableHystrixDashboard注解),注意我们的三个服务要能被监控到
在这里插入图片描述启动后,访问
在这里插入图片描述(3) 在服务提供8080模块,启动类,新增监控的代码
在这里插入图片描述

//增加一个servlet
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        //添加一个访问路径
        servletRegistrationBean.addUrlMappings("/actuator/hystrix.stream");
        return servletRegistrationBean;
    }

五、Zuul

1.1 介绍

路由网关,包含了对请求的路由和过滤两个最主要的功能。其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问的统一入口基础,而过滤工功能则负责对请求的处理过程进行干预,是实现请求效验,服务聚合等功能的基础。zuul和eureka进行整合,将uul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka!
提供:代理+理由+过滤 三大功能

1.2 使用

1.新建zuul项目模块
2.导入pom依赖
3.编写配置
4.添加启动类

六、Springcloud config分布式配置

1.介绍

通过上面的学习,微服务每个服务模块,都需要配置必要的配置信息才能运行,所以一套集中式,动态的配置管理设施是必不可少的。Springcloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百的配置文件要修改起来,会很麻烦。
在这里插入图片描述SpringCloud config 分布式配置中心,配置服务器各个不同微服务应用的所有环节提供中心化的外部配置,分为服务端和客户端两个部分。
Spring Cloud Config 分为服务端和客户端两部分;
服务端也成为分布式配置中心,他是一个独立的微服务,用来连接配置服务器并为客户端提供获取配置信息、加密、解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,有助于对环境配置进行版本管理,并通过git客户端工具来方便的管理和访问配置内容。

2. 使用

2.1 配置服务端
(1)gitlub新建项目springcloud-config
(2)拉去远程项目到本地
(3)新增模块springcloud_config_server_3344
(4)添加pom依赖
(5)新建配置文件application.yml
(6)新建启动类
2.2 配置客户端
(1)新增模块springcloud_config_client_3355
(2)添加pom依赖
(3)新建配置文件:bootstrap.yml和application.yml
#bootstrap 是系统级别的配置
#application 是用户级别的配置
配置客户端连接的服务器
(4) 编写启动类
(5) 编写controller(测试是否获得git上文件的配置内容)

项目中遇到的问题及解决

1 在使用RestTemplate +Ribbon 做服务调用时,有时会出现jjava.lang.IllegalStateException: Request URI does not contain a valid hostname 这个错误,无法根据服务名,找到注册的服务。这是因为:ribbon负载均衡时,服务名称不允许有下划线,不然无法映射, 可以修改spring:application:name ,如下:(附上一个RestTemplate的学习博客:https://www.cnblogs.com/javazhiyin/p/9851775.html)
在这里插入图片描述
2 在启动eureka服务中心时,报错:com.sun.jersey.api.client.ClientHandlerException: org.apache.http.conn.ConnectTimeoutException: Connect to localhost:8091 timed out
原因:在erueka服务中心做集群时,他们彼此相互关联,当服务只启动其中一个或两个,他们会在连接其他服务中心时,报超时错误;

3 高可用服务注册中心启动后,注册中心显示在unavailable-replicas中,available-replicas 中可用的为空。问题解决,参考:https://blog.csdn.net/u010448530/article/details/81097642

》》学习视频来源:https://www.bilibili.com/video/av76020761
》》 springcloud项目gitlab地址:http://172.30.136.7/blackmatter/springcloudstudy.git
》》 springcloud-config项目gitlab地址:http://172.30.136.7/blackmatter/springcloud_config.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值