现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现在的问题,所有的微服务汇集到了 Eureka 之中,而客户端的调用也应该通过 Eureka 完成。而这种调用就可以利用 Ribbon 技术来实现。Ribbon 是一个服务调用的组件,并且是一个客户端实现负载均衡处理的组件。服务器端实现负载均衡可以使用 Nginx、 HAProxy、LVS 等。
2.1、Ribbon 基本使用1、 【microcloud-consumer-80】修改 pom.xml 配置文件,追加 Ribbon 相关依赖支持包:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency>
2、 【microcloud-consumer-80】修改 RestConfig 配置类,在获取 RestTemplate 对象的时候加入 Ribbon 的配置注解@LoadBalanced。package cn.study.microcloud.config;import java.nio.charset.Charset;
import java.util.Base64;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestConfig {@Beanpublic HttpHeaders getHeaders() { // 要进行一个Http头信息配置HttpHeaders headers = new HttpHeaders(); // 定义一个HTTP的头信息String auth = "studyjava:hello"; // 认证的原始信息byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII"))); // 进行一个加密的处理// 在进行授权的头信息内容配置的时候加密的信息一定要与“Basic”之间有一个空格String authHeader = "Basic " + new String(encodedAuth);headers.set("Authorization", authHeader);return headers;}@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate() ;}
}
3、 【microcloud-consumer-80】修改 aplication.yml 配置文件,追加 Eureka 的服务注册地址配置。eureka.client.registerWithEureka=falseeureka.client.serviceUrl.defaultZone=
http://edmin:studyjava@eureka1:7001/eureka,
http://edmin:studyjava@eureka2:7002/eureka,
http://edmin:studyjava@eureka3:7003/eureka
4、 【microcloud-consumer-80】修改项目的启动类,追加 Eureka 客户端的配置注解:package cn.study.microcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
public class Consumer_80_StartSpringCloudApplication {public static void main(String[] args) {SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,args);}
}
5、 【microcloud-consumer-80】修改控制器调用类;· 现在在 eureka 之中注册的所有服务的名称都是大写字母:MICROCLOUD-PROVIDER-DEPT;package cn.study.microcloud.controller;import java.util.List;import javax.annotation.Resource;import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import cn.study.vo.Dept;@RestController
public class ConsumerDeptController {public static final String DEPT_GET_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/get/";public static final String DEPT_LIST_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/list/";public static final String DEPT_ADD_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/add
?dname=";@Resourceprivate RestTemplate restTemplate;@Resourceprivate HttpHeaders headers;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {Dept dept = this.restTemplate.exchange(DEPT_GET_URL + id, HttpMethod.GET,new HttpEntity<Object>(this.headers), Dept.class).getBody();return dept;}@SuppressWarnings("unchecked")@RequestMapping(value = "/consumer/dept/list")public Object listDept() {List<Dept> allDepts = this.restTemplate.exchange(DEPT_LIST_URL, HttpMethod.GET,new HttpEntity<Object>(this.headers), List.class).getBody();return allDepts;}@RequestMapping(value = "/consumer/dept/add")public Object addDept(Dept dept) throws Exception {Boolean flag = this.restTemplate.exchange(DEPT_ADD_URL, HttpMethod.POST,new HttpEntity<Object>(dept, this.headers), Boolean.class).getBody();return flag;}
}访问地址:http://localhost/consumer/dept/list。这个时候有了 Ribbon 与 Eureka 整合之后用户不再去关注具体的 Rest 服务的地 址与端口号了,所有的信息获取都通过 Eureka 完成。http://localhost/consumer/dept/list[{"deptno":1,"dname":"开发部","loc":"study8001"},
{"deptno":2,"dname":"财务部","loc":"study8001"},
{"deptno":3,"dname":"市场部","loc":"study8001"},
{"deptno":4,"dname":"后勤部","loc":"study8001"},
{"deptno":5,"dname":"公关部","loc":"study8001"},
{"deptno":6,"dname":"测试部-1551928957533","loc":"study8001"}]
 2.2、Ribbon 负载均衡通过上面的代码可以发现在 Ribbon 里面有一个负载均衡的注解:@LoadBalanced,那么就意味着现在就可以实现负载均衡的处理了。ribbon负载均衡的原理图如下

所有的服务都注册到eureka中心,并且都是同一个名字microcloud-provider-dept,用户通过eureka找到服务microcloud-provider-dept,然后通过ribbon负载均衡进行调用1、 【microcloud-provider-dept-8001】将此项目复制为两份“microcloud-provider-dept-8002”、“microcloud-provider-dept-8003”;
 2、 【microcloud-provider-dept-*】执行各自的数据库脚本,随后修改各自的数据库连接配置;
3、 【microcloud-provider-dept-*】修改各自服务的 application.yml 配置文件;application.propertiesserver.port = 8002spring.messages.basename=i18n/Messages,i18n/Pagesspring.profiles.active=productspring.datasource.url=jdbc:mysql://localhost:3306/study8001?
characterEncoding=utf-8&useSSL=false&useUnicode=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000## Mybatis
mybatis.config-location=classpath:mybatis/mybatis.cfg.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/*.xml
mybatis.typeAliasesPackage=cn.study.vosecurity.sessions=statelesseureka.client.serviceUrl.defaultZone=
http://edmin:studyjava@eureka1:7001/eureka,
http://edmin:studyjava@eureka2:7002/eureka,
http://edmin:studyjava@eureka3:7003/eurekaspring.application.name=microcloud-provider-depteureka.instance.instance-id=dept-8002.comeureka.instance.prefer-ip-address=trueinfo.app.name=study-microcloud
info.company.name=www.study.cn
info.pom.artifactId=$project.artifactId$
info.pom.version=$project.version$#eureka.instance.leaseRenewalIntervalInSeconds=2
#eureka.instance.leaseExpirationDurationInSeconds=5application.propertiesserver.port = 8003spring.messages.basename=i18n/Messages,i18n/Pagesspring.profiles.active=productspring.datasource.url=jdbc:mysql://localhost:3306/study8001
?characterEncoding=utf-8&useSSL=false&useUnicode=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000## Mybatis
mybatis.config-location=classpath:mybatis/mybatis.cfg.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/*.xml
mybatis.typeAliasesPackage=cn.study.vosecurity.sessions=statelesseureka.client.serviceUrl.defaultZone=
http://edmin:studyjava@eureka1:7001/eureka,
http://edmin:studyjava@eureka2:7002/eureka,
http://edmin:studyjava@eureka3:7003/eurekaspring.application.name=microcloud-provider-depteureka.instance.instance-id=dept-8003.comeureka.instance.prefer-ip-address=trueinfo.app.name=study-microcloud
info.company.name=www.study.cn
info.pom.artifactId=$project.artifactId$
info.pom.version=$project.version$#eureka.instance.leaseRenewalIntervalInSeconds=2
#eureka.instance.leaseExpirationDurationInSeconds=5
 4、 修改项目中的 hosts 配置文件,在这个配置文件之中追加新的域名:127.0.0.1 dept-8001.com
127.0.0.1 dept-8002.com
127.0.0.1 dept-8003.com
 5、 【microcloud-provider-dept-*】在保证 Eureka 已经正确启动之后启动所有的部门微服务信息;

6、 【microcloud-consumer】启动消费端,消费端在 RestTemplate 配置的时候使用了负载均衡的注解。
 · 访问地址:http://localhost/consumer/dept/list现在发现每一次获取数据都是通过不同的微服务获得的,所以现在同一个消费端就可以通过 Ribbon 实现了负载均衡配置处理。
 2.3、自定义 Ribbon 配置在之前使用了一个“@LoadBalanced”注解,该注解描述的是一个负载均衡,但是对于负载均衡也是可以由用户修改负载均衡策略的。那么如果说现在要想去修改这样的策略,也是可以的,可以使用自定义的 LoadBalacne 的配置类。1、 【microcloud-consumer-80】追加一个 LoadBalance 的配置类,这个类应该放在 SpringCloud 启动后找不到的位置上,所以应该做一个新的包;package cn.study.commons.config;import org.springframework.context.annotation.Bean;import com.netflix.loadbalancer.IRule;public class MyLoadBalanceConfig {@Beanpublic IRule ribbonRule() { // 其中IRule就是所有规则的标准return new com.netflix.loadbalancer.RandomRule() ;}
}
 2、 【microcloud-consumer-80】修改程序主类,追加 Ribbon 的配置操作:package cn.study.microcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;import cn.study.commons.config.MyLoadBalanceConfig;@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name="ribbonClient",configuration=MyLoadBalanceConfig.class)
public class Consumer_80_StartSpringCloudApplication {public static void main(String[] args) {SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,args);}
}那么此时就实现了负载均衡的配置处理操作。
 3、 【microcloud-consumer-80】修改控制器程序类,在这个程序类之中可以通过负载均衡的客户端获取服务器的相关信息。package cn.study.microcloud.controller;import java.util.List;import javax.annotation.Resource;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import cn.study.vo.Dept;@RestController
public class ConsumerDeptController {public static final String DEPT_GET_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/get/";public static final String DEPT_LIST_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/list/";public static final String DEPT_ADD_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/add?dname=";@Resourceprivate RestTemplate restTemplate;@Resourceprivate HttpHeaders headers;@Resourceprivate LoadBalancerClient loadBalancerClient ;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {ServiceInstance serviceInstance = this.loadBalancerClient.choose("MICROCLOUD-PROVIDER-DEPT") ;System.out.println("【*** ServiceInstance ***】host = " + serviceInstance.getHost()+ "、port = " + serviceInstance.getPort()+ "、serviceId = " + serviceInstance.getServiceId());Dept dept = this.restTemplate.exchange(DEPT_GET_URL + id, HttpMethod.GET,new HttpEntity<Object>(this.headers), Dept.class).getBody();return dept;}@SuppressWarnings("unchecked")@RequestMapping(value = "/consumer/dept/list")public Object listDept() {ServiceInstance serviceInstance = this.loadBalancerClient.choose("MICROCLOUD-PROVIDER-DEPT") ;System.out.println("【*** ServiceInstance ***】host = " + serviceInstance.getHost()+ "、port = " + serviceInstance.getPort()+ "、serviceId = " + serviceInstance.getServiceId());List<Dept> allDepts = this.restTemplate.exchange(DEPT_LIST_URL, HttpMethod.GET,new HttpEntity<Object>(this.headers), List.class).getBody();return allDepts;}@RequestMapping(value = "/consumer/dept/add")public Object addDept(Dept dept) throws Exception {Boolean flag = this.restTemplate.exchange(DEPT_ADD_URL, HttpMethod.POST,new HttpEntity<Object>(dept, this.headers), Boolean.class).getBody();return flag;}}那么此时后台通过指定的负载均衡的配置程序,就可以取得即将操作的主机的信息。http://localhost/consumer/dept/list【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8001、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
【*** ServiceInstance ***】host = 10.40.8.144、port = 8002、serviceId = MICROCLOUD-PROVIDER-DEPT
 2.4、禁用 Eureka 实现 Ribbon 调用在之前使用的技术都是通过 Eureka 访问了 Eureka 之中的指定名称的服务而获得了所需要的数据,但是
在 Ribbon 设计的时候 考虑到了一个脱离 Eureka 使用的环境。如果要真进行了 Eureka 的脱离,代码
将变为如下的形式。1、 【microcloud-consumer-ribbon】修改 application.properties 配置文件:server.port=80
ribbon.eureka.enabled=false
microcloud-provider-dept.ribbon.listOfServers=
http://dept-8001.com:8001,
http://dept-8002.com:8002,
http://dept-8003.com:8003
 2、 【microcloud-consumer-ribbon】修改 RestConfig 配置程序类,不再需要使用“@LoadBalanced”注解:package cn.study.microcloud.config;import java.nio.charset.Charset;
import java.util.Base64;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestConfig {@Beanpublic HttpHeaders getHeaders() { // 要进行一个Http头信息配置HttpHeaders headers = new HttpHeaders(); // 定义一个HTTP的头信息String auth = "studyjava:hello"; // 认证的原始信息byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII"))); // 进行一个加密的处理// 在进行授权的头信息内容配置的时候加密的信息一定要与“Basic”之间有一个空格String authHeader = "Basic " + new String(encodedAuth);headers.set("Authorization", authHeader);return headers;}@Bean// @LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}
  3、 【microcloud-consumer-ribbon】修改 ConsumerDeptController控制器,直接通过获取主机和端口调用后台微服务:package cn.study.microcloud.controller;import java.net.URI;
import java.util.List;import javax.annotation.Resource;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import cn.study.commons.config.MyLoadBalanceConfig;
import cn.study.vo.Dept;@RestController
@RibbonClient(name = "microcloud-provider-dept", configuration = MyLoadBalanceConfig.class)
public class ConsumerDeptController {public static final String DEPT_REST_TOPIC = "microcloud-provider-dept";@Resourceprivate RestTemplate restTemplate;@Resourceprivate HttpHeaders headers;@Resourceprivate LoadBalancerClient loadBalancerClient;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {ServiceInstance serviceInstance = this.loadBalancerClient.choose(DEPT_REST_TOPIC);System.out.println("【*** ServiceInstance ***】host = " + serviceInstance.getHost()+ "、port = " + serviceInstance.getPort()+ "、serviceId = " + serviceInstance.getServiceId()+ "、uri = " + serviceInstance.getUri());URI deptUri = URI.create(String.format("http://%s:%s/dept/get/" + id,serviceInstance.getHost(), serviceInstance.getPort()));Dept dept = this.restTemplate.exchange(deptUri, HttpMethod.GET,new HttpEntity<Object>(this.headers), Dept.class).getBody();return dept;}@SuppressWarnings("unchecked")@RequestMapping(value = "/consumer/dept/list")public Object listDept() {ServiceInstance serviceInstance = this.loadBalancerClient.choose(DEPT_REST_TOPIC);System.out.println("【*** ServiceInstance ***】host = " + serviceInstance.getHost()+ "、port = " + serviceInstance.getPort()+ "、serviceId = " + serviceInstance.getServiceId()+ "、uri = " + serviceInstance.getUri());URI deptUri = URI.create(String.format("http://%s:%s/dept/list/",serviceInstance.getHost(), serviceInstance.getPort()));List<Dept> allDepts = this.restTemplate.exchange(deptUri, HttpMethod.GET,new HttpEntity<Object>(this.headers), List.class).getBody();return allDepts;}    }这种模式并不标准,只能够说是 Ribbon 自己所具备的一项功能而已,实际之中如果不是非常必要,不建议使用。

SpringCloud:Ribbon负载均衡(基本使用、 负载均衡、自定义配置、禁用 Eureka 实现 Ribbon 调用)相关推荐

  1. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册 ...

  2. 【Zuul2】zuul集成ribbon完成服务通信和负载均衡

    目录 Zuul2服务通信 超时相关 默认超时配置 自定义超时配置 负载均衡 Zuul2服务通信 描述:zuul2通过Ribbon完成客户端负载均衡以及与服务器群集进行通信. zuul2的通信是集成Ri ...

  3. SpringCloud Ribbon中的7种负载均衡策略!

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而 ...

  4. Springcloud、Nacos 服务注册、负载均衡Ribbon、http客户端Feign

    SpringCloud是基于SpringBoot的一整套实现微服务的框架.它提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等组 ...

  5. 开启springcloud全家桶5:探索负载均衡组件 Ribbon实现与原理

    前段时间,笔者为了解决微服务多版本共存调用的问题,笔者深入调研了Ribbon,并将调研的内容记录了下来,以供后续查阅.Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是负载均 ...

  6. SpringCloud微服务-服务注册发现-负载均衡-服务调用-服务降级-服务网关-配置中心-消息总线-消息驱动-链路追踪-alibaba-nacos-sentinel-seata理论原理分析

    SpringCloud理论技术 概述 ​ Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总 ...

  7. 【微服务】Eureka+Ribbon实现注册中心与负载均衡

    文章目录 前言 1.微服务引入 1.1.相关概念 1.2.软件架构的演进 1.2.1.单体架构 1.2.2.垂直架构 1.2.3.分布式架构 1.2.4.SOA架构 1.2.5.微服务架构 1.3.S ...

  8. Spring Cloud Ribbon 中的 7 种负载均衡策略

    负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...

  9. 负载均衡 一直跑一个服务器_终于把服务器负载均衡和客户端负载均衡讲清楚了...

    服务端负载均衡 我们常说的负载均衡都是指服务端负载均衡,服务端负载均衡又分为硬件负载均衡,软件负载均衡. 硬件负载均衡主要是在各服务器节点 前加上负载均衡的设备,如F5 软件负载均衡主要指的是在服务器 ...

最新文章

  1. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(2):MVP比MVC更好吗
  2. Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组、split函数水平(按列)拆分二维numpy数组
  3. python控制苹果手机触摸屏失灵怎么办_iphone触摸屏失灵怎么办 iphone触摸屏失灵解决办法【详解】...
  4. BZOJ1453: [WC2005]Dface双面棋盘
  5. AI开发者大会之计算机视觉技术实践与应用:2020年7月3日《RPA+AI助力政企实现智能时代的人机协同》、《5G风口到来,边缘计算引领数据中心变革》、《数字化时代金融市场与AI算法如何结合?》
  6. 一切成功的秘诀都蕴含在这个公式里面
  7. 【CyberSecurityLearning 56】自动化注入
  8. B - Calculating Function
  9. 资金时间价值的计算机应用视频讲解,第八章资金时间价值与方案经济比选20161018讲解.ppt...
  10. CMake使用介绍(2)
  11. 0c-36-自动释放池应用场景
  12. pytorch中创建多个空的tensor、pycharm从自己写的.py中引用函数下面画红线等问题
  13. 垃圾分类急上头?物联网卡来消愁
  14. Linux搭建测试环境详细步骤
  15. opencv python 的基本操作案例(一) 记录,可查看
  16. Flutter:实现iOS无证书打包ipa
  17. win7去除快捷方式小箭头
  18. linux qemu-nbd介绍
  19. WPS哪些文件夹可以删除
  20. Arduino 声音传感器例程

热门文章

  1. css3新特性总结(视觉表现方面)
  2. 【转】 onNewIntent调用时机
  3. MongoDB的集群模式--Replica Set
  4. CentOS7Selinux设置
  5. 对android.mk debug
  6. 绝对定位元素的百分比margin
  7. 2015第16周三知道做到
  8. PowerDesigner(16.1)使用
  9. OCP读书笔记(9) - 诊断数据库
  10. css3 上线圆角效果