1 基礎環境準備
2 一文讀懂Eureka
3 Zookeeper註冊中心
4 Consule註冊中心
5 Ribbon
6 OpenFegin
7 Hystrix全面解析
1 Ribbon介紹
Spring Cloud Ribbon是基於 Netflix Ribbon實現的一套客戶端負載均衡的工具。簡單的說, Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟件負載均衡算法和服務調用。 Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出 Load Balancer(簡稱LB)後面所有的機器, Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨機連接等)去連接這些機器。我們很容易使用 Ribbon實現自定義的負載均衡算法。
2 LB負載均衡( Load Balance)是什麼
簡單的說就是將用戶的請求平雄的分配到多個服務上,從而達到系統的HA(高可用)。常見的負載均衡有軟件 Nginx,LVS,硬件F5等。
3 Ribbon本地負載均衡客戶端 VS Nginx服務端負載均衡區別
Nginx是服務器負載均衡,客戶端所有請求都會交給 nginx,然後由 nginx實現轉發請求。即負載均衡是由服務端實現的。Ribbon本地負載均衡,在調用微服務接口時候,會在註冊中心上獲取註冊信息服務列表之後存到JVM本地,從而在本地實現RPC遠程服務調用技術。
4 引入包
<!--eureka 客戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
5 演示
5.1 修改eureka-server
(1) 修改application.yml
server:
port: 7000
eureka:
instance:
#服務名稱
hostname: eureka-server-master
client:
serviceUrl:
#eureka註冊中心地址
defaultZone: http://localhost:7000/eureka/ #配置URL
#不註冊自己
register-with-eureka: false
#服務發現,false表示自己不從Eureka服務中獲取註冊信息
fetch-registry: false
(2) 啓動Eureka-server
5.2 修改provider-payment服務
(1) application.yml
server:
port: 9000
spring:
application:
name: provider-payment-service
datasource:
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
eureka:
client:
#是否將自己註冊到EurekaServer
register-with-eureka: true
#是否從EurekaServer獲取已有的註冊服務
fetch-registry: true
#註冊地址
service-url:
defaultZone: http://localhost:7000/eureka/
instance:
instance-id: provider-payment
prefer-ip-address: true
(2) 新建RibbonServerController
@RestController
@RequestMapping("/ribbon")
public class RibbonServerController {
@Value("${server.port}")
private String port;
@GetMapping("/server")
public String server(){
return "ribbon server port is "+port;
}
}
(3) 啓動服務
5.3 修改provider-payment-slave服務
(1) 修改application.yml
server:
port: 9001
spring:
application:
name: provider-payment-service
datasource:
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
eureka:
client:
#是否將自己註冊到EurekaServer
register-with-eureka: true
#是否從EurekaServer獲取已有的註冊服務
fetch-registry: true
#註冊地址
service-url:
defaultZone: http://localhost:7000/eureka/
instance:
instance-id: provider-payment-slave
prefer-ip-address: true
(2) 新建RibbonServerController
@RestController
@RequestMapping("/ribbon")
public class RibbonServerController {
@Value("${server.port}")
private String port;
@GetMapping("/server")
public String server(){
return "ribbon server port is "+port;
}
}
(3) 啓動服務
5.4 修改customer-order服務
(1) application.yml
server:
port: 8000
spring:
application:
name: customer-order-service
eureka:
client:
#是否將自己註冊到EurekaServer
register-with-eureka: true
#是否從EurekaServer獲取已有的註冊服務
fetch-registry: true
#註冊地址
service-url:
defaultZone: http://localhost:7000/eureka/
instance:
instance-id: order-service
prefer-ip-address: true
(2) RibbonClientController
@RestController
@RequestMapping("/ribbon")
public class RibbonClientController {
@Autowired
private RestTemplate restTemplate;
private static final String RIBBON_SERVER_URL = "http://provider-payment-service/ribbon/server";
@GetMapping("/client")
public String client() {
ResponseEntity<String> response =
restTemplate.getForEntity(RIBBON_SERVER_URL, String.class);
return response.getBody();
}
}
(3) 啓動主類
(4) 測試
6 負載均衡算法
6.1 算法介紹
RoundRobinRule(輪詢算法)
RandomRule(隨機算法)
AvailabilityFilteringRule():會先過濾由於多次訪問故障而處於斷路器跳閘狀態的服務,還有併發的連接數量超過閾值的服務,然後對剩餘的服務列表按照輪詢策略進行訪問
WeightedResponseTimeRule():根據平均響應的時間計算所有服務的權重,響應時間越快服務權重越大被選中的概率越高,剛啓動時如果統計信息不足,則使用RoundRobinRule策略,等統計信息足夠會切換到WeightedResponseTimeRule
RetryRule():先按照RoundRobinRule的策略獲取服務,如果獲取失敗則在制定時間內進行重試,獲取可用的服務。
BestAviableRule():會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務
ZoneAvoidanceRule():默認規則,符合判斷server所在區域的性能和server的可用性選擇服務器
6.2 隨機算法,修改配置文件
@Configuration
public class ApplicationConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule rule(){
return new RandomRule();
}
}
6.3 測試略
GITHUB
#分支Ribbon-enviroment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton