• SpringCloud:NetFlix(下)


    目录

    6. Ribbon:负载均衡(基于客户端)

    1.负载均衡以及Ribbon

    2.集成Ribbon

    3.使用Ribbon实现负载均衡 

    7.Feign:负载均衡(基于服务端)

    1.Feign简介

    2.Feign的使用步骤

    3.Feign和Ribbon如何选择?

    8.Hystrix(服务熔断)

    1.服务雪崩

    2.什么是Hystrix?

    3.Hystrix能干嘛?

    4.服务熔断

    5.服务降级

    6.服务熔断和降级的区别

    7.Dashboard 流监控

    9. Zull路由网关

    1.什么是zuul?

    2.Zuul 能干嘛?

    10. Spring Cloud Config 分布式配置

    1.概述

    2.git环境搭建

    3.服务端搭建

    4.客户端搭建

    5.远程配置实战测试


    6. Ribbon:负载均衡(基于客户端)

    1.负载均衡以及Ribbon

    Ribbon是什么?

    • Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具
    • 简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon 的客户端组件提供一系列完整的配置项,如:连接超时、重试等。简单的说,就是在配置文件中列出 LoadBalancer (简称LB:负载均衡) 后面所有的及其,Ribbon 会自动的帮助你基于某种规则 (如简单轮询,随机连接等等) 去连接这些机器。我们也容易使用 Ribbon 实现自定义的负载均衡算法!

    Ribbon能干嘛?

    • LB,即负载均衡 (LoadBalancer) ,在微服务或分布式集群中经常用的一种应用。
    • 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高用)。
    • 常见的负载均衡软件有 Nginx、Lvs 等等。
    • Dubbo、SpringCloud 中均给我们提供了负载均衡,SpringCloud 的负载均衡算法可以自定义。
    • 负载均衡简单分类:
      • 集中式LB
        • 即在服务的提供方和消费方之间使用独立的LB设施,如Nginx(反向代理服务器),由该设施负责把访问请求通过某种策略转发至服务的提供方!
      • 进程式 LB
        • 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器。
        • Ribbon 就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址!

    2.集成Ribbon

    • 1.springcloud-consumer-dept-80向pom.xml中添加Ribbon和Eureka依赖
    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-eurekaartifactId>
    4. <version>1.4.7.RELEASEversion>
    5. dependency>
    • 2.在application.yml文件中配置Eureka
    1. # Eureka配置
    2. eureka:
    3. client:
    4. register-with-eureka: false # 不向 Eureka注册自己
    5. service-url: # 从三个注册中心中随机取一个去访问
    6. defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    • 3.主启动类加上@EnableEurekaClient注解,开启Eureka
    1. @SpringBootApplication
    2. @EnableEurekaClient //开启Eureka 客户端
    3. public class DeptConsumer_80 {
    4. public static void main(String[] args) {
    5. SpringApplication.run(DeptConsumer_80.class,args);
    6. }
    7. }
    • 4.自定义Spring配置类:ConfigBean.java添加注解实现 负载均衡RestTemplate
    1. @Configuration
    2. public class ConfigBean {//@Configuration -- spring applicationContext.xml
    3. @Bean
    4. @LoadBalanced //配置负载均衡实现RestTemplate
    5. public RestTemplate getRestTemplate(){
    6. return new RestTemplate();
    7. }
    8. }
    • 5.修改conroller:DeptConsumerController.java
    1. // Ribbon:我们这里的地址,应该是一个变量,通过服务名来访问
    2. //private static final String REST_URL_PREFIX = "http://localhost:8001";
    3. private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";

    修改完后,就不用关心ip地址和端口号了

    3.使用Ribbon实现负载均衡 

    环境搭建

    • 1.创建数据库db02、db03
    1. CREATE DATABASE `db02`;
    2. use `db02`;
    3. CREATE TABLE `dept` (
    4. `deptno` bigint(20) NOT NULL AUTO_INCREMENT,
    5. `dname` varchar(60) DEFAULT NULL,
    6. `db_source` varchar(60) DEFAULT NULL,
    7. PRIMARY KEY (`deptno`) USING BTREE
    8. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
    9. INSERT INTO dept (dname,db_source) VALUES ('开发部',database());
    10. INSERT INTO dept (dname,db_source) VALUES ('人事部',database());
    11. INSERT INTO dept (dname,db_source) VALUES ('财务部',database());
    12. INSERT INTO dept (dname,db_source) VALUES ('市场部',database());
    13. INSERT INTO dept (dname,db_source) VALUES ('运维部',database());
    1. CREATE DATABASE `db03`;
    2. use `db03`;
    3. CREATE TABLE `dept` (
    4. `deptno` bigint(20) NOT NULL AUTO_INCREMENT,
    5. `dname` varchar(60) DEFAULT NULL,
    6. `db_source` varchar(60) DEFAULT NULL,
    7. PRIMARY KEY (`deptno`) USING BTREE
    8. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
    9. INSERT INTO dept (dname,db_source) VALUES ('开发部',database());
    10. INSERT INTO dept (dname,db_source) VALUES ('人事部',database());
    11. INSERT INTO dept (dname,db_source) VALUES ('财务部',database());
    12. INSERT INTO dept (dname,db_source) VALUES ('市场部',database());
    13. INSERT INTO dept (dname,db_source) VALUES ('运维部',database());
    • 2.更改数据源

    • 3.创建两个服务提供者springcloud-provider-dept-8002、springcloud-provider-dept-8003

    • 4.参照springcloud-provider-dept-8001 依次为另外两个Moudle添加pom.xml依赖 、resourece下的mybatis和application.yml配置,Java代码

    pom依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.examplegroupId>
    4. <artifactId>springcloud-apiartifactId>
    5. <version>1.0-SNAPSHOTversion>
    6. dependency>
    7. <dependency>
    8. <groupId>junitgroupId>
    9. <artifactId>junitartifactId>
    10. <scope>testscope>
    11. dependency>
    12. <dependency>
    13. <groupId>mysqlgroupId>
    14. <artifactId>mysql-connector-javaartifactId>
    15. dependency>
    16. <dependency>
    17. <groupId>com.alibabagroupId>
    18. <artifactId>druidartifactId>
    19. dependency>
    20. <dependency>
    21. <groupId>ch.qos.logbackgroupId>
    22. <artifactId>logback-coreartifactId>
    23. dependency>
  • 相关阅读:
    WebGL 计算点光源下的漫反射光颜色
    Java之异常处理
    数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
    python 中面向对象编程:深入理解封装、继承和多态
    算法 - 拆炸弹(JavaScript)
    数据结构篇:链表和树结构的操作方法
    刷题日记【第三天】
    MySQL笔记(进阶篇)
    第十八章 Swing程序设计
    appium---如何判断原生页面和H5页面
  • 原文地址:https://blog.csdn.net/m0_64095482/article/details/127768332