<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
package com.springcloud.lesson6ribbonclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@RibbonClients({
@RibbonClient(name = "spring-cloud-service-provider")
})
public class Lesson6RibbonClientApplication {
public static void main(String[] args) {
SpringApplication.run(Lesson6RibbonClientApplication.class, args);
}
// 声明 RestTemplate
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
### 配置ribbon 服务地提供方
spring-cloud-service-provider.ribbon.listOfServers = \
http://${service-provider.host}:${service-provider.port}
//声明 RestTemplate
@LoadBalanced // RestTemplate 的行为变化
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
package com.springcloud.lesson6ribbonclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@RibbonClients({
@RibbonClient(name = "spring-cloud-service-provider")
})
public class Lesson6RibbonClientApplication {
public static void main(String[] args) {
SpringApplication.run(Lesson6RibbonClientApplication.class, args);
}
// 声明 RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
以spring-cloud-lesson6-eureka-server
为例
package com.springcloud.lesson6eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class Lesson6EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(Lesson6EurekaServerApplication.class, args);
}
}
spring.application.name=spring-cloud-eureka-server
server.port=9090
## 管理端安全失效
# 启用端点 env
management.endpoint.env.enabled=true
# 暴露端点 env 配置多个,隔开
management.endpoints.web.exposure.include=*
management.endpoint.info.enabled=true
management.info.env.enabled=true
## 公用 Eureka 配置
### 向注册中心注册
eureka.client.register-with-eureka = false
### 向获取注册信息(服务、实例信息)
eureka.client.fetch-registry = false
## 解决 Peer / 集群 连接问题
eureka.instance.hostname = localhost
eureka.client.serviceUrl.defaultZone = http://${eureka.instance.hostname}:${server.port}/eureka
applicaiont.properties
## 服务提供方
spring.application.name = spring-cloud-ribbon-client
### 服务端口
server.port = 8080
### 管理安全失效
management.security.enabled = false
### 暂时性关闭 Eureka 注册
## 当使用 Eureka 服务发现时,请注释掉一下配置
# eureka.client.enabled = false
## 连接 Eureka Sever
eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka/
### 服务提供方主机
serivce-provider.host = localhost
### 服务提供方端口
serivce-provider.port = 9090
serivce-provider.name = spring-cloud-service-provider
### 配置ribbon 服务地提供方
## 当使用 Eureka 服务发现时,请注释掉一下配置
# spring-cloud-service-provider.ribbon.listOfServers = \
http://${serivce-provider.host}:${serivce-provider.port}
## 服务提供方
spring.application.name=spring-cloud-service-provider
## 服务端口
server.port=9090
# 启用端点 env
management.endpoint.env.enabled=true
# 暴露端点 env 配置多个,隔开
management.endpoints.web.exposure.include=*
### 暂时性关闭 Eureka 注册
## 当使用 Eureka 服务发现时,请注释掉一下配置
#eureka.client.enabled=false
## 连接 Eureka Sever
eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka/
再启动两台服务提供方实例
--server.port=9091
--server.port=9092
实际请求客户端
- LoadBalancerClient
- RibbonLoadBalancerClient
负载均衡上下文
- LoadBalancerContext
- RibbonLoadBalancerContext
负载均衡器
- ILoadBalancer
- BaseLoadBalancer
- DynamicServerListLoadBalancer
- ZoneAwareLoadBalancer
- NoOpLoadBalancer
负载均衡规则
核心规则接口
- IRule
- 随机规则:RandomRule
- 最可用规则:BestAvailableRule
- 轮训规则:RoundRobinRule
- 重试实现:RetryRule
- 客户端配置:ClientConfigEnabledRoundRobinRule
- 可用性过滤规则:AvailabilityFilteringRule
- RT权重规则:WeightedResponseTimeRule
- 规避区域规则:ZoneAvoidanceRule
PING 策略
核心策略接口
- IPingStrategy
PING 接口
- IPing
- NoOpPing
- DummyPing
- PingConstant
- PingUrl
Discovery Client 实现
- NIWSDiscoveryPing