SpringCloud

微服务架构的四个核心问题

  1. 服务很多,客户端该怎么访问
  2. 这么多服务,服务之间如何通信
  3. 这么多服务,如何治理
  4. 服务挂了怎么办

解决方案

  1. spring cloud netflix:一站式解决方案
    • api网关,zuul组件
    • feign—httpclinet—http通信方式,同步,阻塞
    • 服务注册:eureka
    • 熔断机制:hystrix
  2. apache dubbo zookeeper:半自动,需要整合别人的
  • api:没有,找第三方组件,或者自己实现
  • dubbo
  • zookeeper
  • 没有熔断机制:借助:hystrix
  1. spring cloud alibaba:一站式解决方案,更简单!

什么是微服务

  • 微服务是一种架构模式,或者说是一种架构风格, 它提倡将单一的应用程序划分成一组小的服务 ,每个服务运行在其独立的自己的经常内,服务之间互相协调,互相配置,为用户提供最终价值。
    • 服务之间采用轻量级的通信机制互相沟通,每个服务都围绕着具体的业务进行构建,并且能够被独立的步数到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言,工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。
    • 微服务化的核心及时将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能搞自行单独启动或销毁,拥有自己的独立的数据库。

微服务和微服务架构的区别

微服务

强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题提供落地对应服务的一个服务应用,狭义的看,可以看做是idea中的一个个微服务工程,或者moudel

微服务架构

一种新的架构形式,Martin Fowler,微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调,互为配合,为用户提供最终价值,每个服务运行在其独立的进程中,服务于服务间采用轻量级通信机制互相协作,每个服务都围绕这具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言,工具对其进行构建。

微服务的优缺点

优点

  • 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求。
  • 开发简单,开发效率高,一个服务可能就是专业的只干一件事
  • 微服务能够被小团队单独开发,这个小团队是2-5人的开发人员组成。
  • 微服务能使用不同的语言开发。
  • 易于和第三发集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins,hudson,bamboo
  • 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值。
  • 微服务允许利用融合最新技术
  • 微服务只是业务逻辑的代码,不会和html,css,或者其它界面混合。
  • 每个微服务都有自己的存储能力,可以有独立的数据库,也可以有统一的数据库。

缺点

  • 开发人员要处理分布式系统的复杂性
  • 多服务运维难度,随着服务的增加,运维的压力也在增大
  • 系统部署依赖
  • 服务间通信成本
  • 数据一致性
  • 系统集成测试
  • 性能监控

微服务技术栈

微服务条目落地技术
服务开发springboot,spring,springmvc
服务配置与管理netflix公司的archaius,阿里的diamond等
服务调用rest,rpc,grpc
服务熔断器kystrix,envoy
负载均衡ribbon,nginx
服务接口调用(客户端调用服务的简化工具)feign
服务配置中心管理spgjincloudconfig,chef
服务路由(api网关)zuul
服务监控zabbix,nagios,metrics,specatator
全链路追踪zipkin.brave,dapper
服务部署docker,openstack,kubernetes
数据流操作开发包springcloud ,stream
事件消息总线springcloud bus

为什么选择SpringCloud作为微服务架构

选型依据

  • 整体解决方案和框架成熟度
  • 社区热度
  • 可维护性
  • 学习曲线

当前各大IT公司用的微服务架构有哪些

  • 阿里:dubbo+hfs
  • 京东:jsf
  • 新浪:motan
  • 当当网:dubbox

在这里插入图片描述

SpringCloud是什么

springcloud是基于springboot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于netflix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
springcloud利用springboot看开发便利性,巧妙地简化了分布式系统基础设施的开发,springcloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等等,他们都可以用springboot的咖啡风格做到一键启动和部署。
springboot并没有重复造轮子,它只是将目前各家公司开发的比较成熟,经得起实际考研的服务框架组合起来,通过 springboot风格进行封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简答易懂,易部署和易维护的分布式系统开发工具包
springcloud是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称微服务全家桶。

springcloud和springboot的关系

  • springboot专注于快速方便的开发单个个体微服务
  • springcloud是关注全局的微服务协调整理治理框架,它将springboot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等等集成服务。
  • springboot可以离开springcloud独立使用,开发项目,但是springcloud离不开springboot,属于依赖关系
  • springboot专注于快速,方便的开发单个个体微服务,springcloud关注全局的服务治理框架。

Dubbo和SpringCloud技术选型

1.分布式+服务治理Dubbo
目前成熟的互联网架构:应用服务化拆分+消息中间件
在这里插入图片描述

Springcloud能干嘛

  • 分布式/版本控制配置
  • 服务注册与发现
  • 路由
  • 服务到服务的调用
  • 负载均衡配置
  • 断路器
  • 分布式消息管理
建一个普通的maven项目,删除src,作为父模块,父模块的依赖。
<?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.example</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>


    <!--打包方式 pom-->
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
      <lombok.version>1.16.10</lombok.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.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
            <!--springboot启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


在这里插入图片描述

  • springcloud-api模块依赖
<?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.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-api</artifactId>
    <!--当前的module自己需要的依赖,如果父依赖中已经配置了版本,这里就不用写了-->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

</project>
//实体类加上序列化
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class Dept implements Serializable {
    private Long deptno;
    private String dname;
    private String db_source;//这个数据存在哪个数据库的字段,微服务,一个服务对应一个数据库

    public Dept(String dname){
         this.dname=dname;
     }

    /**
     * 链式写法
     * Dept dept=new Dept();
     * dept.setDeptNo(11).setDname('222').setDb_source('001');
     */
}

在这里插入图片描述

  • springcloud-consumer-dept-80模块依赖
<?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.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-consumer-dept-80</artifactId>
    <!--实体-->
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springcloud-api</artifactId>
           <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>

  • ConfigBean
@Configuration
public class ConfigBean {
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
  • DeptConsumerController
@RestController
public class DeptConsumerController {
     @Resource
      private RestTemplate restTemplate;//提供多种便捷访问远程http服务的方法,简单的restful服务模板

    private static final String REST_URL_PREFIX="http://localhost:8001";

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
    }
    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
    }
}

  • application.properties

server.port=80

在这里插入图片描述

  • springcloud-provider-dept-8001模块依赖
<?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.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-provider-dept-8001</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--jetty-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <!--热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>

</project>
  • DeptController
//提供restful服务
@RestController
public class DeptController {
       @Resource
       private DeptService deptService;


       @PostMapping("/dept/add")
       public boolean addDept(Dept dept){
           return deptService.addDept(dept);
       }

    @GetMapping("/dept/get/{id}")
    public  Dept get(@PathVariable("id") Long id){
        return deptService.queryById(id);
    }

    @GetMapping("/dept/list")
    public List<Dept> queryAll(){
        return deptService.queryAll();
    }
}
  • DeptDao
@Mapper
@Repository
public interface DeptDao {
    public boolean addDept(Dept dept);

    public Dept queryById(Long id);

    public List<Dept> queryAll();
}
  • DeptService
public interface DeptService {

    public boolean addDept(Dept dept);

    public Dept queryById(Long id);

    public List<Dept> queryAll();
}
  • DeptServiceImpl
@Service
public class DeptServiceImpl implements DeptService {
    @Resource
    private DeptDao deptDao;
    @Override
    public boolean addDept(Dept dept) {
        return deptDao.addDept(dept);
    }

    @Override
    public Dept queryById(Long id) {
        return deptDao.queryById(id);
    }

