ZonePreferenceServerListFilter: 主动首选本地区域的过滤器 。 ServerListSubSetFilter: 服务器列表过滤器,将负载均衡器使用的服务器数量限制为所有服务器的子集 。ServerListUpdater更新服务器列表 。
- EurekaNotificationServerListUpdater: 利用Eureka的时间监听器触发LB缓存更新 。
- PollingServerListUpdater: 默认的策略动态更新服务器列表 。
IClientConfig
- IClientConfig的实现类为DefaultClientConfigImpl 。DefaultClientConfigImpl是默认的客户端配置,可以从Archaius ConfigurationManager加载属性 。
ILoadBalancerLoadBalancer的组成:
- 一个基于特定条件可能进行存储的服务器列表 。
- 一个类:通过IRule实现并定义LoadBalancing策略 。
- 该类定义并实现一种机制,用户确定列表中节点/服务器的实用性/可用性 。
LoadBalancer的实现类:
- BaseLoadBalancer: 基本的实现,ping确定存活的服务器列表 。
- DynamicServerListLoadBalancer: 动态获取的服务器列表 。
- ZoneAwareLoadBalancer: LoadBalancer将计算并检查所有可用区域的区域统计信息 。如果任何区域的“平均活动请求数”已达到配置的阈值,
则该区域将从活动服务器列表中删除 。如果多个区域已达到阈值,则将删除每台服务器上最活跃请求的区域 。一旦删除了最坏的区域,将在其余区域中选择一个区域,其概率与其实例数成正比 。服务器将从具有指定规则的选定区域返回 。每个区域相关的负载平衡决策都是在最新统计信息的帮助下实时做出的 。
代码实践pom.xml增加SpringCloud Gateway和Ribbon依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version><relativePath/> </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency></dependencies>代码方式配置网关
@SpringBootApplication@RestControllerpublic class DemoGatewayApplication {public static void main(String[] args) {SpringApplication.run(DemoGatewayApplication.class, args);}@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route(r -> r.path("/refund/**").filters(f -> f.addRequestHeader("Hello", "World")).uri("http://manage-test.payplatform.speiyou.cn/")).build();}}yml方式配置网关
spring:application:name: gateway-servicecloud:gateway:routes:- id: merchanturi: lb://merchant-load-balanced-servicepredicates:- Path=/merchant/**- Method=POST- id: splituri: lb://split-load-balanced-servicepredicates:- Path=/split/**filters:- RewritePath=/split, /ledger-split #重写url- id: cashieruri: lb://cashier-load-balanced-servicepredicates:- Path=/cashier/**filters:- StripPrefix=1 #将cashier过滤掉#ribbon全局配置ribbon:ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)ReadTimeout: 3000 #服务请求处理超时时间(毫秒)OkToRetryOnAllOperations: true #对超时请求启用重试机制MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数MaxAutoRetries: 1 # 切换实例后重试最大次数NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载均衡算法NFLoadBalancerPingClassName: com.talpay.gateway.config.HealthCheck#健康检查NFLoadBalancerPingInterval: 20#设置健康检查间隔,单位秒,默认30秒merchant-load-balanced-service:ribbon:listOfServers: 192.168.xxx.xxx:8080split-load-balanced-service:ribbon:listOfServers: 192.168.xxx.xxx:8081cashier-load-balanced-service:ribbon:listOfServers: 192.168.xxx.xxx:8080Ribbon服务健康检查
@Slf4j@Componentpublic class HealthCheck implements IPing{@Autowiredprivate RestTemplate restTemplate;@Value("${dingtalk.url}")private String dingtalkURL; //钉钉报警url@Overridepublic boolean isAlive(Server server) {String url = "http://"+ server.getId()+ "/actuator/health";try {ResponseEntity<String> heath = restTemplate.getForEntity(url, String.class);if (heath.getStatusCode() == HttpStatus.OK) {log.info("ping " + url + " success ");return true;}log.info("ping " + url + " error and response is " + heath.getBody());return false;} catch (Exception e) {log.error("ping " + url + " failed");DingRebotSendUtil.send(dingtalkURL,new TextMessage("网关|ping:" + url + " failed"));return false;}}}
推荐阅读
-
g2|两连胜却无缘世界赛!就在今天,S10“最神奇”队伍诞生,一级团运营方式打服各大战队!
-
【阿里巴巴】卫健委充分肯定互联网医疗 阿里健康新基建已经准备好了
-
王者荣耀|经济虽倒数,输出却稳居第二?DYG萧玦已将工具法师发挥到极致!
-
[30秒懂车]这三台值得一看 其中一台还是非承载式车身,买国产大空间SUV
-
现实版的“狼”来了,特斯拉汽车的“鲶鱼”效应已经显现
-
【趣头条】15万级自主品牌SUV首选TA,颜值高、空间大、配置高、还安全
-
-
我有车|2.0T中配43万多能落地,豪华SUV销量冠军促销!奔驰GLC全系降5万
-
-
年年都体检,为什么发现癌症却已晚期?这种检查,有很多人漏掉
-
-
宁夏省和现在的宁夏回族自治区有什么关系 宁夏是哪个省
-
中新经纬|【财讯晚班车】百强镇分布图:近七成在苏粤两省
-
#科技圈#985 曝光;安卓版微信更新;Zoom 爆重大安全漏洞,麒麟
-
吃货|经常喝牛奶,长期下来对身体有什么影响?真的有那么好吗?
-
趣闻晨报|关晓彤真实身份隐瞒了20年,难怪鹿晗这么喜欢她,太低调了
-
-
暖宝宝贴上去还可以撕下来吗 暖宝宝揭下来贴别的部位可以吗
-
赵小棠|赵小棠打卡陈赫火锅店,一共点30道“菜品”,结账时却成了哑巴!
-