SpringCloud客戶端的負(fù)載均衡Ribbon的實(shí)現(xiàn)
前言:微服務(wù)架構(gòu),不可避免的存在單個(gè)微服務(wù)有多個(gè)實(shí)例,那么客戶端如何將請(qǐng)求分?jǐn)偟蕉鄠€(gè)微服務(wù)的實(shí)例上呢?這里我們就需要使用負(fù)載均衡了
一、Ribbon簡(jiǎn)介
Ribbon是Netflix發(fā)布的負(fù)載均衡器,它有助于控制HTTP和TCP客戶端的行為。為Ribbon配置服務(wù)提供者地址列表后,Ribbon就可基于某種負(fù)載均衡算法,自動(dòng)地幫助服務(wù)消費(fèi)者去請(qǐng)求。Ribbon默認(rèn)為我們提供了很多的負(fù)載均衡算法,例如:輪詢,隨機(jī)等,也可自定義;
Ribbon的GitHub: https://github.com/Netflix/ribbon
而在SpringCloud中使用Ribbon和Eureka時(shí),Ribbon會(huì)自動(dòng)從EurekaServer中獲取服務(wù)提供者地址列表,并基于負(fù)載均衡算法。
二、Ribbon實(shí)戰(zhàn)
1、創(chuàng)建EurekaServer,EurekaClient1,EurekaClient2,之前已經(jīng)說(shuō)過了Eureka的使用,這里直接上代碼:
EurekaServer:
ServerApplication.java
@SpringBootApplication
@EnableEurekaServer
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class,args);
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cn</groupId>
<artifactId>eureka-ribbon-server</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.</groupId>
<artifactId></artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 添加spring-boot的maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
server.port=8761 #注意:這兩個(gè)配置eureka默認(rèn)為true,要改成false,否則會(huì)報(bào)錯(cuò),connot connect server #表示是否將自己注冊(cè)在EurekaServer上 eureka.client.register-with-eureka=false #表示是否從EurekaServer獲取注冊(cè)信息 eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
EurekaClient1:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cn</groupId>
<artifactId>eureka-ribbon-client</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 添加spring-boot的maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
server.port=8762 spring.application.name=client-8762 eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
而在啟動(dòng)類中加入RestTemplate遠(yuǎn)程調(diào)用實(shí)例到容器中,并且 添加LoadBalanced注解,使RestTemplate具備負(fù)載均衡的能力 :
@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
/**
* @Description: 加入@LoadBalanced注解,就可以為RestTemplate加入負(fù)載均衡的能力
* @Param:
* @return:
* @Author:
* @Date: 2018/6/15
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
創(chuàng)建Controller,注入RestTemplate、LoadBalancerClient實(shí)例:
package com.cn.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
/**
* @program: springcloud-example
* @description:
* @author:
* @create: 2018-06-15 15:55
**/
@Controller
public class RibbonController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/loadInstance")
@ResponseBody
public String loadInstance() {
ServiceInstance choose = this.loadBalancerClient.choose("client-87");
System.out.println(choose.getServiceId()+":"+choose.getHost()+":"+choose.getPort());
return choose.getServiceId() + ":" + choose.getHost() + ":" + choose.getPort();
}
}
package com.cn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @program: springcloud-example
* @description:
* @author: 535504
* @create: 2018-06-15 16:05
**/
@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
EurekaClient2:
pom.xml與EurekaClient1中一致
application.xml:
server.port=8763 spring.application.name=client-87 eureka.client.service-url.defaultZone=http://localhost:8761/eureka
ClientController.java:
package com.cn.contorller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @program: springcloud-example
* @description:
* @author:
* @create: 2018-06-15 16:12
**/
@Controller
public class ClientController {
@GetMapping("/getUser")
@ResponseBody
public String getUser() {
System.out.println("獲取用戶成功");
return "獲取用戶成功";
}
}
2、啟動(dòng)順序:
①、依次啟動(dòng)EurekaServer =》 EurekaClient1 =》 EurekaClient2 ;
②、然后將EurekaClient2中的application.properties的server.port=8763改為server.port=8764,再次啟動(dòng)該項(xiàng)目;
③、打開EurekaServer的配置頁(yè)面(http://localhost:8761/),如下:

④、我們?cè)诘刂窓谳斎雋ttp://localhost:8762/loadInstance,多刷新幾次,會(huì)發(fā)現(xiàn)每次調(diào)用的端口實(shí)例都不同,如下圖:


⑤、我們?cè)诳纯刂婆_(tái),如圖:

至此,Ribbon已經(jīng)入門,是不是很簡(jiǎn)單,但是這只是最簡(jiǎn)單的應(yīng)用,九牛一毛爾...學(xué)無(wú)止境乎!
相關(guān)文章
springboot實(shí)現(xiàn)對(duì)注解的切面案例
這篇文章主要介紹了springboot實(shí)現(xiàn)對(duì)注解的切面過程,首先定義一個(gè)注解、再編寫對(duì)注解的切面只是記錄的執(zhí)行時(shí)間和打印方法,可以實(shí)現(xiàn)其他邏輯,需要的朋友可以參考一下2022-01-01
spring boot 添加admin監(jiān)控的方法
這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢
這篇文章主要介紹了Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
MyBatisPlus分頁(yè)的同時(shí)指定排序規(guī)則說(shuō)明
這篇文章主要介紹了MyBatisPlus分頁(yè)的同時(shí)指定排序規(guī)則說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-12-12
Java用BigDecimal類解決Double類型精度丟失的問題
這篇文章主要介紹了Java用BigDecimal類解決Double類型精度丟失的問題,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12
CAT分布式實(shí)時(shí)監(jiān)控系統(tǒng)使用詳解
這篇文章主要為大家介紹了CAT分布式實(shí)時(shí)監(jiān)控系統(tǒng)介紹詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

