1. 程式人生 > >(三)Spring Cloud實踐:使用Netflix Ribbon實現負載均衡

(三)Spring Cloud實踐:使用Netflix Ribbon實現負載均衡

按照前面兩篇實現模組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,並不斷重新整理,可以看到會自動向各個微服務傳送請求。不再截圖了,大家自己動手試一下吧!