這篇文章主要講解了“SpringCloud使用Ribbon做負(fù)載均衡”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“SpringCloud使用Ribbon做負(fù)載均衡”吧!
在遼陽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),遼陽網(wǎng)站建設(shè)費(fèi)用合理。
負(fù)載均衡建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種廉價有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性。
負(fù)載均衡(Load Balance)其意思就是分?jǐn)偟蕉鄠€操作單元上進(jìn)行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。以上內(nèi)容來自于百度百科
個人理解而言,負(fù)載均衡,是彌補(bǔ)了單體架構(gòu)或者單個服務(wù)的負(fù)載能力不足而導(dǎo)致的整體性能瓶頸,因此,可以通過將一個服務(wù)部署多臺服務(wù)器,然后將一臺機(jī)器原來的壓力分?jǐn)偟蕉鄠€執(zhí)行單元上,這樣就提升了原有架構(gòu)的性能瓶頸??梢岳斫鉃?“將負(fù)載均衡到多個服務(wù)中”。常見的負(fù)載均衡有兩種策略:
Nginx獨(dú)立進(jìn)程做負(fù)載均衡,通過負(fù)載均衡策略,將請求轉(zhuǎn)發(fā)到不同的執(zhí)行單元上
客戶端負(fù)載均衡策略,通過在客戶端保存服務(wù)列表信息,然后自己調(diào)用負(fù)載均衡策略,分?jǐn)傉{(diào)用不同的執(zhí)行單元。
Ribbon是Netflix公司開源的一個負(fù)載均衡的組件,它屬于上述負(fù)載均衡方式中的第二種。將負(fù)載均衡的邏輯封裝在了客戶端中,并且運(yùn)行在客戶端。Ribbon經(jīng)過了非常嚴(yán)格的測試,可以更好的控制Http和Tcp客戶端的負(fù)載均衡行為。
Ribbon的負(fù)載均衡有兩種方式
和RestTemplate結(jié)合
和Feign結(jié)合
Ribbon的核心子模塊
ribbon-loadbalancer:可以獨(dú)立使用或者和其他模塊一起使用的負(fù)載均衡API
ribbon-eureka:結(jié)合Eureka作客戶端的API
ribbon-core:Ribbon的核心API
RestTemplate是SpringResource中一個訪問第三方RESTful API接口的網(wǎng)絡(luò)通訊框架。其主要方法都與REST的HTTP協(xié)議的方法緊密關(guān)聯(lián)。 RestTemplate支持常見的HTTP請求方式,例如GET、POST、PUT、DELETE等,所以RestTemplate很容易構(gòu)建RESTful API 調(diào)用方式例如
restTemplate.getForObject("http://common-service/hello", String.class)
其核心API如下
https://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/web/client/RestTemplate.html
ribbon-test父項目
pom.xml
com.calvin.ribbon ribbon-test pom 1.0-SNAPSHOT common-service eureka-server ribbon-service org.springframework.boot spring-boot-starter-parent 1.5.3.RELEASE UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-dependencies Dalston.SR4 pom import
eureka-server
pom.xml
com.calvin.ribbon ribbon-test 1.0-SNAPSHOT 4.0.0 eureka-server 1.8 org.springframework.cloud spring-cloud-starter-eureka-server org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
application.yml
server: port: 8080 eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
ServerApplication.java
@EnableEurekaServer @SpringBootApplication public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class); } }
commons-service
pom.xml
ribbon-test com.calvin.ribbon 1.0-SNAPSHOT 4.0.0 common-service org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin
application.yml
spring: application: name: common-service eureka: client: service-url: defaultZone: http://localhost:8080/eureka/
此處沒有指定server.port,是因?yàn)槲覀冊趩哟朔?wù)的是時候做點(diǎn)手腳,需要以不同端口在本地啟動, 即配置兩個Name不同的啟動類,給分別指定不同的Environment variables,內(nèi)容為server.port=8083, server.port=8084 具體教程是在Idea下的EditConfiguration中做如下操作:
CommonServiceApplication.java
@SpringBootApplication @EnableEurekaClient public class CommonServiceApplication { public static void main(String[] args) { SpringApplication.run(CommonServiceApplication.class); } }
HelloController.java
@RestController public class HelloController { @Value("${server.port}") private String port; /** * 接口測試 * @return */ @GetMapping("/hello") public String sayHello(){ return "port : " + port ; } }
ribbon-service
pom.xml
ribbon-test com.calvin.ribbon 1.0-SNAPSHOT 4.0.0 ribbon-service org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-ribbon org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
application.yml
server: port: 8082 spring: application: name: ribbon-service eureka: client: service-url: defaultZone: http://localhost:8080/eureka/
RibbonClientApplication.java
@EnableEurekaClient @SpringBootApplication public class RibbonServerApplication { public static void main(String[] args) { SpringApplication.run(RibbonServerApplication.class); } /** * 配置LoadBalance和RestTemplate * @return RestTemplate */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
接下來就是調(diào)用的關(guān)鍵代碼
RemoteCommonService.java
/** ** CommonService服務(wù)遠(yuǎn)程調(diào)用類 *
* @author Calvin * @date 2019/10/09 * @since 1.0 */ @Service public class RemoteCommonService { /** * 注入RestTemplate */ @Autowired private RestTemplate restTemplate; /** * 遠(yuǎn)程調(diào)用common-service/hello * @return */ public String sayHi(){ return restTemplate.getForObject("http://common-service/hello", String.class); } }
SayHiController.java
@RestController public class SayHiController { @Autowired private RemoteCommonService remoteCommonService; @GetMapping("hi") public String sayHi(){ return remoteCommonService.sayHi() + ", this is ribbon service"; } }
最終配置四個啟動類,如圖所示:
啟動順序:
step1. EurekaSeverApplicaton
step2. CommonServiceApplication
step3. CommonServiceApplication2
step4. RibbonServerApplication
Eureka管理界面 http://localhost:8080/
調(diào)用 http://localhost:8082/hi
刷新頁面
負(fù)載均衡的核心類是LoadBalanceClient,此類可以獲取負(fù)載均衡的服務(wù)提供者的實(shí)例信息,當(dāng)然這些實(shí)例信息是通過EurekaClient獲取的,并且緩存了一份服務(wù)實(shí)例信息。
@Autowired private LoadBalancerClient loanBalanceClient; /** * 遠(yuǎn)程調(diào)用common-service/hello * @return */ public String sayHi(){ ServiceInstance serviceInstance = loanBalanceClient.choose("common-service"); logger.info("current service info is {} : {}", serviceInstance.getHost(), serviceInstance.getPort()); return restTemplate.getForObject("http://common-service/hello", String.class); }
此時不斷刷接口,同樣可以看到LoadBalancerClient在不斷的改變請求的實(shí)例信息。
認(rèn)識了關(guān)于Ribbon以及常用負(fù)載均衡的概念
動手實(shí)踐了一下Ribbon進(jìn)行負(fù)載均衡的調(diào)用
認(rèn)識Ribbon的一個核心類
本文首次實(shí)踐Ribbon做負(fù)載均衡,缺乏原理剖析
文章中代碼相對簡單,但是基本可以表達(dá)Ribbon所做的事情
需要在以后,對整個Ribbon的源碼進(jìn)行解析(算是插眼)
關(guān)于RestTemplate還有很多用法,后續(xù)可以專門出文章進(jìn)行深入理解
感謝各位的閱讀,以上就是“SpringCloud使用Ribbon做負(fù)載均衡”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對SpringCloud使用Ribbon做負(fù)載均衡這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!