    @Override
    public List<Dept> queryAll() {
        return deptDao.queryAll();
    }
}
  • DeptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nie.springcloud.dao.DeptDao">
    <insert id="addDept" >
        insert into dept(dname,db_source) values(#{dname},DATABASE())
    </insert>

    <select id="queryById" resultType="com.nie.springcloud.pojo.Dept">
        SELECT * FROM dept where deptno=#{deptno}
    </select>


    <select id="queryAll" resultType="com.nie.springcloud.pojo.Dept">
        select * from dept;
    </select>
</mapper>
  • mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>
  • application.properties
server.port=8001

#mybatis配置
mybatis.type-aliases-package=com.nie.springcloud.pojo
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

#spring的配置
spring.application.name=springcloud-provider-dept
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=org.gjt.mm.mysql.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root

Eureka服务注册与发现

什么是Eureka

Eureka是netflix的一个子模块,也是核心模块之一,Eureka是一个基于rest的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper.

原理讲解

  • Eureka的基本架构
  • springcloud封装了netflix公司开发的Eureka模块来实现服务注册和发现
  • Eureka采用了c-s的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心
  • 而系统中的其它微服务,使用Eureka的客户端连接到EurekaServer并维持心跳连接,这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,springcloud的一些其它模块就可以通过Eurekaserver来发现系统中的其它微服务,并执行相关的逻辑。

Eureka包含两个组件

1.Eureka Server
提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
2.Eureka Client
是一个java客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器,在应用启动后,将会向EurekaServer发送心跳(默认为30秒),如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除掉(默认周期为90秒)

三大角色

  • Eureka Server:提供服务的注册与发现
  • Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到
  • Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。

在这里插入图片描述

  • springcloud-eureka-7001模块的依赖
<?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.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-eureka-7001</artifactId>
    <!--导包-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
    </dependencies>
</project>
  • application.properties
server.port=7001

#eureka配置
#eureka服务端的实例名称
eureka.instance.hostname=localhost 
#表示是否向eureka注册中心注册自己
eureka.client.register-with-eureka=false
# 如果为false,则表示自己为注册中心
eureka.client.fetch-registry=false

#监控页面
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
  • 启动

在这里插入图片描述

  • springcloud-provider-dept-8001 模块的pom文件加入eureka依赖
    在这里插入图片描述
  • 在application.properties中加入服务注册
    在这里插入图片描述
  • 在启动类里加入@EnableEurekaClient 注解 开启Eureka
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 再启动

在这里插入图片描述
在这里插入图片描述

  • 配置info信息
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

上面图片里为什么会报红,是由于Eureka的自我保护机制

某时某刻一个微服务不可以用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存

  • 默认情况下,eurekaserver在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒),但是当网络分区故障发生时,微服务与Eureka之间无法正常通行,以上行为可能变得非常危险了,因为微服务本身是健康的,此时本不应该注销这个服务,Eureka通过自我保护机制来解决这个问题,当EurekaServer节点在短时间内丢失过多客户端时,那么这个节点就会进入自我保护模式,一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不在删除服务注册表中的数据,当网络故障恢复后,该EurekaServer节点会自动退出自我保护模式。
  • 在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例,当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式,它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例,一句话,好死不如赖活着。
  • 在springcloud中,可以使用eureka.server.enable-self-preseratin=false禁用自我保护模式(不推荐关闭自我保护机制)

集群环境配置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对比Zookeeper

回顾cap原则

  • RDBMS(Msql,Oracle,sqlServer)===>acid
  • nosql(redis,mongdb)===cap

ACID是什么

  • A(Atomicity)原子性
  • C(Consistency)一致性
  • I(lsolation)隔离性
  • D(durability)持久性

CAP是什么

  • c(consistency)强一致性
  • A(availability)可用性
  • p(partition tolerance)分区容错性

cap理论的核心

  • 一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求
  • 根据cap原理,将nosql数据库分成了满足ca原则,满足cp原则和满足ap原则三大类
  • CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差
  • cp:满足一致性,分区容错性的系统,通常性能不是特别高
  • ap:满足可用性,分区容错性的系统,通常可能对一致性要求低一些

作为服务注册中心,Eureka比zookeeper好在哪里

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ribbon是什么

  • springcloud ribbon 是基于netflix ribbon实现的一套客户端负载均衡的工具
  • 简单的说,ribbon是nitflix发布的开源项目,主要功能是根据客户端的软件负载均衡算法,将netflix的中间层服务连接在一起,ribbon的客户端组件提供一系列完整的配置项如:连接超时,重试,简单的说,就是在配置文件中列出loadbalancer后面的所有的机器,ribbon会自动的帮助你基于某种规则去连接这些机器,我们也很容易使用ribbon实现自定义的负载均衡算法

ribbon 能干嘛

  • LB 负载均衡,在微服务或分布式集群中经常用的一种应用
  • 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用
  • 常见的负载均衡软件有nginx,lvs
  • dubbo,springcloud中均给我们提供了负载均衡,springcloud的负载均衡算法可以自定义
  • 负载均衡简单分类
  • 集中式lb:即在服务的消费方和提供方之间使用独立的lb设施,如nginx,由该设施负责把访问请求通过某种策略转发到服务的提供方
  • 进程式LB:将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • ribbon和eureka整合以后,客户端可以直接调用,不用关心ip地址和端口号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

什么是Hystrix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,不如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
断路器本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个服务预期的,可处理的备选响应,而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中的蔓延,内置雪崩。

能干嘛

  • 服务降级
  • 服务熔断
  • 服务限流
  • 接近实时的监控

服务熔断是什么

熔断机制是对应雪崩效应的一站微服务链路保护机制
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息,当检测该节点微服务调用响应正常后恢复调用链路,在springcloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制,熔断机制的注解是@HystrixCommand.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南离火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值