(三)Spring Cloud實踐:使用Netflix Ribbon實現負載均衡
阿新 • • 發佈:2018-12-21
按照前面兩篇實現模組1、模組2、模組3、模組4,基本上能夠滿足一定的 應用需求了(在訪問量不是太大的情況下)。如果我們的微服務的訪問量比較大,單臺伺服器無法滿足需求或者考慮 到IO問題,需要把微服務部署到多臺伺服器上時,就需要考慮負載均衡的問題。
Spring提供了Ribbon+restful,來實現客戶端的負載均衡。
建立模組5 ribbonservice,其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.news</groupId> <artifactId>serviceribbon</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>ribbonservice</name> <description>負載均衡</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
在application.yml中新增如下內容:
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/ #配置eureka伺服器地址
server:
port: 8091
spring:
application:
name: service-ribbon
修改RibbonserviceApplication.java的內容,如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; /** *@Description: Ribbon實現客戶端的負載均衡 *@Author: Young *@@CreateDate: */ @SpringBootApplication @EnableEurekaClient public class ServiceribbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceribbonApplication.class, args); } //在向服務中心註冊一個名為restTemplate的bean @Bean //用來指示需要做負載均衡 @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
建立HelloController.java檔案,其內容如下:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @program: springlearn * @description: rest controller * @author: Mr.Young * @create: 2018-10-25 16:52 **/ @RestController public class HelloControler { @Autowired HelloService helloService; @RequestMapping(value = "/") public String hello(){ return helloService.getHelloContent(); } @RequestMapping(value = "/configtest") public String configtest(){return helloService.getConfigTest();} }
建立HelloService.java檔案,其內容如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* @program: springlearn
* @description: 建立獲取一個獲取Hello內容的service類
* @author: Mr.Young
* @create: 2018-10-25 15:53
**/
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
public String getHelloContent() {
//CONFIG-CLIENT為註冊的微服務名稱
return restTemplate.getForObject("http://CONFIG-CLIENT/",String.class);
}
public String getConfigTest(){
return restTemplate.getForObject("http://CONFIG-CLIENT/configtest",String.class);
}
}
上述程式碼中,restTemplate.getForObject方法會通過Ribbon進行負載均衡,自動選擇一個名為config-client的服務。
可以在不同的埠啟動多個config-client微服務,然後,輸入http://localhost:8091,並不斷重新整理,可以看到會自動向各個微服務傳送請求。不再截圖了,大家自己動手試一下吧!