Springcloud(四)Ribbon实现负载均衡

1、在上一篇博客创建的客户端项目中添加测试接口,用于测试负载均衡。如下,

package com.zw.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController // 配置为controller
public class TestController {

	
	
	@Value("${server.port}") // 读取配置文件的端口
	String port;
	
	/**
	 * 设置一个方法
	 * 参数什么的 可以用HttpServletRequest  也可以用 @RequestParam
	 * 测试我就不添加了
	 * @return
	 */
	@RequestMapping(value="/test")
	public String testMethod() { 
		return "你好这里是 端口:" + port+" 的服务";
	}


}

2、对于以上的项目原封不动的复制一份出来,仅在application.yml中改变输出的端口,复制前的端口为7002,复制后,将后者改成7003。修改后现在的项目目录如下:(注意:client1和client2除了application.yml中的端口不同外,其他一摸一样,用于后续测试负载均衡)

Springcloud(四)Ribbon实现负载均衡_第1张图片

3、在父项目上,新建maven module模块(spring-cloud-ribbon),其pom依赖如下:


	4.0.0
	
		com.zw
		spring-cloud
		0.0.1-SNAPSHOT
	
	spring-cloud-client1

	
		
			org.springframework.boot
			spring-boot-starter-web
		

		
			org.springframework.cloud
			spring-cloud-starter-eureka-server
		
	

4、添加配置文件如下,端口7004

server:
  port: 7004
 
spring:
  application:
    name: spring-cloud-ribbon
    
security: 
    basic: 
        enable: true
    user: 
        name: admin
        password: 123456

#注册中心指向start    
eureka:
  client: 
    service-url: 
      defaultZone: http://${security.user.name}:${security.user.password}@127.0.0.1:7001/eureka/
#注册中心指向end

5、添加启动类,如下:

@Bean 将返回的RestTemplate对象添加到spring容器中。

@LoadBalanced 使容器中的RestTemplate对象具有负载均衡的能力。

package com.zw;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

 
@SpringBootApplication
@EnableDiscoveryClient //ribbon Client
public class RibbonMain {
    public static void main(String[] args) {
        new SpringApplicationBuilder(RibbonMain.class).web(true).run(args);
    }
    
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
	}
}

6、编写测试类如下:(调用client项目的test接口,这里注意spring-cloud-client1是配置文件中的spring.application.name,不是我们在eclipse中看到的模块名称,实际上client1和client2的配置spring.application.name是一样的,都是spring-cloud-client1)。

package com.zw.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


@RestController // 配置为controller
public class TestController {

	
	@Autowired
	RestTemplate restTemplate;
	
	@RequestMapping(value="/demo")
	public String testMethod() { 
		return restTemplate.getForObject("http://spring-cloud-client1/test", String.class);
	}

}

7、测试负载均衡

(1)、在我们的eureka中,我们可以看到如下,spring-cloud-client1具有两个节点,ribbon有一个服务节点。

Springcloud(四)Ribbon实现负载均衡_第2张图片

(2)、我们在新的浏览器输入如下接口调用地址,反复调用:

http://localhost:7004/demo

可以看到两种情况,说明ribbon项目具有负载均衡的能力。

Springcloud(四)Ribbon实现负载均衡_第3张图片

Springcloud(四)Ribbon实现负载均衡_第4张图片

8、这里我们总结一下:

实际上我们的项目模块中包括spring-cloud-eureka,spring-cloud-client1,spring-cloud-client2,spring-cloud-ribbon四个模块。

(1)、我们最先需要启动注册中心,这是cloud项目的最基层起点。

(2)、其次启动服务spring-cloud-client1,spring-cloud-client2两个模块,需要先有提供者提供服务,这两个模块在启动时候会注册到eureka中。

(3)、启动负载均衡的spring-cloud-ribbon,启动后首先也是会把他注册到eureka中,此时,我们调用服务将可以通过ribbon去调用到client服务,这样会实现负载均衡;当然也可以直接去调用对应端口的服务,但就不能均衡了。

(4)、所有其他模块都需要最先注册到eureka上,之后调用可以进行ribbon的负载均衡调用。

学海无涯苦作舟,继续前行!

你可能感兴趣的:(springcloud)